The Question is:
Assume that another process than my current process has qeued a lock, and this
lock has been granted by the lock manager.
The other process is not doing its housekeeping and lets the lock standing.
I would like to clean up from my process and dequeue the lock using the $DEQ
I have read the text in the system service user manual and in the vms
programming concepts manual and I find it somewhat confusing.
The text says that only not granted locks can be dequeued by $DEQ, and a bit
further on that all locks will be dequeued by $DEQ.
Anyway, I tried retrieved the LOCKID through $GETLKI Service and tried to
dequeue it with $DEQ. (see above Code snippet). The service terminates with
%IVLOCKID, invalid lock ID.
Do I have to convert the lock first to another state before I can dequeue it,
or is it not possible to dequeue a granted lock from another Process? I tried
the $DEQ Call with no Flags, and with Flag LCK$M_DEQALL and without Flags.
The Answer is :
The OpenVMS distributed lock manager (DLM) requires (and assumes)
cooperative processing -- only through cooperation can the DLM provide
process coordination. Applications simply do not expect that (granted)
locks will be grabbed out from underneath the application, nor that the
(granted) locks will be arbitrarily overridden -- this "anti-social"
locking behaviour would obviously risk data corruptions, of course.
The lock manager system services $enq, $enqw, $deq, and $deqw act (only)
upon locks held by or requests queued by the local process. The grant
of, release of, or the queuing of a request for a particular lock resource
name is visible to all other (cooperating) processes in the cluster, of
To act upon the locks held by another (and recalcitrant, in this case)
process, you will want to delete the process (which will trigger the
release of all locks held by that process during the process rundown
operations), or you will need to request the cooperation of the process
(via locks, via blocking locks, or via other inter-process communications
mechanisms), or you will need to rework the application code that is
operating in the target process.
The easiest approach involves the use STOP or $delprc on the target
process and (in the longer term) fixing the code, in other words.
Related topics include (318), (2027), (2373), (3079), (3169), (3320).
(3498), (5870), (6643), (6984)
Other related topics include (2681) and (5199) may be of interest, and
some general programming tips for asynchronous programming are in topic
(1661). Details of achieving thread-reentrancy and the associated
locking are referenced in topics (4647) and (6099).
The OpenVMS Wizard here deliberately ignores the possibilities of
releasing the lock through an inter-process inner-mode AST -- this
approach requires extensive knowledge of the OpenVMS operating system
kernel, and certainly risks crashing the OpenVMS system during testing
Various updates to the OpenVMS Programming Concept materials have been
completed in recent releases, and additional changes are underway.
Specific suggestions or confusions should be forwarded directly to
the OpenVMS Documentation team via the mail address in the preface.