@@ -2,7 +2,7 @@ use cell::UnsafeCell;
2
2
use intrinsics:: { atomic_cxchg, atomic_xchg} ;
3
3
use ptr;
4
4
5
- use libc:: { futex, FUTEX_WAIT , FUTEX_WAKE } ;
5
+ use libc:: { futex, getpid , FUTEX_WAIT , FUTEX_WAKE } ;
6
6
7
7
pub unsafe fn mutex_try_lock ( m : * mut i32 ) -> bool {
8
8
atomic_cxchg ( m, 0 , 1 ) . 0 == 0
@@ -57,27 +57,36 @@ impl Mutex {
57
57
}
58
58
}
59
59
60
+ #[ inline]
60
61
pub unsafe fn init ( & self ) {
61
-
62
+ * self . lock . get ( ) = 0 ;
62
63
}
63
64
64
65
/// Try to lock the mutex
66
+ #[ inline]
65
67
pub unsafe fn try_lock ( & self ) -> bool {
68
+ :: sys_common:: util:: dumb_print ( format_args ! ( "mutex try lock\n " ) ) ;
66
69
mutex_try_lock ( self . lock . get ( ) )
67
70
}
68
71
69
72
/// Lock the mutex
73
+ #[ inline]
70
74
pub unsafe fn lock ( & self ) {
71
- mutex_lock ( self . lock . get ( ) ) ;
75
+ :: sys_common:: util:: dumb_print ( format_args ! ( "mutex lock\n " ) ) ;
76
+ mutex_try_lock ( self . lock . get ( ) ) ;
77
+ //mutex_lock(self.lock.get());
72
78
}
73
79
74
80
/// Unlock the mutex
81
+ #[ inline]
75
82
pub unsafe fn unlock ( & self ) {
83
+ :: sys_common:: util:: dumb_print ( format_args ! ( "mutex unlock\n " ) ) ;
76
84
mutex_unlock ( self . lock . get ( ) ) ;
77
85
}
78
86
87
+ #[ inline]
79
88
pub unsafe fn destroy ( & self ) {
80
-
89
+ * self . lock . get ( ) = 0 ;
81
90
}
82
91
}
83
92
@@ -87,36 +96,78 @@ unsafe impl Sync for Mutex {}
87
96
88
97
pub struct ReentrantMutex {
89
98
pub lock : UnsafeCell < i32 > ,
99
+ pub owner : UnsafeCell < usize > ,
100
+ pub own_count : UnsafeCell < usize > ,
90
101
}
91
102
92
103
impl ReentrantMutex {
93
104
pub const fn uninitialized ( ) -> Self {
94
105
ReentrantMutex {
95
106
lock : UnsafeCell :: new ( 0 ) ,
107
+ owner : UnsafeCell :: new ( 0 ) ,
108
+ own_count : UnsafeCell :: new ( 0 ) ,
96
109
}
97
110
}
98
111
112
+ #[ inline]
99
113
pub unsafe fn init ( & mut self ) {
100
-
114
+ * self . lock . get ( ) = 0 ;
115
+ * self . owner . get ( ) = 0 ;
116
+ * self . own_count . get ( ) = 0 ;
101
117
}
102
118
103
119
/// Try to lock the mutex
120
+ #[ inline]
104
121
pub unsafe fn try_lock ( & self ) -> bool {
105
- mutex_try_lock ( self . lock . get ( ) )
122
+ :: sys_common:: util:: dumb_print ( format_args ! ( "remutex try_lock\n " ) ) ;
123
+ let pid = getpid ( ) . unwrap ( ) ;
124
+ if * self . own_count . get ( ) > 0 && * self . owner . get ( ) == pid {
125
+ * self . own_count . get ( ) += 1 ;
126
+ true
127
+ } else {
128
+ if mutex_try_lock ( self . lock . get ( ) ) {
129
+ * self . owner . get ( ) = pid;
130
+ * self . own_count . get ( ) = 1 ;
131
+ true
132
+ } else {
133
+ false
134
+ }
135
+ }
106
136
}
107
137
108
138
/// Lock the mutex
139
+ #[ inline]
109
140
pub unsafe fn lock ( & self ) {
110
- mutex_lock ( self . lock . get ( ) ) ;
141
+ :: sys_common:: util:: dumb_print ( format_args ! ( "remutex lock\n " ) ) ;
142
+ let pid = getpid ( ) . unwrap ( ) ;
143
+ if * self . own_count . get ( ) > 0 && * self . owner . get ( ) == pid {
144
+ * self . own_count . get ( ) += 1 ;
145
+ } else {
146
+ mutex_lock ( self . lock . get ( ) ) ;
147
+ * self . owner . get ( ) = pid;
148
+ * self . own_count . get ( ) = 1 ;
149
+ }
111
150
}
112
151
113
152
/// Unlock the mutex
153
+ #[ inline]
114
154
pub unsafe fn unlock ( & self ) {
115
- mutex_unlock ( self . lock . get ( ) ) ;
155
+ :: sys_common:: util:: dumb_print ( format_args ! ( "remutex unlock\n " ) ) ;
156
+ let pid = getpid ( ) . unwrap ( ) ;
157
+ if * self . own_count . get ( ) > 0 && * self . owner . get ( ) == pid {
158
+ * self . own_count . get ( ) -= 1 ;
159
+ if * self . own_count . get ( ) == 0 {
160
+ * self . owner . get ( ) = 0 ;
161
+ mutex_unlock ( self . lock . get ( ) ) ;
162
+ }
163
+ }
116
164
}
117
165
166
+ #[ inline]
118
167
pub unsafe fn destroy ( & self ) {
119
-
168
+ * self . lock . get ( ) = 0 ;
169
+ * self . owner . get ( ) = 0 ;
170
+ * self . own_count . get ( ) = 0 ;
120
171
}
121
172
}
122
173
0 commit comments