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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
|
/* This is the POSIX thread API (POSIX 1003).
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/* FIXME: do not include function prototypes for functions which are
not yet implemented. This will allow us to keep a better handle on
where we're at. */
#ifndef _PTHREADS_H
#define _PTHREADS_H
typedef HANDLE pthread_t;
typedef CRITICAL_SECTION pthread_mutex_t;
typedef struct {
enum { SIGNAL, BROADCAST, NUM_EVENTS };
/* Signal and broadcast event HANDLEs. */
HANDLE events[NUM_EVENTS];
/* Count of the number of waiters. */
unsigned waiters_count;
/* Serialize access to waiters_count_. */
pthread_mutex_t waiters_count_lock;
} pthread_cond_t;
typedef struct { void * ptr; } pthread_condattr_t;
typedef struct { void * ptr; } pthread_mutexattr_t;
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
int pthread_create(pthread_t *thread,
const pthread_attr_t *attr,
void * (*start_routine) (void *),
void * arg);
void pthread_exit(void *value);
pthread_t pthread_self(void);
int pthread_equal(pthread_t t1, pthread_t t2);
int pthread_join(pthread_t thread, void ** valueptr);
/* Functions for manipulating thread attribute objects. */
int pthread_attr_init(pthread_attr_t *attr);
int pthread_attr_destroy(pthread_attr_t *attr);
int pthread_attr_setstacksize(pthread_attr_t *attr,
size_t stacksize);
int pthread_attr_getstacksize(const pthread_attr_t *attr,
size_t *stacksize);
int pthread_attr_setstackaddr(pthread_attr_t *attr,
void *stackaddr);
int pthread_attr_getstackaddr(const pthread_attr_t *attr,
void **stackaddr);
/* Functions for manipulating cond. var. attribute objects. */
int pthread_condattr_init(pthread_condattr_t *attr);
int pthread_condattr_setpshared(pthread_condattr_t *attr,
int pshared);
int pthread_condattr_getpshared(pthread_condattr_t *attr,
int *pshared);
int pthread_condattr_destroy(pthread_condattr_t *attr);
/* Functions for manipulating mutex attribute objects. */
int pthread_mutexattr_init(pthread_mutexattr_t *attr);
int pthread_mutexattr_destroy(pthread_mutexattr_t *attr);
int pthread_mutexattr_setpshared(pthread_mutexattr_t *attr,
int pshared);
int pthread_mutexattr_getpshared(pthread_mutexattr_t *attr,
int *pshared);
/* Primitives for condition variables. */
int pthread_cond_init(pthread_cond_t *cv,
const pthread_condattr_t *attr);
int pthread_cond_broadcast(pthread_cond_t *cv);
int pthread_cond_signal(pthread_cond_t *cv);
int pthread_cond_timedwait(pthread_cond_t *cv,
pthread_mutex_t *mutex,
const struct timespec *abstime);
int pthread_cond_wait(pthread_cond_t *cv,
pthread_mutex_t *mutex);
int pthread_cond_destroy(pthread_cond_t *cv);
/* Primitives for mutexes. */
int pthread_mutex_init(pthread_mutex_t *mutex,
pthread_mutex_attr_t *attr);
int pthread_mutex_destroy(pthread_mutex_t *mutex);
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_trylock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);
/* These functions cannot be implemented in terms of the Win32 API.
Fortunately they are optional. Their implementation just returns
the correct error number. */
int pthread_mutexattr_setprotocol(pthread_mutexattr_t *attr,
int protocol);
int pthread_mutexattr_getprotocol(const pthread_mutexattr_t *attr,
int *protocol);
int pthread_mutexattr_setprioceiling(pthread_mutexattr_t *attr,
int prioceiling);
int pthread_mutexattr_getprioceiling(const pthread_mutexattr_t *attr,
int *ceiling);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* _PTHREADS_H */
|