1
by brian
clean slate |
1 |
/******************************************************
|
2 |
The interface to the operating system
|
|
3 |
synchronization primitives.
|
|
4 |
||
5 |
(c) 1995 Innobase Oy
|
|
6 |
||
7 |
Created 9/6/1995 Heikki Tuuri
|
|
8 |
*******************************************************/
|
|
9 |
#ifndef os0sync_h
|
|
10 |
#define os0sync_h
|
|
11 |
||
12 |
#include "univ.i" |
|
13 |
#include "ut0lst.h" |
|
14 |
||
15 |
#ifdef __WIN__
|
|
16 |
||
17 |
#define os_fast_mutex_t CRITICAL_SECTION
|
|
18 |
||
19 |
typedef HANDLE os_native_event_t; |
|
20 |
||
21 |
typedef struct os_event_struct os_event_struct_t; |
|
22 |
typedef os_event_struct_t* os_event_t; |
|
23 |
||
24 |
struct os_event_struct { |
|
25 |
os_native_event_t handle; |
|
26 |
/* Windows event */
|
|
27 |
UT_LIST_NODE_T(os_event_struct_t) os_event_list; |
|
28 |
/* list of all created events */
|
|
29 |
};
|
|
30 |
#else
|
|
31 |
typedef pthread_mutex_t os_fast_mutex_t; |
|
32 |
||
33 |
typedef struct os_event_struct os_event_struct_t; |
|
34 |
typedef os_event_struct_t* os_event_t; |
|
35 |
||
36 |
struct os_event_struct { |
|
37 |
os_fast_mutex_t os_mutex; /* this mutex protects the next |
|
38 |
fields */
|
|
39 |
ibool is_set; /* this is TRUE when the event is |
|
40 |
in the signaled state, i.e., a thread
|
|
41 |
does not stop if it tries to wait for
|
|
42 |
this event */
|
|
43 |
ib_longlong signal_count; /* this is incremented each time |
|
44 |
the event becomes signaled */
|
|
45 |
pthread_cond_t cond_var; /* condition variable is used in |
|
46 |
waiting for the event */
|
|
47 |
UT_LIST_NODE_T(os_event_struct_t) os_event_list; |
|
48 |
/* list of all created events */
|
|
49 |
};
|
|
50 |
#endif
|
|
51 |
||
52 |
typedef struct os_mutex_struct os_mutex_str_t; |
|
53 |
typedef os_mutex_str_t* os_mutex_t; |
|
54 |
||
55 |
#define OS_SYNC_INFINITE_TIME ((ulint)(-1))
|
|
56 |
||
57 |
#define OS_SYNC_TIME_EXCEEDED 1
|
|
58 |
||
59 |
/* Mutex protecting counts and the event and OS 'slow' mutex lists */
|
|
60 |
extern os_mutex_t os_sync_mutex; |
|
61 |
||
62 |
/* This is incremented by 1 in os_thread_create and decremented by 1 in
|
|
63 |
os_thread_exit */
|
|
64 |
extern ulint os_thread_count; |
|
65 |
||
66 |
extern ulint os_event_count; |
|
67 |
extern ulint os_mutex_count; |
|
68 |
extern ulint os_fast_mutex_count; |
|
69 |
||
70 |
/*************************************************************
|
|
71 |
Initializes global event and OS 'slow' mutex lists. */
|
|
72 |
||
73 |
void
|
|
74 |
os_sync_init(void); |
|
75 |
/*==============*/
|
|
76 |
/*************************************************************
|
|
77 |
Frees created events and OS 'slow' mutexes. */
|
|
78 |
||
79 |
void
|
|
80 |
os_sync_free(void); |
|
81 |
/*==============*/
|
|
82 |
/*************************************************************
|
|
83 |
Creates an event semaphore, i.e., a semaphore which may just have two states:
|
|
84 |
signaled and nonsignaled. The created event is manual reset: it must be reset
|
|
85 |
explicitly by calling sync_os_reset_event. */
|
|
86 |
||
87 |
os_event_t
|
|
88 |
os_event_create( |
|
89 |
/*============*/
|
|
90 |
/* out: the event handle */
|
|
91 |
const char* name); /* in: the name of the event, if NULL |
|
92 |
the event is created without a name */
|
|
93 |
#ifdef __WIN__
|
|
94 |
/*************************************************************
|
|
95 |
Creates an auto-reset event semaphore, i.e., an event which is automatically
|
|
96 |
reset when a single thread is released. Works only in Windows. */
|
|
97 |
||
98 |
os_event_t
|
|
99 |
os_event_create_auto( |
|
100 |
/*=================*/
|
|
101 |
/* out: the event handle */
|
|
102 |
const char* name); /* in: the name of the event, if NULL |
|
103 |
the event is created without a name */
|
|
104 |
#endif
|
|
105 |
/**************************************************************
|
|
106 |
Sets an event semaphore to the signaled state: lets waiting threads
|
|
107 |
proceed. */
|
|
108 |
||
109 |
void
|
|
110 |
os_event_set( |
|
111 |
/*=========*/
|
|
112 |
os_event_t event); /* in: event to set */ |
|
113 |
/**************************************************************
|
|
114 |
Resets an event semaphore to the nonsignaled state. Waiting threads will
|
|
115 |
stop to wait for the event. */
|
|
116 |
||
117 |
void
|
|
118 |
os_event_reset( |
|
119 |
/*===========*/
|
|
120 |
os_event_t event); /* in: event to reset */ |
|
121 |
/**************************************************************
|
|
122 |
Frees an event object. */
|
|
123 |
||
124 |
void
|
|
125 |
os_event_free( |
|
126 |
/*==========*/
|
|
127 |
os_event_t event); /* in: event to free */ |
|
128 |
/**************************************************************
|
|
129 |
Waits for an event object until it is in the signaled state. If
|
|
130 |
srv_shutdown_state == SRV_SHUTDOWN_EXIT_THREADS this also exits the
|
|
131 |
waiting thread when the event becomes signaled (or immediately if the
|
|
132 |
event is already in the signaled state). */
|
|
133 |
||
134 |
void
|
|
135 |
os_event_wait( |
|
136 |
/*==========*/
|
|
137 |
os_event_t event); /* in: event to wait */ |
|
138 |
/**************************************************************
|
|
139 |
Waits for an event object until it is in the signaled state or
|
|
140 |
a timeout is exceeded. In Unix the timeout is always infinite. */
|
|
141 |
||
142 |
ulint
|
|
143 |
os_event_wait_time( |
|
144 |
/*===============*/
|
|
145 |
/* out: 0 if success,
|
|
146 |
OS_SYNC_TIME_EXCEEDED if timeout
|
|
147 |
was exceeded */
|
|
148 |
os_event_t event, /* in: event to wait */ |
|
149 |
ulint time); /* in: timeout in microseconds, or |
|
150 |
OS_SYNC_INFINITE_TIME */
|
|
151 |
#ifdef __WIN__
|
|
152 |
/**************************************************************
|
|
153 |
Waits for any event in an OS native event array. Returns if even a single
|
|
154 |
one is signaled or becomes signaled. */
|
|
155 |
||
156 |
ulint
|
|
157 |
os_event_wait_multiple( |
|
158 |
/*===================*/
|
|
159 |
/* out: index of the event
|
|
160 |
which was signaled */
|
|
161 |
ulint n, /* in: number of events in the |
|
162 |
array */
|
|
163 |
os_native_event_t* native_event_array); |
|
164 |
/* in: pointer to an array of event
|
|
165 |
handles */
|
|
166 |
#endif
|
|
167 |
/*************************************************************
|
|
168 |
Creates an operating system mutex semaphore. Because these are slow, the
|
|
169 |
mutex semaphore of InnoDB itself (mutex_t) should be used where possible. */
|
|
170 |
||
171 |
os_mutex_t
|
|
172 |
os_mutex_create( |
|
173 |
/*============*/
|
|
174 |
/* out: the mutex handle */
|
|
175 |
const char* name); /* in: the name of the mutex, if NULL |
|
176 |
the mutex is created without a name */
|
|
177 |
/**************************************************************
|
|
178 |
Acquires ownership of a mutex semaphore. */
|
|
179 |
||
180 |
void
|
|
181 |
os_mutex_enter( |
|
182 |
/*===========*/
|
|
183 |
os_mutex_t mutex); /* in: mutex to acquire */ |
|
184 |
/**************************************************************
|
|
185 |
Releases ownership of a mutex. */
|
|
186 |
||
187 |
void
|
|
188 |
os_mutex_exit( |
|
189 |
/*==========*/
|
|
190 |
os_mutex_t mutex); /* in: mutex to release */ |
|
191 |
/**************************************************************
|
|
192 |
Frees an mutex object. */
|
|
193 |
||
194 |
void
|
|
195 |
os_mutex_free( |
|
196 |
/*==========*/
|
|
197 |
os_mutex_t mutex); /* in: mutex to free */ |
|
198 |
/**************************************************************
|
|
199 |
Acquires ownership of a fast mutex. Currently in Windows this is the same
|
|
200 |
as os_fast_mutex_lock! */
|
|
201 |
UNIV_INLINE
|
|
202 |
ulint
|
|
203 |
os_fast_mutex_trylock( |
|
204 |
/*==================*/
|
|
205 |
/* out: 0 if success, != 0 if
|
|
206 |
was reserved by another
|
|
207 |
thread */
|
|
208 |
os_fast_mutex_t* fast_mutex); /* in: mutex to acquire */ |
|
209 |
/**************************************************************
|
|
210 |
Releases ownership of a fast mutex. */
|
|
211 |
||
212 |
void
|
|
213 |
os_fast_mutex_unlock( |
|
214 |
/*=================*/
|
|
215 |
os_fast_mutex_t* fast_mutex); /* in: mutex to release */ |
|
216 |
/*************************************************************
|
|
217 |
Initializes an operating system fast mutex semaphore. */
|
|
218 |
||
219 |
void
|
|
220 |
os_fast_mutex_init( |
|
221 |
/*===============*/
|
|
222 |
os_fast_mutex_t* fast_mutex); /* in: fast mutex */ |
|
223 |
/**************************************************************
|
|
224 |
Acquires ownership of a fast mutex. */
|
|
225 |
||
226 |
void
|
|
227 |
os_fast_mutex_lock( |
|
228 |
/*===============*/
|
|
229 |
os_fast_mutex_t* fast_mutex); /* in: mutex to acquire */ |
|
230 |
/**************************************************************
|
|
231 |
Frees an mutex object. */
|
|
232 |
||
233 |
void
|
|
234 |
os_fast_mutex_free( |
|
235 |
/*===============*/
|
|
236 |
os_fast_mutex_t* fast_mutex); /* in: mutex to free */ |
|
237 |
||
238 |
#ifndef UNIV_NONINL
|
|
239 |
#include "os0sync.ic" |
|
240 |
#endif
|
|
241 |
||
242 |
#endif
|