| /*---------------------------------------------------------------------------* |
| * pmutex.h * |
| * * |
| * Copyright 2007, 2008 Nuance Communciations, Inc. * |
| * * |
| * Licensed under the Apache License, Version 2.0 (the 'License'); * |
| * you may not use this file except in compliance with the License. * |
| * * |
| * You may obtain a copy of the License at * |
| * http://www.apache.org/licenses/LICENSE-2.0 * |
| * * |
| * Unless required by applicable law or agreed to in writing, software * |
| * distributed under the License is distributed on an 'AS IS' BASIS, * |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * |
| * See the License for the specific language governing permissions and * |
| * limitations under the License. * |
| * * |
| *---------------------------------------------------------------------------*/ |
| |
| #ifndef __PMUTEX_H |
| #define __PMUTEX_H |
| |
| #if defined(__vxworks) && !defined(REAL_PTHREADS) |
| #undef USE_THREAD |
| #define USE_THREAD |
| #undef POSIX |
| #define POSIX |
| #endif |
| |
| |
| |
| #include "ESR_ReturnCode.h" |
| |
| #define SECOND2NSECOND 1000000000 |
| #define SECOND2MSECOND 1000 |
| #define MSECOND2NSECOND 1000000 |
| |
| #ifdef USE_THREAD |
| |
| #ifdef _WIN32 |
| |
| #ifndef WIN32_LEAN_AND_MEAN |
| #define WIN32_LEAN_AND_MEAN |
| #endif |
| #include "windows.h" |
| |
| typedef HANDLE MUTEX; |
| typedef HANDLE EVENT; |
| |
| #define createMutex(mutex, locked) \ |
| (*mutex = CreateMutex(NULL, locked, NULL)) == 0 ? ESR_MUTEX_CREATION_ERROR : ESR_SUCCESS |
| |
| #define lockMutex(mutex) waitForHandle(mutex, INFINITE) |
| #define unlockMutex(mutex) (ReleaseMutex(*mutex) ? ESR_SUCCESS : ESR_FATAL_ERROR) |
| #define deleteMutex(mutex) ((void) CloseHandle(*mutex)) |
| ESR_ReturnCode waitForHandle(HANDLE* handle, asr_uint32_t timeout); |
| |
| #elif defined(POSIX) |
| |
| #if defined(__vxworks) && !defined(REAL_PTHREADS) |
| #include "pthread_vx.h" |
| #else |
| #include <pthread.h> |
| |
| #ifndef _POSIX_THREADS |
| #error "Thread is not defined!" |
| #endif |
| #endif /* _VX_WORKS_ */ |
| |
| typedef pthread_mutex_t MUTEX; |
| typedef pthread_cond_t EVENT; |
| |
| ESR_ReturnCode createMutex_posix(MUTEX *mutex, ESR_BOOL locked); |
| ESR_ReturnCode deleteMutex_posix(MUTEX *mutex); |
| |
| #define createMutex(mutex, locked) createMutex_posix(mutex, locked) |
| #define deleteMutex(mutex) deleteMutex_posix(mutex) |
| #define lockMutex(mutex) (pthread_mutex_lock(mutex) == 0 ? ESR_SUCCESS : ESR_FATAL_ERROR) |
| #define unlockMutex(mutex) (pthread_mutex_unlock(mutex) == 0 ? ESR_SUCCESS : ESR_FATAL_ERROR) |
| |
| #else /* NON_POSIX */ |
| |
| #error Portable Synchronization not defined for this OS! |
| |
| #endif /* _WIN32 */ |
| |
| #else /* USE_THREAD */ |
| |
| #define createMutex(mutex, locked) (ESR_SUCCESS) |
| #define deleteMutex(mutex) |
| #define lockMutex(mutex) ((void) 0) |
| #define unlockMutex(mutex) ((void) 0) |
| |
| #endif /* USE_THREAD */ |
| |
| #endif |