        title   "Deferred notifications"
.486p
        .xlist
include ks386.inc
include callconv.inc
        .list

_TEXT   SEGMENT PARA PUBLIC 'CODE'
        ASSUME  DS:FLAT, ES:FLAT, SS:NOTHING, FS:NOTHING, GS:NOTHING

        page , 132
        subttl  "Deferred notifications"

        extrn   _g_ppdfnNext:DWORD
        extrn   _g_pdfnFirst:DWORD
        extrn   _ProcessDeferredNotifications@4:near

;++
;
; QueueDfn
;
; Queue a deferred notification on the global queue
;
;--

cPublicProc _QueueDfn, 1
cPublicFpo 0,0
        mov     eax, [esp+4]
        pushfd
        cli

; put this guy on the tail of the list
        mov     ecx, _g_ppdfnNext
        mov     [ecx], eax
        mov     _g_ppdfnNext, eax

        popfd
        ret     4

stdENDP _QueueDfn

cPublicProc _ProcessDfns, 0
cPublicFpo 0,0
        push    ebp
        mov     ebp, esp
        pushfd
        cli

; first, null-terminate the list
        xor     ecx, ecx
        mov     eax, _g_ppdfnNext
        mov     [eax], ecx

; figure out what work we're going to do
        mov     eax, _g_pdfnFirst
        push    eax

; now reset the list
        lea     eax, _g_pdfnFirst
        mov     _g_ppdfnNext, eax

; now we're ready to do the notifications
        sti
        call    _ProcessDeferredNotifications@4

; and we're done
        popfd
        mov     esp, ebp
        pop     ebp
        ret

stdENDP _ProcessDfns

_TEXT   ends
        end
