/* ***************************************************************************************** * * * COPYRIGHT: * * (C) Copyright Taligent, Inc., 1997 * * (C) Copyright International Business Machines Corporation, 1997 * * Licensed Material - Program-Property of IBM - All Rights Reserved. * * US Government Users Restricted Rights - Use, duplication, or disclosure * * restricted by GSA ADP Schedule Contract with IBM Corp. * * * ***************************************************************************************** */ /* * File: muteximp.h * * Simple mutex class which allows platform-independent thread safety. The * burden is on the library caller to provide the actual locking implementation, * if they need thread-safety. Clients who don't care don't need to do anything. * * Author: Alan Liu 1/31/97 * History: Helena Shih Updated 2/4/97 * 06/04/97 helena Updated comments as per feedback from 5/21 drop. */ #ifndef _MUTEXIMP #define _MUTEXIMP #include "ptypes.h" /* * Clients who wish to call the library from multiple threads should create a * MutexImplementation struct, with three pointers in it, and then call * Mutex::SetImplementation(). Clients are responsible for making this initial * call thread-safe. * Clients who don't care about thread safety don't have to do anything. */ typedef void* MutexPointer; typedef void (*MutexFunction)(MutexPointer); #ifdef XP_CPLUSPLUS struct MutexImplementation { MutexPointer mutex; /* Pointer to the actual mutex object */ MutexFunction lock; /* Function to enter mutex */ MutexFunction unlock; /* Function to leave mutex */ }; #endif #ifndef XP_CPLUSPLUS typedef struct MutexImplementation { MutexPointer mutex; /* Pointer to the actual mutex object */ MutexFunction lock; /* Function to enter mutex */ MutexFunction unlock; /* Function to leave mutex */ } MutexImplementation; #endif /** * The following is an example of the mutex implementation on Win32 platforms,
. #include "mutex.h" . #include <WINDOWS.H> . . static CRITICAL_SECTION gMutex; . . void Win32Lock(MutexPointer p) . { . CRITICAL_SECTION *mutex = (CRITICAL_SECTION*)p; . EnterCriticalSection(mutex); . } . . void Win32Unlock(MutexPointer p) . { . CRITICAL_SECTION *mutex = (CRITICAL_SECTION*)p; . LeaveCriticalSection(mutex); . } . . MutexImplementation gWin32MutexImplementation = { &gMutex, Win32Lock, Win32Unlock }; . .... . . Maybe something like this: Client would write this function and then . make sure to call it once in one thread before multiple threads start. . .... . void Win32MutexInitialize() . { . InitializeCriticalSection(&gMutex); . Mutex::SetImplementation(&gWin32MutexImplementation); . }*/ #endif