@@ -2,7 +2,7 @@ use cell::UnsafeCell;
22use intrinsics:: { atomic_cxchg, atomic_xchg} ;
33use ptr;
44
5- use libc:: { futex, FUTEX_WAIT , FUTEX_WAKE } ;
5+ use libc:: { futex, getpid , FUTEX_WAIT , FUTEX_WAKE } ;
66
77pub unsafe fn mutex_try_lock ( m : * mut i32 ) -> bool {
88 atomic_cxchg ( m, 0 , 1 ) . 0 == 0
@@ -57,27 +57,36 @@ impl Mutex {
5757 }
5858 }
5959
60+ #[ inline]
6061 pub unsafe fn init ( & self ) {
61-
62+ * self . lock . get ( ) = 0 ;
6263 }
6364
6465 /// Try to lock the mutex
66+ #[ inline]
6567 pub unsafe fn try_lock ( & self ) -> bool {
68+ :: sys_common:: util:: dumb_print ( format_args ! ( "mutex try lock\n " ) ) ;
6669 mutex_try_lock ( self . lock . get ( ) )
6770 }
6871
6972 /// Lock the mutex
73+ #[ inline]
7074 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());
7278 }
7379
7480 /// Unlock the mutex
81+ #[ inline]
7582 pub unsafe fn unlock ( & self ) {
83+ :: sys_common:: util:: dumb_print ( format_args ! ( "mutex unlock\n " ) ) ;
7684 mutex_unlock ( self . lock . get ( ) ) ;
7785 }
7886
87+ #[ inline]
7988 pub unsafe fn destroy ( & self ) {
80-
89+ * self . lock . get ( ) = 0 ;
8190 }
8291}
8392
@@ -87,36 +96,78 @@ unsafe impl Sync for Mutex {}
8796
8897pub struct ReentrantMutex {
8998 pub lock : UnsafeCell < i32 > ,
99+ pub owner : UnsafeCell < usize > ,
100+ pub own_count : UnsafeCell < usize > ,
90101}
91102
92103impl ReentrantMutex {
93104 pub const fn uninitialized ( ) -> Self {
94105 ReentrantMutex {
95106 lock : UnsafeCell :: new ( 0 ) ,
107+ owner : UnsafeCell :: new ( 0 ) ,
108+ own_count : UnsafeCell :: new ( 0 ) ,
96109 }
97110 }
98111
112+ #[ inline]
99113 pub unsafe fn init ( & mut self ) {
100-
114+ * self . lock . get ( ) = 0 ;
115+ * self . owner . get ( ) = 0 ;
116+ * self . own_count . get ( ) = 0 ;
101117 }
102118
103119 /// Try to lock the mutex
120+ #[ inline]
104121 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+ }
106136 }
107137
108138 /// Lock the mutex
139+ #[ inline]
109140 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+ }
111150 }
112151
113152 /// Unlock the mutex
153+ #[ inline]
114154 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+ }
116164 }
117165
166+ #[ inline]
118167 pub unsafe fn destroy ( & self ) {
119-
168+ * self . lock . get ( ) = 0 ;
169+ * self . owner . get ( ) = 0 ;
170+ * self . own_count . get ( ) = 0 ;
120171 }
121172}
122173
0 commit comments