/* ***************************************************************************************** * * * 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