diff options
Diffstat (limited to 'sal/osl/os2/semaphor.c')
-rw-r--r-- | sal/osl/os2/semaphor.c | 190 |
1 files changed, 190 insertions, 0 deletions
diff --git a/sal/osl/os2/semaphor.c b/sal/osl/os2/semaphor.c new file mode 100644 index 000000000000..8613e3ecd352 --- /dev/null +++ b/sal/osl/os2/semaphor.c @@ -0,0 +1,190 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#include "system.h" + +#include <osl/diagnose.h> +#include <osl/semaphor.h> + +/* + Implemetation notes: + The void* represented by oslSemaphore is used + to store a OS/2 HANDLE. +*/ + +typedef struct _oslSemaphoreImpl +{ + HEV hevReachedZero; + int nCount; +} oslSemaphoreImpl; + +// static mutex to control access to private members of oslMutexImpl +static HMTX MutexLock = NULL; + +/*****************************************************************************/ +/* osl_createSemaphore */ +/*****************************************************************************/ + +/* +- Erzeugen der Semaphore +- Zhler auf initialCount setzen +*/ +oslSemaphore SAL_CALL osl_createSemaphore(sal_uInt32 initialCount) +{ + APIRET rc; + oslSemaphoreImpl * pSemaphoreImpl; + + /* alloc mem. for our internal data structure */ + pSemaphoreImpl = (oslSemaphoreImpl *) malloc(sizeof(oslSemaphoreImpl)); + if( pSemaphoreImpl == NULL ) + return NULL; + + /* create semaphore */ + rc = DosCreateEventSem( NULL, + &pSemaphoreImpl->hevReachedZero, + DC_SEM_SHARED, + FALSE ); + if( rc != NO_ERROR ) + { + free( pSemaphoreImpl ); + return NULL; + } + + pSemaphoreImpl->nCount = initialCount; + + // create static mutex for private members + if (MutexLock == NULL) + DosCreateMutexSem( NULL, &MutexLock, 0, FALSE ); + + return (oslSemaphore) pSemaphoreImpl; +} + +/*****************************************************************************/ +/* osl_destroySemaphore */ +/*****************************************************************************/ + +/* +- Semaphore lschen +*/ + +void SAL_CALL osl_destroySemaphore(oslSemaphore Semaphore) +{ + oslSemaphoreImpl* pSemaphoreImpl = (oslSemaphoreImpl*)Semaphore; + OSL_ASSERT(Semaphore != 0); + + DosCloseEventSem( pSemaphoreImpl->hevReachedZero ); + + free( pSemaphoreImpl ); +} + +/*****************************************************************************/ +/* osl_acquireSemaphore */ +/*****************************************************************************/ +/* +- Zhler -1 +- wenn Zhler < 0: blockieren +*/ + +sal_Bool SAL_CALL osl_acquireSemaphore(oslSemaphore Semaphore) +{ + APIRET rc; + oslSemaphoreImpl* pSemaphoreImpl = (oslSemaphoreImpl*)Semaphore; + int nCount; + OSL_ASSERT(Semaphore != 0); + + DosRequestMutexSem( MutexLock, SEM_INDEFINITE_WAIT ); + + while( pSemaphoreImpl->nCount < 1 ) + { + sal_uInt32 nPostCount; + + DosReleaseMutexSem( MutexLock); + + rc = DosWaitEventSem(pSemaphoreImpl->hevReachedZero, SEM_INDEFINITE_WAIT ); + DosResetEventSem(pSemaphoreImpl->hevReachedZero, &nPostCount); + + DosRequestMutexSem( MutexLock, SEM_INDEFINITE_WAIT ); + } + + pSemaphoreImpl->nCount--; + DosReleaseMutexSem( MutexLock); + + return( rc == NO_ERROR ); +} + +/*****************************************************************************/ +/* osl_tryToAcquireSemaphore */ +/*****************************************************************************/ +/* +- Zhler -1, wenn vorher > 0 +- wenn Zhler < 0: mit FALSE zurueck +*/ +sal_Bool SAL_CALL osl_tryToAcquireSemaphore(oslSemaphore Semaphore) +{ + APIRET rc; + oslSemaphoreImpl* pSemaphoreImpl = (oslSemaphoreImpl*)Semaphore; + int nCount; + OSL_ASSERT(Semaphore != 0); + + DosRequestMutexSem( MutexLock, SEM_INDEFINITE_WAIT ); + + nCount = pSemaphoreImpl->nCount; + if( pSemaphoreImpl->nCount > 0 ) + pSemaphoreImpl->nCount--; + + DosReleaseMutexSem( MutexLock); + + return( nCount > 0 ); +} + +/*****************************************************************************/ +/* osl_releaseSemaphore */ +/*****************************************************************************/ +/* +- Zhler +1 +*/ +sal_Bool SAL_CALL osl_releaseSemaphore(oslSemaphore Semaphore) +{ + APIRET rc; + oslSemaphoreImpl* pSemaphoreImpl = (oslSemaphoreImpl*)Semaphore; + int nCount; + OSL_ASSERT(Semaphore != 0); + + DosRequestMutexSem( MutexLock, SEM_INDEFINITE_WAIT ); + + nCount = pSemaphoreImpl->nCount; + pSemaphoreImpl->nCount++; + + DosReleaseMutexSem( MutexLock); + + if( nCount == 0 ) + DosPostEventSem(pSemaphoreImpl->hevReachedZero); + + return( rc == NO_ERROR ); +} + + |