Copy msimg32
[reactos.git] / reactos / ntoskrnl / io / remlock.c
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * FILE: ntoskrnl/io/pnpmgr/remlock.c
5 * PURPOSE: Remove Lock functions
6 * PROGRAMMER: Filip Navara (xnavara@volny.cz)
7 * UPDATE HISTORY:
8 * 22/09/2003 FiN Created
9 */
10
11 /* INCLUDES ******************************************************************/
12
13 #include <ntoskrnl.h>
14 #include <internal/debug.h>
15
16 /* FUNCTIONS *****************************************************************/
17
18 /*
19 * @implemented
20 */
21 VOID
22 STDCALL
23 IoInitializeRemoveLockEx(
24 IN PIO_REMOVE_LOCK RemoveLock,
25 IN ULONG AllocateTag,
26 IN ULONG MaxLockedMinutes,
27 IN ULONG HighWatermark,
28 IN ULONG RemlockSize)
29 {
30 DPRINT("IoInitializeRemoveLockEx called");
31 RtlZeroMemory(RemoveLock, RemlockSize);
32 RemoveLock->Common.IoCount = 1;
33 KeInitializeEvent(&RemoveLock->Common.RemoveEvent, NotificationEvent, FALSE);
34 }
35
36 /*
37 * @implemented
38 */
39 NTSTATUS
40 STDCALL
41 IoAcquireRemoveLockEx(
42 IN PIO_REMOVE_LOCK RemoveLock,
43 IN OPTIONAL PVOID Tag,
44 IN LPCSTR File,
45 IN ULONG Line,
46 IN ULONG RemlockSize)
47 {
48 DPRINT("IoAcquireRemoveLockEx called");
49 InterlockedIncrement(&RemoveLock->Common.IoCount);
50 if (RemoveLock->Common.Removed)
51 {
52 if (InterlockedDecrement(&RemoveLock->Common.IoCount) == 0)
53 {
54 KeSetEvent(&RemoveLock->Common.RemoveEvent, IO_NO_INCREMENT, FALSE);
55 }
56 return STATUS_DELETE_PENDING;
57 }
58 return STATUS_SUCCESS;
59 }
60
61 /*
62 * @implemented
63 */
64 VOID
65 STDCALL
66 IoReleaseRemoveLockEx(
67 IN PIO_REMOVE_LOCK RemoveLock,
68 IN PVOID Tag,
69 IN ULONG RemlockSize)
70 {
71 LONG IoCount;
72
73 DPRINT("IoReleaseRemoveLockEx called");
74 IoCount = InterlockedDecrement(&RemoveLock->Common.IoCount);
75 if (IoCount == 0)
76 {
77 KeSetEvent(&RemoveLock->Common.RemoveEvent, IO_NO_INCREMENT, FALSE);
78 }
79 }
80
81 /*
82 * @implemented
83 */
84 VOID
85 STDCALL
86 IoReleaseRemoveLockAndWaitEx(
87 IN PIO_REMOVE_LOCK RemoveLock,
88 IN PVOID Tag,
89 IN ULONG RemlockSize)
90 {
91 DPRINT("IoReleaseRemoveLockAndWaitEx called");
92 RemoveLock->Common.Removed = TRUE;
93 InterlockedDecrement(&RemoveLock->Common.IoCount);
94 IoReleaseRemoveLockEx(RemoveLock, Tag, RemlockSize);
95 KeWaitForSingleObject(&RemoveLock->Common.RemoveEvent, Executive, KernelMode,
96 FALSE, NULL);
97 }
98
99 /* EOF */