- Timestamp:
- Jan 15, 2021, 3:22:50 PM (5 years ago)
- Branches:
- ADT, arm-eh, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, master, new-ast-unique-expr, pthread-emulation, qualifiedEnum
- Children:
- 02b73ea
- Parents:
- 03ecdcf (diff), d46bdac (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
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/concurrency/io.cfa
r03ecdcf r77ff383 390 390 block++; 391 391 392 abort( "Kernel I/O : all submit queue entries used, yielding\n" );393 394 392 yield(); 395 393 } -
libcfa/src/concurrency/io/setup.cfa
r03ecdcf r77ff383 42 42 void ^?{}(io_context & this, bool cluster_context) {} 43 43 44 void register_fixed_files( io_context &, int *, unsigned ) {} 45 void register_fixed_files( cluster &, int *, unsigned ) {} 46 44 47 #else 45 48 #include <errno.h> -
libcfa/src/concurrency/kernel.cfa
r03ecdcf r77ff383 140 140 preemption_scope scope = { this }; 141 141 142 #if !defined(__CFA_NO_STATISTICS__) 143 unsigned long long last_tally = rdtscl(); 144 #endif 145 146 142 147 __cfadbg_print_safe(runtime_core, "Kernel : core %p started\n", this); 143 148 … … 206 211 // Are we done? 207 212 if( __atomic_load_n(&this->do_terminate, __ATOMIC_SEQ_CST) ) break MAIN_LOOP; 213 214 #if !defined(__CFA_NO_STATISTICS__) 215 unsigned long long curr = rdtscl(); 216 if(curr > (last_tally + 500000000)) { 217 __tally_stats(this->cltr->stats, __cfaabi_tls.this_stats); 218 last_tally = curr; 219 } 220 #endif 208 221 } 209 222 … … 611 624 // Unexpected Terminating logic 612 625 //============================================================================================= 613 static __spinlock_t kernel_abort_lock; 614 static bool kernel_abort_called = false; 626 627 extern "C" { 628 extern void __cfaabi_real_abort(void); 629 } 630 static volatile bool kernel_abort_called = false; 615 631 616 632 void * kernel_abort(void) __attribute__ ((__nothrow__)) { 617 633 // abort cannot be recursively entered by the same or different processors because all signal handlers return when 618 634 // the globalAbort flag is true. 619 lock( kernel_abort_lock __cfaabi_dbg_ctx2 ); 635 bool first = __atomic_test_and_set( &kernel_abort_called, __ATOMIC_SEQ_CST); 636 637 // first task to abort ? 638 if ( !first ) { 639 // We aren't the first to abort. 640 // I give up, just let C handle it 641 __cfaabi_real_abort(); 642 } 620 643 621 644 // disable interrupts, it no longer makes sense to try to interrupt this processor 622 645 disable_interrupts(); 623 624 // first task to abort ?625 if ( kernel_abort_called ) { // not first task to abort ?626 unlock( kernel_abort_lock );627 628 sigset_t mask;629 sigemptyset( &mask );630 sigaddset( &mask, SIGALRM ); // block SIGALRM signals631 sigaddset( &mask, SIGUSR1 ); // block SIGALRM signals632 sigsuspend( &mask ); // block the processor to prevent further damage during abort633 _exit( EXIT_FAILURE ); // if processor unblocks before it is killed, terminate it634 }635 else {636 kernel_abort_called = true;637 unlock( kernel_abort_lock );638 }639 646 640 647 return __cfaabi_tls.this_thread; -
libcfa/src/concurrency/stats.hfa
r03ecdcf r77ff383 2 2 3 3 #include <stdint.h> 4 5 enum { 6 CFA_STATS_READY_Q = 0x01, 7 CFA_STATS_IO = 0x02, 8 }; 4 9 5 10 #if defined(__CFA_NO_STATISTICS__) … … 9 14 static inline void __print_stats( struct __stats_t *, int, const char *, const char *, void * ) {} 10 15 #else 11 enum {12 CFA_STATS_READY_Q = 0x01,13 #if defined(CFA_HAVE_LINUX_IO_URING_H)14 CFA_STATS_IO = 0x02,15 #endif16 };17 16 18 17 struct __attribute__((aligned(64))) __stats_readQ_t { -
libcfa/src/interpose.cfa
r03ecdcf r77ff383 284 284 } 285 285 286 extern "C" { 287 void __cfaabi_real_abort(void) { 288 __cabi_libc.abort(); 289 } 290 } 291 286 292 void sigHandler_segv( __CFA_SIGPARMS__ ) { 287 293 if ( sfp->si_addr == 0p ) { -
libcfa/src/parseargs.cfa
r03ecdcf r77ff383 30 30 31 31 static void usage(char * cmd, cfa_option options[], size_t opt_count, const char * usage, FILE * out) __attribute__ ((noreturn)); 32 32 //----------------------------------------------------------------------------- 33 // checking 34 static void check_args(cfa_option options[], size_t opt_count) { 35 for(i; opt_count) { 36 for(j; opt_count) { 37 if(i == j) continue; 38 39 if( options[i].short_name != '\0' 40 && options[i].short_name == options[j].short_name) 41 abort("Parse Args error: two options have short name '%c' (%zu & %zu)", options[i].short_name, i, j); 42 43 if(0 == strcmp(options[i].long_name, options[j].long_name)) abort("Parse Args error: two options have long name '%s' (%zu & %zu)", options[i].long_name, i, j); 44 } 45 } 46 } 47 48 49 //----------------------------------------------------------------------------- 50 // Parsing args 33 51 void parse_args( cfa_option options[], size_t opt_count, const char * usage, char ** & left ) { 34 52 if( 0p != &cfa_args_argc ) { … … 41 59 } 42 60 43 //-----------------------------------------------------------------------------44 // getopt_long wrapping45 61 void parse_args( 46 62 int argc, … … 51 67 char ** & left 52 68 ) { 69 check_args(options, opt_count); 70 71 int maxv = 'h'; 72 char optstring[opt_count * 3] = { '\0' }; 73 { 74 int idx = 0; 75 for(i; opt_count) { 76 if (options[i].short_name) { 77 maxv = max(options[i].short_name, maxv); 78 optstring[idx] = options[i].short_name; 79 idx++; 80 if( ((intptr_t)options[i].parse) != ((intptr_t)parse_settrue) 81 && ((intptr_t)options[i].parse) != ((intptr_t)parse_setfalse) ) { 82 optstring[idx] = ':'; 83 idx++; 84 } 85 } 86 } 87 optstring[idx+0] = 'h'; 88 optstring[idx+1] = '\0'; 89 } 90 53 91 struct option optarr[opt_count + 2]; 54 92 { … … 56 94 for(i; opt_count) { 57 95 if(options[i].long_name) { 96 options[i].val = (options[i].short_name != '\0') ? ((int)options[i].short_name) : ++maxv; 58 97 optarr[idx].name = options[i].long_name; 59 98 optarr[idx].flag = 0p; 60 optarr[idx].val = options[i]. short_name;99 optarr[idx].val = options[i].val; 61 100 if( ((intptr_t)options[i].parse) == ((intptr_t)parse_settrue) 62 101 || ((intptr_t)options[i].parse) == ((intptr_t)parse_setfalse) ) { … … 70 109 optarr[idx+0].[name, has_arg, flag, val] = ["help", no_argument, 0, 'h']; 71 110 optarr[idx+1].[name, has_arg, flag, val] = [0, no_argument, 0, 0]; 72 }73 74 char optstring[opt_count * 3] = { '\0' };75 {76 int idx = 0;77 for(i; opt_count) {78 optstring[idx] = options[i].short_name;79 idx++;80 if( ((intptr_t)options[i].parse) != ((intptr_t)parse_settrue)81 && ((intptr_t)options[i].parse) != ((intptr_t)parse_setfalse) ) {82 optstring[idx] = ':';83 idx++;84 }85 }86 optstring[idx+0] = 'h';87 optstring[idx+1] = '\0';88 111 } 89 112 … … 103 126 default: 104 127 for(i; opt_count) { 105 if(opt == options[i]. short_name) {128 if(opt == options[i].val) { 106 129 const char * arg = optarg ? optarg : ""; 107 130 if( arg[0] == '=' ) { arg++; } -
libcfa/src/parseargs.hfa
r03ecdcf r77ff383 2 2 3 3 struct cfa_option { 4 int val; // reserved 4 5 char short_name; 5 6 const char * long_name; … … 15 16 forall(dtype T | { bool parse(const char *, T & ); }) 16 17 static inline void ?{}( cfa_option & this, char short_name, const char * long_name, const char * help, T & variable ) { 18 this.val = 0; 17 19 this.short_name = short_name; 18 20 this.long_name = long_name; … … 24 26 forall(dtype T) 25 27 static inline void ?{}( cfa_option & this, char short_name, const char * long_name, const char * help, T & variable, bool (*parse)(const char *, T & )) { 28 this.val = 0; 26 29 this.short_name = short_name; 27 30 this.long_name = long_name;
Note:
See TracChangeset
for help on using the changeset viewer.