summaryrefslogtreecommitdiffstats
path: root/private/os2/server/srvsem.c
diff options
context:
space:
mode:
Diffstat (limited to 'private/os2/server/srvsem.c')
-rw-r--r--private/os2/server/srvsem.c260
1 files changed, 260 insertions, 0 deletions
diff --git a/private/os2/server/srvsem.c b/private/os2/server/srvsem.c
new file mode 100644
index 000000000..e58f0354e
--- /dev/null
+++ b/private/os2/server/srvsem.c
@@ -0,0 +1,260 @@
+/*++
+
+Copyright (c) 1989 Microsoft Corporation
+
+Module Name:
+
+ srvsem.c
+
+Abstract:
+
+ Semaphore API
+
+Author:
+
+ Steve Wood (stevewo) 11-Oct-1989
+
+Revision History:
+
+--*/
+
+#define INCL_OS2V20_SEMAPHORES
+#define INCL_OS2V20_ERRORS
+#include "os2srv.h"
+
+//
+// These are dummy variable & dummy routine for the use of two macros
+// AcquireHandleTableLock and ReleaseHandleTableLock. In the server,
+// these macros should always work, so we set them both to NULL.
+//
+BOOLEAN Od2SigHandlingInProgress = (BOOLEAN)NULL;
+ULONG Od2ThreadId()
+{
+ return((ULONG)NULL);
+}
+
+NTSTATUS
+Os2InitializeSemaphores( VOID )
+{
+ Os2SharedSemaphoreTable =
+ Or2CreateHandleTable( Os2Heap, sizeof( OS2_SEMAPHORE ), 32 );
+
+ if (Os2SharedSemaphoreTable == NULL) {
+ return( STATUS_NO_MEMORY );
+ }
+ else {
+ return( STATUS_SUCCESS );
+ }
+}
+
+BOOLEAN
+Os2SemaphoreCreateProcedure(
+ IN POS2_SEMAPHORE Semaphore,
+ IN POS2_SEMAPHORE NewSemaphore
+ )
+{
+ if (Semaphore->Name.Length != 0) {
+ if (RtlEqualString( &Semaphore->Name, &NewSemaphore->Name, FALSE )) {
+ return( TRUE );
+ }
+ }
+
+ return( FALSE );
+}
+
+BOOLEAN
+Os2SemaphoreOpenProcedure(
+ IN POS2_SEMAPHORE Semaphore,
+ IN POS2_SEMAPHORE OpenSemaphore
+ )
+{
+ if (Semaphore->Name.Length != 0) {
+ if (RtlEqualString( &Semaphore->Name, &OpenSemaphore->Name, FALSE )) {
+ return( TRUE );
+ }
+ }
+ return( FALSE );
+}
+
+
+APIRET
+Os2ProcessSemaphoreName(
+ IN PSTRING ObjectName,
+ IN POS2_SEMAPHORE Semaphore OPTIONAL,
+ OUT PULONG ExistingHandleIndex OPTIONAL
+ )
+{
+ OS2_SEMAPHORE ExistingSemaphore;
+ PSZ src, dst;
+ USHORT n;
+ APIRET rc;
+
+ AcquireHandleTableLock( Os2SharedSemaphoreTable );
+
+ if (ARGUMENT_PRESENT( ExistingHandleIndex )) {
+ Semaphore = &ExistingSemaphore;
+ }
+
+ rc = NO_ERROR;
+ if ((n = ObjectName->Length) == 0) {
+ Semaphore->Name.Length = 0;
+ Semaphore->Name.MaximumLength = 0;
+ Semaphore->Name.Buffer = NULL;
+ }
+ else {
+ dst = RtlAllocateHeap( Os2Heap, 0, n );
+ if (dst == NULL) {
+ rc = ERROR_NOT_ENOUGH_MEMORY;
+ }
+ else {
+ src = ObjectName->Buffer;
+ Semaphore->Name.Length = n;
+ Semaphore->Name.MaximumLength = n;
+ Semaphore->Name.Buffer = dst;
+ while (n--) {
+ *dst++ = *src++;
+ }
+
+ if (Or2EnumHandleTable(
+ Os2SharedSemaphoreTable,
+ (OR2_ENUMERATE_HANDLE_ROUTINE)
+ (ARGUMENT_PRESENT( ExistingHandleIndex ) ?
+ Os2SemaphoreOpenProcedure :
+ Os2SemaphoreCreateProcedure),
+ (PVOID)Semaphore,
+ ExistingHandleIndex
+ )
+ ) {
+ if (!ARGUMENT_PRESENT( ExistingHandleIndex )) {
+ rc = ERROR_DUPLICATE_NAME;
+ }
+ }
+ else {
+ if (ARGUMENT_PRESENT( ExistingHandleIndex )) {
+ rc = ERROR_SEM_NOT_FOUND;
+ }
+ }
+
+ if (ARGUMENT_PRESENT( ExistingHandleIndex ) || rc != NO_ERROR) {
+ RtlFreeHeap( Os2Heap, 0,
+ Semaphore->Name.Buffer
+ );
+ }
+ }
+ }
+
+ return( rc );
+}
+
+
+PVOID
+Os2DestroySemaphore(
+ IN POS2_SEMAPHORE Semaphore,
+ IN ULONG HandleIndex
+ )
+{
+ PVOID Value;
+
+ Value = Semaphore->u.Value;
+
+ if (Semaphore->Name.Length != 0) {
+ RtlFreeHeap( Os2Heap, 0,
+ Semaphore->Name.Buffer
+ );
+ }
+
+ Or2DestroyHandle( Os2SharedSemaphoreTable,
+ HandleIndex
+ );
+
+ return( Value );
+}
+
+
+POS2_SEMAPHORE
+Os2ReferenceSemaphore(
+ IN POS2_SEMAPHORE Semaphore
+ )
+{
+ Semaphore->PointerCount++;
+
+ return( Semaphore );
+}
+
+
+VOID
+Os2DereferenceSemaphore(
+ IN POS2_SEMAPHORE Semaphore
+ )
+{
+ Semaphore->PointerCount--;
+
+ return;
+}
+
+
+VOID
+Os2ThreadWaitingOnSemaphore(
+ IN POS2_THREAD t,
+ IN POS2_SEMAPHORE Semaphore,
+ IN BOOLEAN AboutToWait
+ )
+{
+ if (AboutToWait) {
+ t->WaitingForSemaphore = Os2ReferenceSemaphore( Semaphore );
+ ReleaseHandleTableLock( Os2SharedSemaphoreTable );
+ }
+ else {
+ AcquireHandleTableLock( Os2SharedSemaphoreTable );
+ t->WaitingForSemaphore = NULL;
+ Os2DereferenceSemaphore( Semaphore );
+ ReleaseHandleTableLock( Os2SharedSemaphoreTable );
+ }
+}
+
+
+#if DBG
+
+VOID
+Os2SemaphoreDumpProcedure(
+ IN POS2_SEMAPHORE Semaphore,
+ IN ULONG HandleIndex,
+ IN PVOID DumpParameter
+ )
+{
+ UNREFERENCED_PARAMETER(DumpParameter);
+ DbgPrint( " %3ld %2ld %4ld %4ld %8lx %.*s\n",
+ HandleIndex,
+ (ULONG)Semaphore->Type,
+ (ULONG)Semaphore->OpenCount,
+ (ULONG)Semaphore->PointerCount,
+ (ULONG)Semaphore->u.Value,
+ Semaphore->Name.Length,
+ Semaphore->Name.Buffer
+ );
+ return;
+}
+
+VOID
+Os2DumpSemaphoreTable(
+ IN PCHAR Title
+ )
+{
+ ULONG n;
+
+ if (Os2SharedSemaphoreTable->CountEntries >
+ Os2SharedSemaphoreTable->CountFreeEntries
+ ) {
+ DbgPrint( "\nDump Of OS/2 Server Shared Semaphore Table: %s\n", Title );
+ DbgPrint( "Index Type Ocnt Pcnt Value Name\n" );
+ n = Or2DumpHandleTable(
+ Os2SharedSemaphoreTable,
+ (OR2_DUMP_HANDLE_ROUTINE)Os2SemaphoreDumpProcedure,
+ NULL
+ );
+
+ DbgPrint( "Total number of valid shared semaphores: %ld\n", n );
+ }
+}
+
+#endif // DBG