Standardize comment headers. Patch by Trevor McCort
[reactos.git] / reactos / ntoskrnl / ps / cid.c
1 /* $Id$
2 *
3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: ntoskrnl/ps/cid.c
6 * PURPOSE: Client ID (CID) management
7 *
8 * PROGRAMMERS: Thomas Weidenmueller <w3seek@reactos.com>
9 */
10
11 /* INCLUDES ******************************************************************/
12
13 #include <ntoskrnl.h>
14 #define NDEBUG
15 #include <internal/debug.h>
16
17 /* GLOBALS ******************************************************************/
18
19 /*
20 * FIXME - use a global handle table instead!
21 */
22
23 KSPIN_LOCK CidLock;
24 LIST_ENTRY CidHead;
25 KEVENT CidReleaseEvent;
26 LONG CidCounter = 0;
27 LARGE_INTEGER ShortDelay, LongDelay;
28
29 #define TAG_CIDOBJECT TAG('C', 'I', 'D', 'O')
30
31 /* FUNCTIONS *****************************************************************/
32
33 VOID INIT_FUNCTION
34 PsInitClientIDManagment(VOID)
35 {
36 InitializeListHead(&CidHead);
37 KeInitializeSpinLock(&CidLock);
38 KeInitializeEvent(&CidReleaseEvent, SynchronizationEvent, FALSE);
39 ShortDelay.QuadPart = -100LL;
40 LongDelay.QuadPart = -100000LL;
41 }
42
43 VOID
44 PspReferenceCidObject(PCID_OBJECT Object)
45 {
46 InterlockedIncrement(&Object->ref);
47 }
48
49 VOID
50 PspDereferenceCidObject(PCID_OBJECT Object)
51 {
52 if(InterlockedDecrement(&Object->ref) == 0)
53 {
54 ExFreePool(Object);
55 }
56 }
57
58 NTSTATUS
59 PsCreateCidHandle(PVOID Object, POBJECT_TYPE ObjectType, PHANDLE Handle)
60 {
61 KIRQL oldIrql;
62 PCID_OBJECT cido = ExAllocatePoolWithTag(NonPagedPool,
63 sizeof(CID_OBJECT),
64 TAG_CIDOBJECT);
65 if(cido != NULL)
66 {
67 cido->ref = 1;
68 ExInitializeFastMutex(&cido->Lock);
69 cido->Obj.Object = Object;
70
71 KeAcquireSpinLock(&CidLock, &oldIrql);
72 cido->Handle = (HANDLE)((ULONG_PTR)(++CidCounter) << 2);
73 InsertTailList(&CidHead, &cido->Entry);
74 KeReleaseSpinLock(&CidLock, oldIrql);
75
76 *Handle = cido->Handle;
77 return STATUS_SUCCESS;
78 }
79
80 return STATUS_INSUFFICIENT_RESOURCES;
81 }
82
83 NTSTATUS
84 PsDeleteCidHandle(HANDLE CidHandle, POBJECT_TYPE ObjectType)
85 {
86 PCID_OBJECT cido, Found = NULL;
87 PLIST_ENTRY Current;
88 KIRQL oldIrql;
89
90 if(CidHandle == NULL)
91 {
92 return STATUS_INVALID_PARAMETER;
93 }
94
95 KeAcquireSpinLock(&CidLock, &oldIrql);
96 Current = CidHead.Flink;
97 while(Current != &CidHead)
98 {
99 cido = CONTAINING_RECORD(Current, CID_OBJECT, Entry);
100 if(cido->Handle == CidHandle)
101 {
102 RemoveEntryList(&cido->Entry);
103 cido->Handle = NULL;
104 Found = cido;
105 break;
106 }
107 Current = Current->Flink;
108 }
109 KeReleaseSpinLock(&CidLock, oldIrql);
110
111 if(Found != NULL)
112 {
113 PspDereferenceCidObject(Found);
114 return STATUS_SUCCESS;
115 }
116
117 return STATUS_UNSUCCESSFUL;
118 }
119
120 PCID_OBJECT
121 PsLockCidHandle(HANDLE CidHandle, POBJECT_TYPE ObjectType)
122 {
123 PCID_OBJECT cido, Found = NULL;
124 PLIST_ENTRY Current;
125 KIRQL oldIrql;
126
127 if(CidHandle == NULL)
128 {
129 return NULL;
130 }
131
132 KeAcquireSpinLock(&CidLock, &oldIrql);
133 Current = CidHead.Flink;
134 while(Current != &CidHead)
135 {
136 cido = CONTAINING_RECORD(Current, CID_OBJECT, Entry);
137 if(cido->Handle == CidHandle)
138 {
139 Found = cido;
140 PspReferenceCidObject(Found);
141 break;
142 }
143 Current = Current->Flink;
144 }
145 KeReleaseSpinLock(&CidLock, oldIrql);
146
147 if(Found != NULL)
148 {
149 ExAcquireFastMutex(&Found->Lock);
150 }
151
152 return Found;
153 }
154
155 VOID
156 PsUnlockCidObject(PCID_OBJECT CidObject)
157 {
158 ExReleaseFastMutex(&CidObject->Lock);
159 PspDereferenceCidObject(CidObject);
160 }
161
162 /* EOF */