@@ -8,6 +8,7 @@ fn main() {
8
8
test_mutex ( ) ;
9
9
#[ cfg( not( target_os = "windows" ) ) ] // TODO: implement RwLock on Windows
10
10
{
11
+ test_mutex_libc_recursive ( ) ;
11
12
test_rwlock_stdlib ( ) ;
12
13
test_rwlock_libc_init ( ) ;
13
14
test_rwlock_libc_static_initializer ( ) ;
@@ -24,6 +25,28 @@ fn test_mutex() {
24
25
drop ( m) ;
25
26
}
26
27
28
+ #[ cfg( not( target_os = "windows" ) ) ]
29
+ fn test_mutex_libc_recursive ( ) {
30
+ unsafe {
31
+ let mut attr: libc:: pthread_mutexattr_t = std:: mem:: zeroed ( ) ;
32
+ assert_eq ! ( libc:: pthread_mutexattr_init( & mut attr as * mut _) , 0 ) ;
33
+ assert_eq ! ( libc:: pthread_mutexattr_settype( & mut attr as * mut _, libc:: PTHREAD_MUTEX_RECURSIVE ) , 0 ) ;
34
+ let mut mutex: libc:: pthread_mutex_t = std:: mem:: zeroed ( ) ;
35
+ assert_eq ! ( libc:: pthread_mutex_init( & mut mutex as * mut _, & mut attr as * mut _) , 0 ) ;
36
+ assert_eq ! ( libc:: pthread_mutex_lock( & mut mutex as * mut _) , 0 ) ;
37
+ assert_eq ! ( libc:: pthread_mutex_trylock( & mut mutex as * mut _) , 0 ) ;
38
+ assert_eq ! ( libc:: pthread_mutex_unlock( & mut mutex as * mut _) , 0 ) ;
39
+ assert_eq ! ( libc:: pthread_mutex_unlock( & mut mutex as * mut _) , 0 ) ;
40
+ assert_eq ! ( libc:: pthread_mutex_trylock( & mut mutex as * mut _) , 0 ) ;
41
+ assert_eq ! ( libc:: pthread_mutex_lock( & mut mutex as * mut _) , 0 ) ;
42
+ assert_eq ! ( libc:: pthread_mutex_unlock( & mut mutex as * mut _) , 0 ) ;
43
+ assert_eq ! ( libc:: pthread_mutex_unlock( & mut mutex as * mut _) , 0 ) ;
44
+ assert_eq ! ( libc:: pthread_mutex_unlock( & mut mutex as * mut _) , libc:: EPERM ) ;
45
+ assert_eq ! ( libc:: pthread_mutex_destroy( & mut mutex as * mut _) , 0 ) ;
46
+ assert_eq ! ( libc:: pthread_mutexattr_destroy( & mut attr as * mut _) , 0 ) ;
47
+ }
48
+ }
49
+
27
50
#[ cfg( not( target_os = "windows" ) ) ]
28
51
fn test_rwlock_stdlib ( ) {
29
52
let rw = RwLock :: new ( 0 ) ;
0 commit comments