Output from .MO appears tabular for with one of the following headings:
hob va flgs own hmte sown,cnt lt st xf 0004 %fff13238 8000 ffe1 0000 0000 00 00 00 00 vmah 0006 %fff0a891 8000 ffa6 0000 0000 00 00 00 00 mte doscalls.dll hob pob har hobnxt flgs own hmte sown,cnt lt st xf 0003 %fec80040 0003 fec8 0000 ffec 0000 0000 00 01 00 00 0004 %fec80050 %fff13238 8000 ffe1 0000 0000 00 00 00 00 hob har hobnxt flgs own hmte sown,cnt lt st xf 0001 0001 fec8 0000 fff1 0000 0000 00 00 00 00 vmob 0002 0002 fec8 0000 ffe3 0000 0000 00 00 00 00 vmar
Each of the heading fields has the following meaning:
hob
The following flags are defined:
┌───────────────┬───────┬────────────────────────────────────────┐ │Name │Bit │Description │ │ │Mask │ │ ├───────────────┼───────┼────────────────────────────────────────┤ │OB_PSEUDO │0x8000 │Pseudo-object │ ├───────────────┼───────┼────────────────────────────────────────┤ │OB_API │0x4000 │API located object │ ├───────────────┼───────┼────────────────────────────────────────┤ │OB_LOCKWAIT │0x2000 │Waiting for a lock conflict to resolve │ ├───────────────┼───────┼────────────────────────────────────────┤ │OB_LALIAS │0x1000 │Object has aliases │ ├───────────────┼───────┼────────────────────────────────────────┤ │OB_SHARED │0x0800 │Object's contents are shared │ ├───────────────┼───────┼────────────────────────────────────────┤ │OB_UVIRT │0x0400 │UVirt object │ ├───────────────┼───────┼────────────────────────────────────────┤ │OB_ZEROINIT │0x0200 │Object is zero-initialised │ ├───────────────┼───────┼────────────────────────────────────────┤ │OB_RESIDENT │0x0100 │Initial allocation was resident │ ├───────────────┼───────┼────────────────────────────────────────┤ │OB_LOWMEM │0x0040 │Object is in low memory │ ├───────────────┼───────┼────────────────────────────────────────┤ │OB_GUARD │0x0080 │Guard page attribute │ ├───────────────┼───────┼────────────────────────────────────────┤ │OB_EXEC │0x0020 │Executable attribute │ ├───────────────┼───────┼────────────────────────────────────────┤ │OB_READ │0x0010 │Readable attribute │ ├───────────────┼───────┼────────────────────────────────────────┤ │OB_USER │0x0008 │User attribute │ ├───────────────┼───────┼────────────────────────────────────────┤ │OB_WRITE │0x0004 │Writeable attribute │ ├───────────────┼───────┼────────────────────────────────────────┤ │OB_HUGE │0x0002 │Object is huge │ ├───────────────┼───────┼────────────────────────────────────────┤ │OB_SHRINKABLE │0x0001 │Object is Shrinkable (only if also │ │ │ │OB_SHARED) │ ├───────────────┼───────┼────────────────────────────────────────┤ │OB_DHSETMEM │0x0001 │DevHlp_VMSetMems are allowed the object │ └───────────────┴───────┴────────────────────────────────────────┘
Notes:
See Pseudo-Objects when OB_PSEUDO is set.
OB_API is set as a result of allocation made by some APIs (for example, DosExecPgm). It forces page alignment and signals a likelihood of long-term locking.
OB_HUGE is set when the object is created by DosAllocHuge API.
When OB_LOCKWAIT is set then the thread has detected a lock request conflict and wishes to wait for the conflict to resolve. The conflict occurs because a contiguous storage lock has been requested but cannot be satisfied because one or more of the pages are already short-term locked. If the current request is for a short-term lock then the thread will wait up to 10 seconds for the conflict to clear. If the time-out expires then the current short-term lock request ends in error and the following message appears on the debugger screen:
VMLOCK: Short term lock for > 10 secs: hob=hob
If the current request is for a long-term lock then the thread will wait indefinitely. In both cases the block Id the thread waits on is the address of the VMOB flag word (VMOB+0x4). See .PB command for information on thread slots waiting on Block Ids. own
The low order bit of cnt is used as a wait indicator. The high order 7 bits are a count of the number of times the owning thread has requested the VMOB semaphore without releasing it. See sown filed above for related information.
The following flags are defined:
┌────────────────┬─────┬────────────────────────────────────────┐ │name │bit │description │ │ │mask │ │ ├────────────────┼─────┼────────────────────────────────────────┤ │VMOB_SLOCK_WAIT │0x01 │Waiting on short term locks to clear │ ├────────────────┼─────┼────────────────────────────────────────┤ │VMOB_LLOCK_WAIT │0x02 │Waiting on long term locks to clear │ ├────────────────┼─────┼────────────────────────────────────────┤ │VMOB_DISC_SEG │0x04 │Object is part of a discardable seg │ ├────────────────┼─────┼────────────────────────────────────────┤ │VMOB_HIGHMEM │0x08 │Object was allocated via dh_vmalloc │ │ │ │using the VMDHA_USEHIGHMEM flag │ └────────────────┴─────┴────────────────────────────────────────┘
Notes:
The lock wait flags indicate that a thread is waiting for locked pages in the memory object to be unlocked, but not to resolve a conflicting lock request: that is indicated with the OB_LOCKWAIT flag.
If a thread blocks waiting for long-term locks to clear then the address of the long-term lock count (VMOB + 0xd) is used as the Block-Id the thread blocks on. The thread blocks indefinitely.
If a thread blocks waiting for short-term locks to clear then the address of the short-term lock count (VMOB + 0xe) is used as the Block-Id the thread blocks on. The thread will block for up to 10 seconds. If after that time the short-term lock has not been cleared then an error is returned and under the debug kernel the following message is sent to the debug console:
VMLOCK: Short term lock for > 10 secs: hob=hob
See .PB command for information on thread slots waiting on Block Ids.
Process owned objects
Note: From fix pack 29 of Warp 3.0 and GA Warp 4.0 the hmte of all objects with a system owner id is also formatted in the user part of the description.