Cancelling Events

Services whose names are of the form Cancel_XX_Event must be used only to cancel events scheduled by the corresponding Schedule_XX_Event or Call_XX_Event service. It is an error to pass (for example) a thread event handle to Cancel_VM_Event.

Services which cancel events also allow zero to be passed as the event handle, which is simply ignored. The standard paradigm for scheduling, processing, and cancelling events is as follows:

Scheduling the event:


mov         esi, OFFSET32 MyEvent
VMMcall Schedule_Global_Event
mov     hMyEvent, esi            ; Save handle for cancellation

Processing the event:


BeginProc MyEvent
mov     hMyEvent, 0   ; VERY FIRST THING is
                      ; to zero out the handle
;   .
;   .                   Do other event stuff
;   .
ret                   ; Finished with the event
EndProc MyEvent

Cancelling the event:


xor      esi, esi             ; Atomically set hMyEvent to 0
xchg     hMyEvent, esi        ; and retrieve previous value
VMMcall  Cancel_Global_Event  ; Cancel if still outstanding