The Question is:
I use the LIB$INS... and LIB$REM... queue
routines both for queues and stacks. Sometimes I
have a need to insert, remove or just examine an
entry at other locations than the head or tail.
Is there a recommended way to do that? This must
be an issue also with the OpenVMS timer and AST
queues assuming that these queues are
implemented using these routines (except for the
wrapper). One way I can think of to for exmaple
remove an entry in the middle is to remove head
and insert as tail to a temporary work queue
until the entry is encountered. And after
removing the entry then reattach the temporary
work queue using the tail of that queue and the
head of the remaining queue as routine
arguments. Another way is maybe to not use a
temporary work queue but instead insert a marker
entry as tail and then remove head and insert as
tail in the same queue until the entry is
encountered. And after removing the entry then
continue removing head and inserting as tail
until the marker is encountered and removed but
not inserted (obviously). This approach is
though more wasteful.
Thank you very much.
The Answer is :
As you are undoubtedly aware, the interlocked queue operations
use hardware- (VAX) or PALcode-assisted (Alpha) interlocks that
are located in the queue header data structure.
There are no general guidelines for using these interlocked
queue operations away from the header, other than the obvious
requirement that the access to the located entries within the
queue -- entries that are not adjacent to the queue header --
and any necessary queue entry traversals involved in this
access be fully interlocked against any conflicting access.
To ensure that the operations are reentrant for threading or
for AST activites, in other words.
The most appropriate solution depends on the application.
Specific details of the implementation of the interlocked
operations and of reentrancy are in the OpenVMS programming
concepts and in the Alpha Architecture Reference Manual, and
topics (2681) and (5199) may be of interest. Some general
programming tips for asynchronous programming are in topic
(1661). Details of achieving thread-reentrancy and the
associated locking are in the DECthreads documentation.