[Info-vax] Returning data from Cobol AST routine.
Jan-Erik Söderholm
jan-erik.soderholm at telia.com
Tue Sep 21 17:06:42 EDT 2021
Den 2021-09-21 kl. 18:45, skrev Stephen Hoffman:
> On 2021-09-20 22:55:02 +0000, Jan-Erik Sderholm said:
>
>> The idea is to have an AST routine that will read from a mailbox when
>> something is written to it. My idea was that the read of the mailbox
>> would be using an AST to avoid polling the mailbox.
>
> In no particular order...
>
> Start with chapters 6 and 8 in the first VSI Programming Concepts Manual.
> Memory sync and AST operations details.
>
> All data shared between mainline and AST must be atomic-accessed, or must
> be protected by atomic operations, or some other locking.
I thought of not re-queing the QIO until the current data had been
processed. That way there will not be any new AST until the whole
appliation is ready for that, right?
>
> The AST can arrive between pretty much any two hardware instructions within
> any code sequence, or is best assumed to arrive at the least opportune
> moment. Including within an unaligned variable read, or within a multi-part
> update operation such as an un-interlocked queue update.
>
My thought was to only queue an QIO when I know the application is ready.
> Interlocked bitflags or interlocked queues are commonly used to avoid these
> races. There are other ways too, though these interlocked operations tend
> to be fast and fairly lightweight. These were VAX hardware instructions,
> and are now available as C built-ins and as LIBRTL calls. Calls to $SETAST
> can be used to brute-force block AST activity.
>
> For cases processing async I/O such as this, an app design maintaining a
> set of two or sometimes three queues is fairly common. The mainline
> hibernates, if it doesn't have something to do. One queue pre-populated at
> startup and used as a free list of data structures available for use, one
> queue of data structures from mainline to AST, and one for structures AST
> to mainline. The interlocked queues avoid issues with variable tearing, and
> with race conditions. The structures can also contain the IOSB, the data
> buffer, the interlocked queue headers, and whatever other data is required.
>
> Make the number of buffers pre-allocated programmable, and add some
> instrumentation for when the free list is exhausted. It's absolutely
> possible to dynamically add some structures when the freel queue s empty,
> at the cost of some added complexity.
>
> Use two unidirectional mailboxes whenever mailbox message traffic is
> bidirectional. One reader, one or more writers, for each of the two
> mailboxes. Don't try to multiplex a mailbox. That way leads to gnarly.
>
> Always have a scheduled timer AST or (locally preferable) have a scheduled
> wakeup call operating in the background, triggering a routine that
> processes the queues every ten or thirty or minute, on the off chance an
> AST or event flag gets lost somewhere. This happens more often than any of
> us would prefer, and the scheduled wakeup. This so that the AST issues a
> $wake, and the mainline loops and does its processing and eventually issues
> a $hiber when the work-pending queue is empty. Once started, the mainline
> initializes the queues and queues the ASTs, then hibernates. The ASTs
> arrive as the I/O completions arrive, and each can trigger a wakeup call
> and can shuffle buffers among the interlocked queues and can also re-queue
> the I/O operation for the next I/O operation. And the scheduled wakeup call
> masks any lost wakeup calls, at minimal cost. (Wakes are coalesced into
> one, and I've worked with a few app designs where a wake was occasionally
> lost.)
>
> For a few of these app cases I've used global sections for app control,
> sometimes lock manager doorbell locks, sometimes controlled activity
> through signals, sometimes a management mailbox pair, and it's often
> possible to pass management commands into the app through the mailbox.
>
Most of the above I do not understand. But keep it in mind if there
is some scenario where it seems to fit in.
> Protect the mailboxes against unauthorized access correctly, and there can
> be protocol design cases where looking at the PID of the message sender can
> be necessary.
All access to the mailbox (both "ends") are from our own code.
>
> You will want to consider including some sort of a protocol version within
> the mailbox message traffic too, as that can makes message protocol
> upgrades a whole lot easier.
Good idea.
>
> These app designs pretty quickly become state machines, too. It can be
> easier to start out with interlocked queues and state machine than to try
> to retrofit this. This having retrofit more than a few state machines into
> apps that got way too gnarly.
>
> If there's any chance the other end of the connection is untrusted, parsing
> gets vastly more difficult.
All access to the mailbox (both "ends") are from our own code.
>
> COBOL will be more involved, as it doesn't do pointers at all well, and the
> designs I tend to use are rather more dynamic.
>
Good for you. Our application build environment is Cobol based.
More information about the Info-vax
mailing list