mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
159 lines
4.1 KiB
159 lines
4.1 KiB
/*++
|
|
|
|
Copyright (c) 1989 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
srvmutex.c
|
|
|
|
Abstract:
|
|
|
|
This module implements the OS/2 V2.0 Shared Mutex Semaphore API Calls.
|
|
|
|
Author:
|
|
|
|
Steve Wood (stevewo) 07-Feb-1990
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#define INCL_OS2V20_SEMAPHORES
|
|
#define INCL_OS2V20_ERRORS
|
|
#include "os2srv.h"
|
|
|
|
BOOLEAN
|
|
Os2DosCreateMutexSem(
|
|
IN POS2_THREAD t,
|
|
IN POS2_API_MSG m
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
POS2_DOSCREATEMUTEXSEM_MSG a = &m->u.DosCreateMutexSem;
|
|
OS2_SEMAPHORE Semaphore;
|
|
APIRET rc;
|
|
|
|
Semaphore.PointerCount = 0;
|
|
Semaphore.OpenCount = 1;
|
|
Semaphore.Type = Os2MutexSem;
|
|
|
|
Status = NtDuplicateObject( t->Process->ProcessHandle,
|
|
a->NtMutantHandle,
|
|
NtCurrentProcess(),
|
|
&Semaphore.u.MutantHandle,
|
|
MUTANT_ALL_ACCESS,
|
|
0,
|
|
0
|
|
);
|
|
|
|
if (!NT_SUCCESS( Status )) {
|
|
rc = ERROR_NOT_ENOUGH_MEMORY;
|
|
}
|
|
else {
|
|
rc = Os2ProcessSemaphoreName( &a->ObjectName,
|
|
&Semaphore,
|
|
NULL
|
|
);
|
|
|
|
}
|
|
|
|
if (rc == NO_ERROR) {
|
|
if (!Or2CreateHandle( Os2SharedSemaphoreTable,
|
|
&a->HandleIndex,
|
|
(PVOID)&Semaphore
|
|
)
|
|
) {
|
|
NtClose( Semaphore.u.MutantHandle );
|
|
rc = ERROR_NOT_ENOUGH_MEMORY;
|
|
}
|
|
}
|
|
|
|
ReleaseHandleTableLock( Os2SharedSemaphoreTable );
|
|
|
|
m->ReturnedErrorValue = rc;
|
|
return( TRUE );
|
|
}
|
|
|
|
|
|
BOOLEAN
|
|
Os2DosOpenMutexSem(
|
|
IN POS2_THREAD t,
|
|
IN POS2_API_MSG m
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
POS2_DOSOPENMUTEXSEM_MSG a = &m->u.DosOpenMutexSem;
|
|
POS2_SEMAPHORE Semaphore;
|
|
APIRET rc;
|
|
|
|
rc = Os2ProcessSemaphoreName( &a->ObjectName,
|
|
NULL,
|
|
&a->HandleIndex
|
|
);
|
|
|
|
if (rc != NO_ERROR || a->ObjectName.Length != 0) {
|
|
ReleaseHandleTableLock( Os2SharedSemaphoreTable );
|
|
m->ReturnedErrorValue = rc;
|
|
return( TRUE );
|
|
}
|
|
|
|
Semaphore = (POS2_SEMAPHORE)Or2MapHandle( Os2SharedSemaphoreTable,
|
|
a->HandleIndex,
|
|
TRUE
|
|
);
|
|
if (Semaphore == NULL) {
|
|
rc = ERROR_INVALID_HANDLE;
|
|
}
|
|
else {
|
|
Status = NtDuplicateObject( NtCurrentProcess(),
|
|
Semaphore->u.MutantHandle,
|
|
t->Process->ProcessHandle,
|
|
&a->NtMutantHandle,
|
|
MUTANT_ALL_ACCESS,
|
|
0,
|
|
0
|
|
);
|
|
if (NT_SUCCESS( Status )) {
|
|
Semaphore->OpenCount++;
|
|
}
|
|
}
|
|
|
|
ReleaseHandleTableLock( Os2SharedSemaphoreTable );
|
|
|
|
m->ReturnedErrorValue = rc;
|
|
return( TRUE );
|
|
}
|
|
|
|
|
|
BOOLEAN
|
|
Os2DosCloseMutexSem(
|
|
IN POS2_THREAD t,
|
|
IN POS2_API_MSG m
|
|
)
|
|
{
|
|
POS2_DOSCLOSEMUTEXSEM_MSG a = &m->u.DosCloseMutexSem;
|
|
POS2_SEMAPHORE Semaphore;
|
|
APIRET rc;
|
|
|
|
UNREFERENCED_PARAMETER(t);
|
|
Semaphore = (POS2_SEMAPHORE)Or2MapHandle( Os2SharedSemaphoreTable,
|
|
a->HandleIndex,
|
|
FALSE
|
|
);
|
|
if (Semaphore == NULL) {
|
|
rc = ERROR_INVALID_HANDLE;
|
|
}
|
|
else {
|
|
rc = NO_ERROR;
|
|
|
|
if (--Semaphore->OpenCount == 0) {
|
|
NtClose( (HANDLE)Os2DestroySemaphore( Semaphore, a->HandleIndex ) );
|
|
}
|
|
else {
|
|
ReleaseHandleTableLock( Os2SharedSemaphoreTable );
|
|
}
|
|
}
|
|
|
|
m->ReturnedErrorValue = rc;
|
|
return( TRUE );
|
|
}
|