Import Tcl 8.6.12
This commit is contained in:
128
pkgs/thread2.8.7/generic/threadSpCmd.h
Normal file
128
pkgs/thread2.8.7/generic/threadSpCmd.h
Normal file
@@ -0,0 +1,128 @@
|
||||
/*
|
||||
* This is the header file for the module that implements some missing
|
||||
* synchronization primitives 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.
|
||||
* ---------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#ifndef _SP_H_
|
||||
#define _SP_H_
|
||||
|
||||
#include "tclThreadInt.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_Condition cond; /* For waiting on threads to release items */
|
||||
Tcl_HashTable handles; /* Hash table of given-out handles in bucket */
|
||||
} 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.
|
||||
*/
|
||||
|
||||
MODULE_SCOPE int Sp_ExclusiveMutexLock(Sp_ExclusiveMutex *mutexPtr);
|
||||
MODULE_SCOPE int Sp_ExclusiveMutexIsLocked(Sp_ExclusiveMutex *mutexPtr);
|
||||
MODULE_SCOPE int Sp_ExclusiveMutexUnlock(Sp_ExclusiveMutex *mutexPtr);
|
||||
MODULE_SCOPE void Sp_ExclusiveMutexFinalize(Sp_ExclusiveMutex *mutexPtr);
|
||||
|
||||
/*
|
||||
* API for recursive mutexes.
|
||||
*/
|
||||
|
||||
MODULE_SCOPE int Sp_RecursiveMutexLock(Sp_RecursiveMutex *mutexPtr);
|
||||
MODULE_SCOPE int Sp_RecursiveMutexIsLocked(Sp_RecursiveMutex *mutexPtr);
|
||||
MODULE_SCOPE int Sp_RecursiveMutexUnlock(Sp_RecursiveMutex *mutexPtr);
|
||||
MODULE_SCOPE void Sp_RecursiveMutexFinalize(Sp_RecursiveMutex *mutexPtr);
|
||||
|
||||
/*
|
||||
* API for reader/writer mutexes.
|
||||
*/
|
||||
|
||||
MODULE_SCOPE int Sp_ReadWriteMutexRLock(Sp_ReadWriteMutex *mutexPtr);
|
||||
MODULE_SCOPE int Sp_ReadWriteMutexWLock(Sp_ReadWriteMutex *mutexPtr);
|
||||
MODULE_SCOPE int Sp_ReadWriteMutexIsLocked(Sp_ReadWriteMutex *mutexPtr);
|
||||
MODULE_SCOPE int Sp_ReadWriteMutexUnlock(Sp_ReadWriteMutex *mutexPtr);
|
||||
MODULE_SCOPE 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: */
|
||||
Reference in New Issue
Block a user