111 lines
2.6 KiB
NASM
111 lines
2.6 KiB
NASM
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
|