blob: 33c1a77868ed652602b05470b67e285fb48f7458 (
plain)
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
|
/*-------------------------------------------------------------------------
*
* gtm_lock.h
*
*
* Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
* Portions Copyright (c) 2010-2012 Postgres-XC Development Group
*
* $PostgreSQL$
*
*-------------------------------------------------------------------------
*/
#ifndef GTM_LOCK_H
#define GTM_LOCK_H
#include <pthread.h>
typedef struct GTM_RWLock
{
pthread_rwlock_t lk_lock;
#ifdef GTM_LOCK_DEBUG
#define GTM_LOCK_DEBUG_MAX_READ_TRACKERS 1024
pthread_mutex_t lk_debug_mutex;
int wr_waiters_count;
pthread_t wr_waiters[GTM_LOCK_DEBUG_MAX_READ_TRACKERS];
bool wr_granted;
pthread_t wr_owner;
int rd_holders_count;
bool rd_holders_overflow;
pthread_t rd_holders[GTM_LOCK_DEBUG_MAX_READ_TRACKERS];
int rd_waiters_count;
bool rd_waiters_overflow;
pthread_t rd_waiters[GTM_LOCK_DEBUG_MAX_READ_TRACKERS];
#endif
} GTM_RWLock;
typedef struct GTM_MutexLock
{
pthread_mutex_t lk_lock;
} GTM_MutexLock;
typedef enum GTM_LockMode
{
GTM_LOCKMODE_WRITE,
GTM_LOCKMODE_READ
} GTM_LockMode;
typedef struct GTM_CV
{
pthread_cond_t cv_condvar;
} GTM_CV;
extern bool GTM_RWLockAcquire(GTM_RWLock *lock, GTM_LockMode mode);
extern bool GTM_RWLockRelease(GTM_RWLock *lock);
extern int GTM_RWLockInit(GTM_RWLock *lock);
extern int GTM_RWLockDestroy(GTM_RWLock *lock);
extern void GTM_RWLockReleaseAll(void);
extern bool GTM_MutexLockAcquire(GTM_MutexLock *lock);
extern bool GTM_MutexLockRelease(GTM_MutexLock *lock);
extern int GTM_MutexLockInit(GTM_MutexLock *lock);
extern int GTM_MutexLockDestroy(GTM_MutexLock *lock);
extern void GTM_MutexLockReleaseAll(void);
extern int GTM_CVInit(GTM_CV *cv);
extern int GTM_CVSignal(GTM_CV *cv);
extern int GTM_CVBcast(GTM_CV *cv);
extern int GTM_CVWait(GTM_CV *cv, GTM_MutexLock *lock);
#endif
|