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