Changeset c66f6cb
- Timestamp:
- May 6, 2020, 2:03:13 PM (5 years ago)
- Branches:
- ADT, arm-eh, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, master, new-ast, new-ast-unique-expr, pthread-emulation, qualifiedEnum
- Children:
- 171ca0d
- Parents:
- 08a994e
- Location:
- libcfa/src
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/bits/locks.hfa
r08a994e rc66f6cb 112 112 #endif 113 113 114 extern "C" { 115 char * strerror(int); 116 } 117 #define CHECKED(x) { int err = x; if( err != 0 ) abort("KERNEL ERROR: %s\n", strerror(err)); } 118 114 119 struct __bin_sem_t { 115 120 pthread_mutex_t lock; … … 119 124 120 125 static inline void ?{}(__bin_sem_t & this) with( this ) { 121 pthread_mutex_init(&lock, NULL); 122 pthread_cond_init (&cond, NULL); 126 // Create the mutex with error checking 127 pthread_mutexattr_t mattr; 128 pthread_mutexattr_init( &mattr ); 129 pthread_mutexattr_settype( &mattr, PTHREAD_MUTEX_ERRORCHECK_NP); 130 pthread_mutex_init(&lock, &mattr); 131 132 pthread_cond_init (&cond, 0p); 123 133 val = 0; 124 134 } 125 135 126 136 static inline void ^?{}(__bin_sem_t & this) with( this ) { 127 pthread_mutex_destroy(&lock);128 pthread_cond_destroy (&cond);137 CHECKED( pthread_mutex_destroy(&lock) ); 138 CHECKED( pthread_cond_destroy (&cond) ); 129 139 } 130 140 131 141 static inline void wait(__bin_sem_t & this) with( this ) { 132 142 verify(__cfaabi_dbg_in_kernel()); 133 pthread_mutex_lock(&lock);143 CHECKED( pthread_mutex_lock(&lock) ); 134 144 while(val < 1) { 135 145 pthread_cond_wait(&cond, &lock); 136 146 } 137 147 val -= 1; 138 pthread_mutex_unlock(&lock);148 CHECKED( pthread_mutex_unlock(&lock) ); 139 149 } 140 150 … … 142 152 bool needs_signal = false; 143 153 144 pthread_mutex_lock(&lock);154 CHECKED( pthread_mutex_lock(&lock) ); 145 155 if(val < 1) { 146 156 val += 1; … … 148 158 needs_signal = true; 149 159 } 150 pthread_mutex_unlock(&lock);160 CHECKED( pthread_mutex_unlock(&lock) ); 151 161 152 162 return needs_signal; 153 163 } 164 165 #undef CHECKED 154 166 #endif -
libcfa/src/concurrency/kernel.cfa
r08a994e rc66f6cb 250 250 } 251 251 252 pthread_join( kernel_thread, 0p ); 252 int err = pthread_join( kernel_thread, 0p ); 253 if( err != 0 ) abort("KERNEL ERROR: joining processor %p caused error %s\n", &this, strerror(err)); 254 253 255 free( this.stack ); 254 256 } … … 824 826 // Destroy the main processor and its context in reverse order of construction 825 827 // These were manually constructed so we need manually destroy them 828 void ^?{}(processor & this) with( this ){ 829 /* paranoid */ verify( this.do_terminate == true ); 830 } 831 826 832 ^(*mainProcessor){}; 827 833
Note: See TracChangeset
for help on using the changeset viewer.