The M Lock Utility (LKE) is a tool for examining and changing the GT.M LOCK environment. For a description of M LOCKs, refer to the LOCKs section in the General Language Features of M chapter and the description of the LOCK command in the Commands chapter of the GT.M Programmer's Guide.
The two primary functions of the M Lock Utility (LKE) are:
SHOW all or specified LOCKs currently active
CLEAR
all or specified LOCKs currently active
When debugging an M application, you may use LKE to identify a possible deadlock situation, that is, two or more processes have LOCKs and are waiting to add resource names LOCKed by the other(s).
Process 1 Process 2 LOCK A LOCK B LOCK +A LOCK +B
Process 1 has A LOCKed and attempts to LOCK B. Process 2 has B LOCKed and attempts to LOCK A. Because these processes do not release their current LOCKs before adding additional LOCKs, nor do they provide a timeout to detect the problem, they are deadlocked. Neither process can proceed normally. You can use LKE to release one of the LOCKs so both processes may execute. However, because releasing a LOCK may cause the process to violate its design assumptions, terminating one process is generally a safer way to break the deadlock.
![]() | Note |
---|---|
When a process leaves M, GT.M normally releases any LOCKs or ZALLOCATEs held by that process. If a GT.M process terminates abnormally, or if the system "crashes" while a GT.M process is active, GT.M cannot perform normal clean-up. However, as soon as any other process waits several seconds for a LOCK owned by a process that no longer exists, GT.M automatically clears the "orphaned" LOCK. |
LKE requires that the environment variable gtmgbldir be defined.
$gtm_dist/lke LKE>
![]() | Important |
---|---|
Always run LKE on the node where the lock is held. |
$gtm_dist/lke show -all
This command displays all current LOCKs and then returns to the shell prompt.
$gtm_dist/lke show -lock="^Account(\"Name\")" $gtm_dist/lke show -lock='^Account("Name")'
Both these commands display the status of LOCK ^Account("Name") in the default region.