3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: ntoskrnl/io/remlock.c
6 * PURPOSE: Remove Lock functions
8 * PROGRAMMERS: Filip Navara (xnavara@volny.cz)
11 /* INCLUDES ******************************************************************/
15 #include <internal/debug.h>
17 /* FUNCTIONS *****************************************************************/
24 IoInitializeRemoveLockEx(
25 IN PIO_REMOVE_LOCK RemoveLock
,
27 IN ULONG MaxLockedMinutes
,
28 IN ULONG HighWatermark
,
31 DPRINT("IoInitializeRemoveLockEx called\n");
32 RtlZeroMemory(RemoveLock
, RemlockSize
);
33 RemoveLock
->Common
.IoCount
= 1;
34 KeInitializeEvent(&RemoveLock
->Common
.RemoveEvent
, NotificationEvent
, FALSE
);
42 IoAcquireRemoveLockEx(
43 IN PIO_REMOVE_LOCK RemoveLock
,
44 IN OPTIONAL PVOID Tag
,
49 DPRINT("IoAcquireRemoveLockEx called\n");
50 InterlockedIncrement(&RemoveLock
->Common
.IoCount
);
51 if (RemoveLock
->Common
.Removed
)
53 if (InterlockedDecrement(&RemoveLock
->Common
.IoCount
) == 0)
55 KeSetEvent(&RemoveLock
->Common
.RemoveEvent
, IO_NO_INCREMENT
, FALSE
);
57 return STATUS_DELETE_PENDING
;
59 return STATUS_SUCCESS
;
67 IoReleaseRemoveLockEx(
68 IN PIO_REMOVE_LOCK RemoveLock
,
74 DPRINT("IoReleaseRemoveLockEx called\n");
75 IoCount
= InterlockedDecrement(&RemoveLock
->Common
.IoCount
);
78 KeSetEvent(&RemoveLock
->Common
.RemoveEvent
, IO_NO_INCREMENT
, FALSE
);
87 IoReleaseRemoveLockAndWaitEx(
88 IN PIO_REMOVE_LOCK RemoveLock
,
92 DPRINT("IoReleaseRemoveLockAndWaitEx called\n");
93 RemoveLock
->Common
.Removed
= TRUE
;
94 InterlockedDecrement(&RemoveLock
->Common
.IoCount
);
95 IoReleaseRemoveLockEx(RemoveLock
, Tag
, RemlockSize
);
96 KeWaitForSingleObject(&RemoveLock
->Common
.RemoveEvent
, Executive
, KernelMode
,