title "Resource package x86 optimzations" ;++ ; ;Copyright (c) 1991 Microsoft Corporation ; ;Module Name: ; ; resoura.asm ; ;Abstract: ; ; Optimized preambles for some HOT resource code paths. ; ; Takes first crack at satisfying the ExResource API, if it ; can't it passes it onto the full blown API. ; ; Optimized for UP free builds only! ; ;Author: ; ; Ken Reneris (kenr) 13-Jan-1992 ; ;Revision History: ; ;-- .386p include ks386.inc include callconv.inc ; calling convention macros include mac386.inc EXTRNP _ExpReleaseResourceForThread,2 ExculsiveWaiter equ 1 ; From ddkresrc.c SharedWaiter equ 2 ; From ddkresrc.c AnyWaiter equ (ExculsiveWaiter+SharedWaiter) _TEXT$00 SEGMENT PARA PUBLIC 'CODE' ASSUME DS:FLAT, ES:FLAT, SS:NOTHING, FS:NOTHING, GS:NOTHING ifdef NT_UP ife DBG ;++ ; ; VOID ; ExReleaseResourceForThread( ; IN PNTDDK_ERESOURCE Resource, ; IN ERESOURCE_THREAD OurThread ; ) ; ; ; Routine Description: ; ; This routine release the input resource the indcated thread. The ; resource can have been acquired for either shared or exclusive access. ; ; Arguments: ; ; Resource - Supplies the resource to release ; ; Thread - Supplies the thread that originally acquired the resource ; ; Return Value: ; ; None. ; ;-- cPublicProc _ExReleaseResourceForThread,2 cPublicFpo 2,0 mov ecx, [esp+4] ; resource mov eax, [esp+8] ; our thread cli test byte ptr [ecx].RsFlag, AnyWaiter ; any waiter? jnz short rrt_longway_ddk ; yes, go long test byte ptr [ecx].RsFlag, RsOwnedExclusive ; exclusive? jz short rrt_longway_ddk ; bad release, go abort mov edx, [ecx].RsOwnerThreads ; (edx) = ownerthread table cmp [edx], eax ; our thread at table[0]? jne short rrt_longway_ddk ; bad release, go abort mov eax, [ecx].RsOwnerCounts dec byte ptr [eax] ; thread count -= 1 jnz short rrt_exit_ddk ; if not zero, all done mov dword ptr [edx], 0 ; clear thread table[0] dec word ptr [ecx].RsActiveCount ; resource count -= 1 and byte ptr [ecx].RsFlag, not RsOwnedExclusive rrt_exit_ddk: sti stdRET _ExReleaseResourceForThread rrt_longway_ddk: sti jmp _ExpReleaseResourceForThread@8 stdENDP _ExReleaseResourceForThread endif endif _TEXT$00 ends end