1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
|
/*
* This is the header file for the module that implements some missing
* synchronization priomitives from the Tcl API.
*
* Copyright (c) 2002 by Zoran Vasiljevic.
*
* See the file "license.txt" for information on usage and redistribution
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
* Rcsid: @(#)$Id: threadSpCmd.h,v 1.3 2006/01/28 15:11:32 vasiljevic Exp $
* ---------------------------------------------------------------------------
*/
#ifndef _SP_H_
#define _SP_H_
#include <tcl.h>
/*
* The following structure defines a locking bucket. A locking
* bucket is associated with a mutex and protects access to
* objects stored in bucket hash table.
*/
typedef struct SpBucket {
Tcl_Mutex lock; /* For locking the bucket */
Tcl_ThreadId lockt; /* Thread holding the lock */
Tcl_HashTable handles; /* Hash table of given-out handles in bucket */
struct Container *freeCt; /* List of free Tcl-object containers */
} SpBucket;
#define NUMSPBUCKETS 32
/*
* All types of mutexes share this common part.
*/
typedef struct Sp_AnyMutex_ {
int lockcount; /* If !=0 mutex is locked */
int numlocks; /* Number of times the mutex got locked */
Tcl_Mutex lock; /* Regular mutex */
Tcl_ThreadId owner; /* Current lock owner thread (-1 = any) */
} Sp_AnyMutex;
/*
* Implementation of the exclusive mutex.
*/
typedef struct Sp_ExclusiveMutex_ {
int lockcount; /* Flag: 1-locked, 0-not locked */
int numlocks; /* Number of times the mutex got locked */
Tcl_Mutex lock; /* Regular mutex */
Tcl_ThreadId owner; /* Current lock owner thread */
/* --- */
Tcl_Mutex mutex; /* Mutex being locked */
} Sp_ExclusiveMutex_;
typedef Sp_ExclusiveMutex_* Sp_ExclusiveMutex;
/*
* Implementation of the recursive mutex.
*/
typedef struct Sp_RecursiveMutex_ {
int lockcount; /* # of times this mutex is locked */
int numlocks; /* Number of time the mutex got locked */
Tcl_Mutex lock; /* Regular mutex */
Tcl_ThreadId owner; /* Current lock owner thread */
/* --- */
Tcl_Condition cond; /* Wait to be allowed to lock the mutex */
} Sp_RecursiveMutex_;
typedef Sp_RecursiveMutex_* Sp_RecursiveMutex;
/*
* Implementation of the read/writer mutex.
*/
typedef struct Sp_ReadWriteMutex_ {
int lockcount; /* >0: # of readers, -1: sole writer */
int numlocks; /* Number of time the mutex got locked */
Tcl_Mutex lock; /* Regular mutex */
Tcl_ThreadId owner; /* Current lock owner thread */
/* --- */
unsigned int numrd; /* # of readers waiting for lock */
unsigned int numwr; /* # of writers waiting for lock */
Tcl_Condition rcond; /* Reader lockers wait here */
Tcl_Condition wcond; /* Writer lockers wait here */
} Sp_ReadWriteMutex_;
typedef Sp_ReadWriteMutex_* Sp_ReadWriteMutex;
/*
* API for exclusive mutexes.
*/
int Sp_ExclusiveMutexLock(Sp_ExclusiveMutex *mutexPtr);
int Sp_ExclusiveMutexIsLocked(Sp_ExclusiveMutex *mutexPtr);
int Sp_ExclusiveMutexUnlock(Sp_ExclusiveMutex *mutexPtr);
void Sp_ExclusiveMutexFinalize(Sp_ExclusiveMutex *mutexPtr);
/*
* API for recursive mutexes.
*/
int Sp_RecursiveMutexLock(Sp_RecursiveMutex *mutexPtr);
int Sp_RecursiveMutexIsLocked(Sp_RecursiveMutex *mutexPtr);
int Sp_RecursiveMutexUnlock(Sp_RecursiveMutex *mutexPtr);
void Sp_RecursiveMutexFinalize(Sp_RecursiveMutex *mutexPtr);
/*
* API for reader/writer mutexes.
*/
int Sp_ReadWriteMutexRLock(Sp_ReadWriteMutex *mutexPtr);
int Sp_ReadWriteMutexWLock(Sp_ReadWriteMutex *mutexPtr);
int Sp_ReadWriteMutexIsLocked(Sp_ReadWriteMutex *mutexPtr);
int Sp_ReadWriteMutexUnlock(Sp_ReadWriteMutex *mutexPtr);
void Sp_ReadWriteMutexFinalize(Sp_ReadWriteMutex *mutexPtr);
#endif /* _SP_H_ */
/* EOF $RCSfile: threadSpCmd.h,v $ */
/* Emacs Setup Variables */
/* Local Variables: */
/* mode: C */
/* indent-tabs-mode: nil */
/* c-basic-offset: 4 */
/* End: */
|