Changeset 6a490b2 for libcfa/src/bits
- Timestamp:
- May 11, 2020, 1:53:29 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:
- 504a7dc
- Parents:
- b7d6a36 (diff), a7b486b (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)links above to see all the changes relative to each parent. - Location:
- libcfa/src/bits
- Files:
-
- 4 edited
-
containers.hfa (modified) (3 diffs)
-
debug.hfa (modified) (6 diffs)
-
locks.hfa (modified) (5 diffs)
-
signal.hfa (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/bits/containers.hfa
rb7d6a36 r6a490b2 146 146 static inline forall( dtype T | is_node(T) ) { 147 147 void ?{}( __queue(T) & this ) with( this ) { 148 head{ 0p };148 head{ 1p }; 149 149 tail{ &head }; 150 verify(*tail == 1p); 150 151 } 151 152 152 153 void append( __queue(T) & this, T * val ) with( this ) { 153 154 verify(tail != 0p); 155 verify(*tail == 1p); 154 156 *tail = val; 155 157 tail = &get_next( *val ); 158 *tail = 1p; 156 159 } 157 160 158 161 T * pop_head( __queue(T) & this ) { 162 verify(*this.tail == 1p); 159 163 T * head = this.head; 160 if( head ) {164 if( head != 1p ) { 161 165 this.head = get_next( *head ); 162 if( !get_next( *head )) {166 if( get_next( *head ) == 1p ) { 163 167 this.tail = &this.head; 164 168 } 165 169 get_next( *head ) = 0p; 166 } 167 return head; 170 verify(*this.tail == 1p); 171 verify( get_next(*head) == 0p ); 172 return head; 173 } 174 verify(*this.tail == 1p); 175 return 0p; 168 176 } 169 177 … … 180 188 get_next( *val ) = 0p; 181 189 182 verify( (head == 0p) == (&head == tail) );183 verify( *tail == 0p );190 verify( (head == 1p) == (&head == tail) ); 191 verify( *tail == 1p ); 184 192 return val; 185 193 } … … 266 274 return this.head != 0; 267 275 } 276 277 void move_to_front( __dllist(T) & src, __dllist(T) & dst, T & node ) { 278 remove (src, node); 279 push_front(dst, node); 280 } 268 281 } 269 282 #undef next -
libcfa/src/bits/debug.hfa
rb7d6a36 r6a490b2 9 9 // Author : Thierry Delisle 10 10 // Created On : Mon Nov 28 12:27:26 2016 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Tue Feb 4 12:29:21202013 // Update Count : 911 // Last Modified By : Andrew Beach 12 // Last Modified On : Mon Apr 27 10:15:00 2020 13 // Update Count : 10 14 14 // 15 15 … … 23 23 #define __cfaabi_dbg_ctx_param const char caller[] 24 24 #define __cfaabi_dbg_ctx_param2 , const char caller[] 25 #define __cfaabi_dbg_ctx_fwd caller 26 #define __cfaabi_dbg_ctx_fwd2 , caller 25 27 #else 26 28 #define __cfaabi_dbg_debug_do(...) … … 30 32 #define __cfaabi_dbg_ctx_param 31 33 #define __cfaabi_dbg_ctx_param2 34 #define __cfaabi_dbg_ctx_fwd 35 #define __cfaabi_dbg_ctx_fwd2 32 36 #endif 33 37 … … 36 40 #endif 37 41 #include <stdarg.h> 38 #include <stdio.h>39 #include <unistd.h>40 42 41 43 extern void __cfaabi_bits_write( int fd, const char buffer[], int len ); … … 46 48 extern void __cfaabi_bits_print_vararg( int fd, const char fmt[], va_list arg ); 47 49 extern void __cfaabi_bits_print_buffer( int fd, char buffer[], int buffer_size, const char fmt[], ... ) __attribute__(( format(printf, 4, 5) )); 50 51 #if defined(__CFA_DEBUG_PRINT__) \ 52 || defined(__CFA_DEBUG_PRINT_IO__) || defined(__CFA_DEBUG_PRINT_IO_CORE__) \ 53 || defined(__CFA_DEBUG_PRINT_MONITOR__) || defined(__CFA_DEBUG_PRINT_PREEMPTION__) \ 54 || defined(__CFA_DEBUG_PRINT_RUNTIME_CORE__) || defined(__CFA_DEBUG_PRINT_EXCEPTION__) 55 #include <stdio.h> 56 #include <unistd.h> 57 #endif 48 58 #ifdef __cforall 49 59 } 50 60 #endif 51 61 52 // #define __CFA_DEBUG_PRINT__ 53 62 // Deprecated: Use the versions with the new module names. 54 63 #ifdef __CFA_DEBUG_PRINT__ 55 64 #define __cfaabi_dbg_write( buffer, len ) __cfaabi_bits_write( STDERR_FILENO, buffer, len ) 56 65 #define __cfaabi_dbg_acquire() __cfaabi_bits_acquire() 57 66 #define __cfaabi_dbg_release() __cfaabi_bits_release() 58 #define __cfaabi_dbg_print_safe(...) __cfaabi_bits_print_safe ( STDERR_FILENO, __VA_ARGS__ )59 #define __cfaabi_dbg_print_nolock(...) __cfaabi_bits_print_nolock ( STDERR_FILENO, __VA_ARGS__ )60 #define __cfaabi_dbg_print_buffer(...) __cfaabi_bits_print_buffer ( STDERR_FILENO, __VA_ARGS__ )67 #define __cfaabi_dbg_print_safe(...) __cfaabi_bits_print_safe ( STDERR_FILENO, __VA_ARGS__ ) 68 #define __cfaabi_dbg_print_nolock(...) __cfaabi_bits_print_nolock ( STDERR_FILENO, __VA_ARGS__ ) 69 #define __cfaabi_dbg_print_buffer(...) __cfaabi_bits_print_buffer ( STDERR_FILENO, __VA_ARGS__ ) 61 70 #define __cfaabi_dbg_print_buffer_decl(...) char __dbg_text[256]; int __dbg_len = snprintf( __dbg_text, 256, __VA_ARGS__ ); __cfaabi_bits_write( STDERR_FILENO, __dbg_text, __dbg_len ); 62 #define __cfaabi_dbg_print_buffer_local(...) __dbg_len = snprintf( __dbg_text, 256, __VA_ARGS__ ); __cfaabi_ bits_write( STDERR_FILENO, __dbg_text, __dbg_len );71 #define __cfaabi_dbg_print_buffer_local(...) __dbg_len = snprintf( __dbg_text, 256, __VA_ARGS__ ); __cfaabi_dbg_write( STDERR_FILENO, __dbg_text, __dbg_len ); 63 72 #else 64 73 #define __cfaabi_dbg_write(...) ((void)0) … … 72 81 #endif 73 82 83 // Debug print functions and statements: 84 // Most are wrappers around the bits printing function but are not always used. 85 // If they are used depends if the group (first argument) is active or not. The group must be one 86 // defined belowe. The other arguments depend on the wrapped function. 87 #define __cfadbg_write(group, buffer, len) \ 88 __CFADBG_PRINT_GROUP_##group(__cfaabi_bits_write(STDERR_FILENO, buffer, len)) 89 #define __cfadbg_acquire(group) \ 90 __CFADBG_PRINT_GROUP_##group(__cfaabi_bits_acquire()) 91 #define __cfadbg_release(group) \ 92 __CFADBG_PRINT_GROUP_##group(__cfaabi_bits_release()) 93 #define __cfadbg_print_safe(group, ...) \ 94 __CFADBG_PRINT_GROUP_##group(__cfaabi_bits_print_safe(STDERR_FILENO, __VA_ARGS__)) 95 #define __cfadbg_print_nolock(group, ...) \ 96 __CFADBG_PRINT_GROUP_##group(__cfaabi_bits_print_nolock(STDERR_FILENO, __VA_ARGS__)) 97 #define __cfadbg_print_buffer(group, ...) \ 98 __CFADBG_PRINT_GROUP_##group(__cfaabi_bits_print_buffer(STDERR_FILENO, __VA_ARGS__)) 99 #define __cfadbg_print_buffer_decl(group, ...) \ 100 __CFADBG_PRINT_GROUP_##group(char __dbg_text[256]; int __dbg_len = snprintf( __dbg_text, 256, __VA_ARGS__ ); __cfaabi_bits_write( __dbg_text, __dbg_len )) 101 #define __cfadbg_print_buffer_local(group, ...) \ 102 __CFADBG_PRINT_GROUP_##group(__dbg_len = snprintf( __dbg_text, 256, __VA_ARGS__ ); __cfaabi_bits_write(STDERR_FILENO, __dbg_text, __dbg_len)) 103 104 // The debug print groups: 105 #if defined(__CFA_DEBUG_PRINT__) || defined(__CFA_DEBUG_PRINT_IO__) 106 # define __CFADBG_PRINT_GROUP_io(...) __VA_ARGS__ 107 #else 108 # define __CFADBG_PRINT_GROUP_io(...) ((void)0) 109 #endif 110 #if defined(__CFA_DEBUG_PRINT__) || defined(__CFA_DEBUG_PRINT_IO__) || defined(__CFA_DEBUG_PRINT_IO_CORE__) 111 # define __CFADBG_PRINT_GROUP_io_core(...) __VA_ARGS__ 112 #else 113 # define __CFADBG_PRINT_GROUP_io_core(...) ((void)0) 114 #endif 115 #if defined(__CFA_DEBUG_PRINT__) || defined(__CFA_DEBUG_PRINT_MONITOR__) 116 # define __CFADBG_PRINT_GROUP_monitor(...) __VA_ARGS__ 117 #else 118 # define __CFADBG_PRINT_GROUP_monitor(...) ((void)0) 119 #endif 120 #if defined(__CFA_DEBUG_PRINT__) || defined(__CFA_DEBUG_PRINT_PREEMPTION__) 121 # define __CFADBG_PRINT_GROUP_preemption(...) __VA_ARGS__ 122 #else 123 # define __CFADBG_PRINT_GROUP_preemption(...) ((void)0) 124 #endif 125 #if defined(__CFA_DEBUG_PRINT__) || defined(__CFA_DEBUG_PRINT_RUNTIME_CORE__) 126 # define __CFADBG_PRINT_GROUP_runtime_core(...) __VA_ARGS__ 127 #else 128 # define __CFADBG_PRINT_GROUP_runtime_core(...) ((void)0) 129 #endif 130 #if defined(__CFA_DEBUG_PRINT__) || defined(__CFA_DEBUG_PRINT_READY_QUEUE__) 131 # define __CFADBG_PRINT_GROUP_ready_queue(...) __VA_ARGS__ 132 #else 133 # define __CFADBG_PRINT_GROUP_ready_queue(...) ((void)0) 134 #endif 135 #if defined(__CFA_DEBUG_PRINT__) || defined(__CFA_DEBUG_PRINT_EXCEPTION__) 136 # define __CFADBG_PRINT_GROUP_exception(...) __VA_ARGS__ 137 #else 138 # define __CFADBG_PRINT_GROUP_exception(...) ((void)0) 139 #endif 140 74 141 // Local Variables: // 75 142 // mode: c // -
libcfa/src/bits/locks.hfa
rb7d6a36 r6a490b2 54 54 55 55 #ifdef __CFA_DEBUG__ 56 void __cfaabi_dbg_record (__spinlock_t & this, const char prev_name[]);56 void __cfaabi_dbg_record_lock(__spinlock_t & this, const char prev_name[]); 57 57 #else 58 #define __cfaabi_dbg_record (x, y)58 #define __cfaabi_dbg_record_lock(x, y) 59 59 #endif 60 60 } 61 62 extern void yield( unsigned int );63 61 64 62 static inline void ?{}( __spinlock_t & this ) { … … 68 66 // Lock the spinlock, return false if already acquired 69 67 static inline bool try_lock ( __spinlock_t & this __cfaabi_dbg_ctx_param2 ) { 68 disable_interrupts(); 70 69 bool result = (this.lock == 0) && (__atomic_test_and_set( &this.lock, __ATOMIC_ACQUIRE ) == 0); 71 70 if( result ) { 72 disable_interrupts(); 73 __cfaabi_dbg_record( this, caller ); 71 __cfaabi_dbg_record_lock( this, caller ); 72 } else { 73 enable_interrupts_noPoll(); 74 74 } 75 75 return result; … … 83 83 #endif 84 84 85 disable_interrupts(); 85 86 for ( unsigned int i = 1;; i += 1 ) { 86 87 if ( (this.lock == 0) && (__atomic_test_and_set( &this.lock, __ATOMIC_ACQUIRE ) == 0) ) break; … … 98 99 #endif 99 100 } 100 disable_interrupts(); 101 __cfaabi_dbg_record( this, caller ); 101 __cfaabi_dbg_record_lock( this, caller ); 102 102 } 103 103 104 104 static inline void unlock( __spinlock_t & this ) { 105 __atomic_clear( &this.lock, __ATOMIC_RELEASE ); 105 106 enable_interrupts_noPoll(); 106 __atomic_clear( &this.lock, __ATOMIC_RELEASE );107 107 } 108 108 … … 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: Operation \"" #x "\" return error %d - %s\n", err, strerror(err)); } 118 114 119 struct __bin_sem_t { 115 bool signaled;116 120 pthread_mutex_t lock; 117 121 pthread_cond_t cond; 122 int val; 118 123 }; 119 124 120 125 static inline void ?{}(__bin_sem_t & this) with( this ) { 121 signaled = false; 122 pthread_mutex_init(&lock, NULL); 123 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); 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);134 if(!signaled) { // this must be a loop, not if!143 CHECKED( pthread_mutex_lock(&lock) ); 144 while(val < 1) { 135 145 pthread_cond_wait(&cond, &lock); 136 146 } 137 signaled = false;138 pthread_mutex_unlock(&lock);147 val -= 1; 148 CHECKED( pthread_mutex_unlock(&lock) ); 139 149 } 140 150 141 static inline voidpost(__bin_sem_t & this) with( this ) {142 verify(__cfaabi_dbg_in_kernel());151 static inline bool post(__bin_sem_t & this) with( this ) { 152 bool needs_signal = false; 143 153 144 pthread_mutex_lock(&lock); 145 bool needs_signal = !signaled; 146 signaled = true; 147 pthread_mutex_unlock(&lock); 154 CHECKED( pthread_mutex_lock(&lock) ); 155 if(val < 1) { 156 val += 1; 157 pthread_cond_signal(&cond); 158 needs_signal = true; 159 } 160 CHECKED( pthread_mutex_unlock(&lock) ); 148 161 149 if (needs_signal) 150 pthread_cond_signal(&cond); 162 return needs_signal; 151 163 } 164 165 #undef CHECKED 152 166 #endif -
libcfa/src/bits/signal.hfa
rb7d6a36 r6a490b2 54 54 sig, handler, flags, errno, strerror( errno ) 55 55 ); 56 _ exit( EXIT_FAILURE );56 _Exit( EXIT_FAILURE ); 57 57 } // if 58 58 }
Note:
See TracChangeset
for help on using the changeset viewer.