1 // Copyright 2014-2015 The Rust Project Developers. See the COPYRIGHT
2 // file at the top-level directory of this distribution and at
3 // http://rust-lang.org/COPYRIGHT.
5 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8 // option. This file may not be copied, modified, or distributed
9 // except according to those terms.
15 pub use self::os
::{PTHREAD_MUTEX_INITIALIZER
, PTHREAD_MUTEX_RECURSIVE
, pthread_mutex_t
,
17 pub use self::os
::{PTHREAD_COND_INITIALIZER, pthread_cond_t}
;
18 pub use self::os
::{PTHREAD_RWLOCK_INITIALIZER, pthread_rwlock_t}
;
22 pub fn pthread_mutex_init(lock
: *mut pthread_mutex_t
, attr
: *const pthread_mutexattr_t
)
24 pub fn pthread_mutex_destroy(lock
: *mut pthread_mutex_t
) -> libc
::c_int
;
25 pub fn pthread_mutex_lock(lock
: *mut pthread_mutex_t
) -> libc
::c_int
;
26 pub fn pthread_mutex_trylock(lock
: *mut pthread_mutex_t
) -> libc
::c_int
;
27 pub fn pthread_mutex_unlock(lock
: *mut pthread_mutex_t
) -> libc
::c_int
;
29 pub fn pthread_mutexattr_init(attr
: *mut pthread_mutexattr_t
) -> libc
::c_int
;
30 pub fn pthread_mutexattr_destroy(attr
: *mut pthread_mutexattr_t
) -> libc
::c_int
;
31 pub fn pthread_mutexattr_settype(attr
: *mut pthread_mutexattr_t
, _type
: libc
::c_int
)
35 pub fn pthread_cond_wait(cond
: *mut pthread_cond_t
,
36 lock
: *mut pthread_mutex_t
) -> libc
::c_int
;
37 pub fn pthread_cond_timedwait(cond
: *mut pthread_cond_t
,
38 lock
: *mut pthread_mutex_t
,
39 abstime
: *const libc
::timespec
) -> libc
::c_int
;
40 pub fn pthread_cond_signal(cond
: *mut pthread_cond_t
) -> libc
::c_int
;
41 pub fn pthread_cond_broadcast(cond
: *mut pthread_cond_t
) -> libc
::c_int
;
42 pub fn pthread_cond_destroy(cond
: *mut pthread_cond_t
) -> libc
::c_int
;
43 pub fn gettimeofday(tp
: *mut libc
::timeval
,
44 tz
: *mut libc
::c_void
) -> libc
::c_int
;
47 pub fn pthread_rwlock_destroy(lock
: *mut pthread_rwlock_t
) -> libc
::c_int
;
48 pub fn pthread_rwlock_rdlock(lock
: *mut pthread_rwlock_t
) -> libc
::c_int
;
49 pub fn pthread_rwlock_tryrdlock(lock
: *mut pthread_rwlock_t
) -> libc
::c_int
;
50 pub fn pthread_rwlock_wrlock(lock
: *mut pthread_rwlock_t
) -> libc
::c_int
;
51 pub fn pthread_rwlock_trywrlock(lock
: *mut pthread_rwlock_t
) -> libc
::c_int
;
52 pub fn pthread_rwlock_unlock(lock
: *mut pthread_rwlock_t
) -> libc
::c_int
;
55 #[cfg(any(target_os = "freebsd",
56 target_os
= "dragonfly",
58 target_os
= "openbsd"))]
62 pub type pthread_mutex_t
= *mut libc
::c_void
;
63 pub type pthread_mutexattr_t
= *mut libc
::c_void
;
64 pub type pthread_cond_t
= *mut libc
::c_void
;
65 pub type pthread_rwlock_t
= *mut libc
::c_void
;
67 pub const PTHREAD_MUTEX_INITIALIZER
: pthread_mutex_t
= 0 as *mut _
;
68 pub const PTHREAD_COND_INITIALIZER
: pthread_cond_t
= 0 as *mut _
;
69 pub const PTHREAD_RWLOCK_INITIALIZER
: pthread_rwlock_t
= 0 as *mut _
;
70 pub const PTHREAD_MUTEX_RECURSIVE
: libc
::c_int
= 2;
73 #[cfg(any(target_os = "macos", target_os = "ios"))]
77 #[cfg(any(target_arch = "x86_64",
78 target_arch
= "aarch64"))]
79 const __PTHREAD_MUTEX_SIZE__
: usize = 56;
80 #[cfg(any(target_arch = "x86",
81 target_arch
= "arm"))]
82 const __PTHREAD_MUTEX_SIZE__
: usize = 40;
84 #[cfg(any(target_arch = "x86_64",
85 target_arch
= "aarch64"))]
86 const __PTHREAD_COND_SIZE__
: usize = 40;
87 #[cfg(any(target_arch = "x86",
88 target_arch
= "arm"))]
89 const __PTHREAD_COND_SIZE__
: usize = 24;
91 #[cfg(any(target_arch = "x86_64",
92 target_arch
= "aarch64"))]
93 const __PTHREAD_RWLOCK_SIZE__
: usize = 192;
94 #[cfg(any(target_arch = "x86",
95 target_arch
= "arm"))]
96 const __PTHREAD_RWLOCK_SIZE__
: usize = 124;
98 const _PTHREAD_MUTEX_SIG_INIT
: libc
::c_long
= 0x32AAABA7;
99 const _PTHREAD_COND_SIG_INIT
: libc
::c_long
= 0x3CB0B1BB;
100 const _PTHREAD_RWLOCK_SIG_INIT
: libc
::c_long
= 0x2DA8B3B4;
103 pub struct pthread_mutex_t
{
105 __opaque
: [u8; __PTHREAD_MUTEX_SIZE__
],
108 pub struct pthread_mutexattr_t
{
110 // note, that this is 16 bytes just to be safe, the actual struct might be smaller.
114 pub struct pthread_cond_t
{
116 __opaque
: [u8; __PTHREAD_COND_SIZE__
],
119 pub struct pthread_rwlock_t
{
121 __opaque
: [u8; __PTHREAD_RWLOCK_SIZE__
],
124 pub const PTHREAD_MUTEX_INITIALIZER
: pthread_mutex_t
= pthread_mutex_t
{
125 __sig
: _PTHREAD_MUTEX_SIG_INIT
,
126 __opaque
: [0; __PTHREAD_MUTEX_SIZE__
],
128 pub const PTHREAD_COND_INITIALIZER
: pthread_cond_t
= pthread_cond_t
{
129 __sig
: _PTHREAD_COND_SIG_INIT
,
130 __opaque
: [0; __PTHREAD_COND_SIZE__
],
132 pub const PTHREAD_RWLOCK_INITIALIZER
: pthread_rwlock_t
= pthread_rwlock_t
{
133 __sig
: _PTHREAD_RWLOCK_SIG_INIT
,
134 __opaque
: [0; __PTHREAD_RWLOCK_SIZE__
],
137 pub const PTHREAD_MUTEX_RECURSIVE
: libc
::c_int
= 2;
140 #[cfg(target_os = "linux")]
144 // minus 8 because we have an 'align' field
145 #[cfg(target_arch = "x86_64")]
146 const __SIZEOF_PTHREAD_MUTEX_T
: usize = 40 - 8;
147 #[cfg(any(target_arch = "x86",
149 target_arch
= "mips",
150 target_arch
= "mipsel",
151 target_arch
= "powerpc"))]
152 const __SIZEOF_PTHREAD_MUTEX_T
: usize = 24 - 8;
153 #[cfg(target_arch = "aarch64")]
154 const __SIZEOF_PTHREAD_MUTEX_T
: usize = 48 - 8;
156 #[cfg(any(target_arch = "x86_64",
159 target_arch
= "aarch64",
160 target_arch
= "mips",
161 target_arch
= "mipsel",
162 target_arch
= "powerpc"))]
163 const __SIZEOF_PTHREAD_COND_T
: usize = 48 - 8;
165 #[cfg(any(target_arch = "x86_64",
166 target_arch
= "aarch64"))]
167 const __SIZEOF_PTHREAD_RWLOCK_T
: usize = 56 - 8;
169 #[cfg(any(target_arch = "x86",
171 target_arch
= "mips",
172 target_arch
= "mipsel",
173 target_arch
= "powerpc"))]
174 const __SIZEOF_PTHREAD_RWLOCK_T
: usize = 32 - 8;
177 pub struct pthread_mutex_t
{
178 __align
: libc
::c_longlong
,
179 size
: [u8; __SIZEOF_PTHREAD_MUTEX_T
],
182 pub struct pthread_mutexattr_t
{
183 __align
: libc
::c_longlong
,
184 // note, that this is 16 bytes just to be safe, the actual struct might be smaller.
188 pub struct pthread_cond_t
{
189 __align
: libc
::c_longlong
,
190 size
: [u8; __SIZEOF_PTHREAD_COND_T
],
193 pub struct pthread_rwlock_t
{
194 __align
: libc
::c_longlong
,
195 size
: [u8; __SIZEOF_PTHREAD_RWLOCK_T
],
198 pub const PTHREAD_MUTEX_INITIALIZER
: pthread_mutex_t
= pthread_mutex_t
{
200 size
: [0; __SIZEOF_PTHREAD_MUTEX_T
],
202 pub const PTHREAD_COND_INITIALIZER
: pthread_cond_t
= pthread_cond_t
{
204 size
: [0; __SIZEOF_PTHREAD_COND_T
],
206 pub const PTHREAD_RWLOCK_INITIALIZER
: pthread_rwlock_t
= pthread_rwlock_t
{
208 size
: [0; __SIZEOF_PTHREAD_RWLOCK_T
],
210 pub const PTHREAD_MUTEX_RECURSIVE
: libc
::c_int
= 1;
212 #[cfg(target_os = "android")]
217 pub struct pthread_mutex_t { value: libc::c_int }
218 pub type pthread_mutexattr_t
= libc
::c_long
;
220 pub struct pthread_cond_t { value: libc::c_int }
222 pub struct pthread_rwlock_t
{
223 lock
: pthread_mutex_t
,
224 cond
: pthread_cond_t
,
225 numLocks
: libc
::c_int
,
226 writerThreadId
: libc
::c_int
,
227 pendingReaders
: libc
::c_int
,
228 pendingWriters
: libc
::c_int
,
229 reserved
: [*mut libc
::c_void
; 4],
232 pub const PTHREAD_MUTEX_INITIALIZER
: pthread_mutex_t
= pthread_mutex_t
{
235 pub const PTHREAD_COND_INITIALIZER
: pthread_cond_t
= pthread_cond_t
{
238 pub const PTHREAD_RWLOCK_INITIALIZER
: pthread_rwlock_t
= pthread_rwlock_t
{
239 lock
: PTHREAD_MUTEX_INITIALIZER
,
240 cond
: PTHREAD_COND_INITIALIZER
,
245 reserved
: [0 as *mut _
; 4],
247 pub const PTHREAD_MUTEX_RECURSIVE
: libc
::c_int
= 1;