Changeset bede27b for src/libcfa
- Timestamp:
- Feb 9, 2018, 4:39:52 PM (6 years ago)
- Branches:
- ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, with_gc
- Children:
- 298ed08
- Parents:
- 381fdee (diff), a722c7a (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:
- src/libcfa
- Files:
-
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
src/libcfa/bits/debug.c
r381fdee rbede27b 11 11 // Last Modified By : 12 12 // Last Modified On : 13 // Update Count : 013 // Update Count : 1 14 14 // 15 15 … … 47 47 void __cfaabi_dbg_bits_release() __attribute__((__weak__)) {} 48 48 49 void __cfaabi_dbg_bits_print_safe ( const char fmt[], ... ) __attribute__(( format 49 void __cfaabi_dbg_bits_print_safe ( const char fmt[], ... ) __attribute__(( format(printf, 1, 2) )) { 50 50 va_list args; 51 51 … … 60 60 } 61 61 62 void __cfaabi_dbg_bits_print_nolock( const char fmt[], ... ) __attribute__(( format 62 void __cfaabi_dbg_bits_print_nolock( const char fmt[], ... ) __attribute__(( format(printf, 1, 2) )) { 63 63 va_list args; 64 64 … … 76 76 } 77 77 78 void __cfaabi_dbg_bits_print_buffer( char in_buffer[], int in_buffer_size, const char fmt[], ... ) __attribute__(( format 78 void __cfaabi_dbg_bits_print_buffer( char in_buffer[], int in_buffer_size, const char fmt[], ... ) __attribute__(( format(printf, 3, 4) )) { 79 79 va_list args; 80 80 -
src/libcfa/bits/debug.h
r381fdee rbede27b 10 10 // Created On : Mon Nov 28 12:27:26 2016 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Sat Jul 22 10:02:24 201713 // Update Count : 112 // Last Modified On : Thu Feb 8 12:35:19 2018 13 // Update Count : 2 14 14 // 15 15 … … 41 41 extern void __cfaabi_dbg_bits_acquire(); 42 42 extern void __cfaabi_dbg_bits_release(); 43 extern void __cfaabi_dbg_bits_print_safe ( const char fmt[], ... ) __attribute__(( format 44 extern void __cfaabi_dbg_bits_print_nolock( const char fmt[], ... ) __attribute__(( format 43 extern void __cfaabi_dbg_bits_print_safe ( const char fmt[], ... ) __attribute__(( format(printf, 1, 2) )); 44 extern void __cfaabi_dbg_bits_print_nolock( const char fmt[], ... ) __attribute__(( format(printf, 1, 2) )); 45 45 extern void __cfaabi_dbg_bits_print_vararg( const char fmt[], va_list arg ); 46 extern void __cfaabi_dbg_bits_print_buffer( char buffer[], int buffer_size, const char fmt[], ... ) __attribute__(( format 46 extern void __cfaabi_dbg_bits_print_buffer( char buffer[], int buffer_size, const char fmt[], ... ) __attribute__(( format(printf, 3, 4) )); 47 47 #ifdef __cforall 48 48 } -
src/libcfa/bits/defs.h
r381fdee rbede27b 1 // 1 // 2 2 // Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo 3 3 // 4 4 // The contents of this file are covered under the licence agreement in the 5 5 // file "LICENCE" distributed with Cforall. 6 // 7 // defs.h -- 8 // 6 // 7 // defs.h -- 8 // 9 9 // Author : Thierry Delisle 10 10 // Created On : Thu Nov 9 13:24:10 2017 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : T ue Jan 2 09:17:06201813 // Update Count : 214 // 12 // Last Modified On : Thu Feb 8 16:22:41 2018 13 // Update Count : 8 14 // 15 15 16 16 #pragma once … … 34 34 35 35 #ifdef __cforall 36 void abort ( const char fmt[], ... ) __attribute__ (( format(printf, 1, 2), __nothrow__, __leaf__, __noreturn__ )); 36 37 extern "C" { 37 38 #endif 38 void abortf( const char fmt[], ... ) __attribute__ ((__nothrow__, __leaf__, __noreturn__));39 void __cabi_abort( const char fmt[], ... ) __attribute__ (( format(printf, 1, 2), __nothrow__, __leaf__, __noreturn__ )); 39 40 #ifdef __cforall 40 41 } -
src/libcfa/concurrency/coroutine.c
r381fdee rbede27b 10 10 // Created On : Mon Nov 28 12:27:26 2016 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Jul 21 22:34:57 201713 // Update Count : 112 // Last Modified On : Thu Feb 8 16:10:31 2018 13 // Update Count : 4 14 14 // 15 15 … … 77 77 __cfaabi_dbg_debug_do( 78 78 if ( mprotect( this.storage, pageSize, PROT_READ | PROT_WRITE ) == -1 ) { 79 abort f( "(coStack_t *)%p.^?{}() : internal error, mprotect failure, error(%d) %s.", &this, errno, strerror( errno ) );79 abort( "(coStack_t *)%p.^?{}() : internal error, mprotect failure, error(%d) %s.", &this, errno, strerror( errno ) ); 80 80 } 81 81 ); … … 135 135 __cfaabi_dbg_debug_do( 136 136 if ( mprotect( storage, pageSize, PROT_NONE ) == -1 ) { 137 abort f( "(uMachContext &)%p.createContext() : internal error, mprotect failure, error(%d) %s.", this, (int)errno, strerror( (int)errno ) );137 abort( "(uMachContext &)%p.createContext() : internal error, mprotect failure, error(%d) %s.", this, (int)errno, strerror( (int)errno ) ); 138 138 } // if 139 139 ); 140 140 141 141 if ( (intptr_t)storage == 0 ) { 142 abort f( "Attempt to allocate %d bytes of storage for coroutine or task execution-state but insufficient memory available.", size );142 abort( "Attempt to allocate %zd bytes of storage for coroutine or task execution-state but insufficient memory available.", size ); 143 143 } // if 144 144 -
src/libcfa/concurrency/invoke.c
r381fdee rbede27b 10 10 // Created On : Tue Jan 17 12:27:26 2016 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Feb 9 1 4:41:56201813 // Update Count : 312 // Last Modified On : Fri Feb 9 16:37:42 2018 13 // Update Count : 5 14 14 // 15 15 … … 51 51 //Final suspend, should never return 52 52 __leave_coroutine(); 53 abortf("Resumed dead coroutine");53 __cabi_abort( "Resumed dead coroutine" ); 54 54 } 55 55 … … 81 81 //Final suspend, should never return 82 82 __leave_thread_monitor( thrd ); 83 abortf("Resumed dead thread");83 __cabi_abort( "Resumed dead thread" ); 84 84 } 85 85 -
src/libcfa/concurrency/kernel.c
r381fdee rbede27b 168 168 if( ! do_terminate ) { 169 169 __cfaabi_dbg_print_safe("Kernel : core %p signaling termination\n", &this); 170 do_terminate = true;170 terminate(&this); 171 171 P( terminated ); 172 172 pthread_join( kernel_thread, NULL ); -
src/libcfa/concurrency/kernel_private.h
r381fdee rbede27b 60 60 void runThread(processor * this, thread_desc * dst); 61 61 void finishRunning(processor * this); 62 void terminate(processor * this); 62 63 void spin(processor * this, unsigned int * spin_count); 63 64 -
src/libcfa/concurrency/monitor.c
r381fdee rbede27b 10 10 // Created On : Thd Feb 23 12:27:26 2017 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Mon Jul 31 14:59:05 201713 // Update Count : 312 // Last Modified On : Thu Feb 8 16:12:20 2018 13 // Update Count : 4 14 14 // 15 15 … … 87 87 thread_desc * thrd = this_thread; 88 88 89 __cfaabi_dbg_print_safe( "Kernel : %10p Entering mon %p (%p)\n", thrd, this, this->owner);89 __cfaabi_dbg_print_safe( "Kernel : %10p Entering mon %p (%p)\n", thrd, this, this->owner); 90 90 91 91 if( !this->owner ) { … … 93 93 set_owner( this, thrd ); 94 94 95 __cfaabi_dbg_print_safe( "Kernel : mon is free \n");95 __cfaabi_dbg_print_safe( "Kernel : mon is free \n" ); 96 96 } 97 97 else if( this->owner == thrd) { … … 99 99 this->recursion += 1; 100 100 101 __cfaabi_dbg_print_safe( "Kernel : mon already owned \n");101 __cfaabi_dbg_print_safe( "Kernel : mon already owned \n" ); 102 102 } 103 103 else if( is_accepted( this, group) ) { … … 108 108 reset_mask( this ); 109 109 110 __cfaabi_dbg_print_safe( "Kernel : mon accepts \n");110 __cfaabi_dbg_print_safe( "Kernel : mon accepts \n" ); 111 111 } 112 112 else { 113 __cfaabi_dbg_print_safe( "Kernel : blocking \n");113 __cfaabi_dbg_print_safe( "Kernel : blocking \n" ); 114 114 115 115 // Some one else has the monitor, wait in line for it … … 118 118 BlockInternal( &this->lock ); 119 119 120 __cfaabi_dbg_print_safe( "Kernel : %10p Entered mon %p\n", thrd, this);120 __cfaabi_dbg_print_safe( "Kernel : %10p Entered mon %p\n", thrd, this); 121 121 122 122 // BlockInternal will unlock spinlock, no need to unlock ourselves … … 124 124 } 125 125 126 __cfaabi_dbg_print_safe( "Kernel : %10p Entered mon %p\n", thrd, this);126 __cfaabi_dbg_print_safe( "Kernel : %10p Entered mon %p\n", thrd, this); 127 127 128 128 // Release the lock and leave … … 136 136 thread_desc * thrd = this_thread; 137 137 138 __cfaabi_dbg_print_safe( "Kernel : %10p Entering dtor for mon %p (%p)\n", thrd, this, this->owner);138 __cfaabi_dbg_print_safe( "Kernel : %10p Entering dtor for mon %p (%p)\n", thrd, this, this->owner); 139 139 140 140 141 141 if( !this->owner ) { 142 __cfaabi_dbg_print_safe( "Kernel : Destroying free mon %p\n", this);142 __cfaabi_dbg_print_safe( "Kernel : Destroying free mon %p\n", this); 143 143 144 144 // No one has the monitor, just take it … … 151 151 // We already have the monitor... but where about to destroy it so the nesting will fail 152 152 // Abort! 153 abort f("Attempt to destroy monitor %p by thread \"%.256s\" (%p) in nested mutex.");153 abort( "Attempt to destroy monitor %p by thread \"%.256s\" (%p) in nested mutex." ); 154 154 } 155 155 … … 158 158 __monitor_group_t group = { &this, 1, func }; 159 159 if( is_accepted( this, group) ) { 160 __cfaabi_dbg_print_safe( "Kernel : mon accepts dtor, block and signal it \n");160 __cfaabi_dbg_print_safe( "Kernel : mon accepts dtor, block and signal it \n" ); 161 161 162 162 // Wake the thread that is waiting for this … … 177 177 } 178 178 else { 179 __cfaabi_dbg_print_safe( "Kernel : blocking \n");179 __cfaabi_dbg_print_safe( "Kernel : blocking \n" ); 180 180 181 181 wait_ctx( this_thread, 0 ) … … 190 190 } 191 191 192 __cfaabi_dbg_print_safe( "Kernel : Destroying %p\n", this);192 __cfaabi_dbg_print_safe( "Kernel : Destroying %p\n", this); 193 193 194 194 } … … 199 199 lock( this->lock __cfaabi_dbg_ctx2 ); 200 200 201 __cfaabi_dbg_print_safe( "Kernel : %10p Leaving mon %p (%p)\n", this_thread, this, this->owner);201 __cfaabi_dbg_print_safe( "Kernel : %10p Leaving mon %p (%p)\n", this_thread, this, this->owner); 202 202 203 203 verifyf( this_thread == this->owner, "Expected owner to be %p, got %p (r: %i, m: %p)", this_thread, this->owner, this->recursion, this ); … … 209 209 // it means we don't need to do anything 210 210 if( this->recursion != 0) { 211 __cfaabi_dbg_print_safe( "Kernel : recursion still %d\n", this->recursion);211 __cfaabi_dbg_print_safe( "Kernel : recursion still %d\n", this->recursion); 212 212 unlock( this->lock ); 213 213 return; … … 228 228 __cfaabi_dbg_debug_do( 229 229 if( this_thread != this->owner ) { 230 abort f("Destroyed monitor %p has inconsistent owner, expected %p got %p.\n", this, this_thread, this->owner);230 abort( "Destroyed monitor %p has inconsistent owner, expected %p got %p.\n", this, this_thread, this->owner); 231 231 } 232 232 if( this->recursion != 1 ) { 233 abort f("Destroyed monitor %p has %d outstanding nested calls.\n", this, this->recursion - 1);233 abort( "Destroyed monitor %p has %d outstanding nested calls.\n", this, this->recursion - 1); 234 234 } 235 235 ) … … 256 256 // If we haven't left the last level of recursion 257 257 // it must mean there is an error 258 if( this->recursion != 0) { abort f("Thread internal monitor has unbalanced recursion"); }258 if( this->recursion != 0) { abort( "Thread internal monitor has unbalanced recursion" ); } 259 259 260 260 // Fetch the next thread, can be null … … 302 302 (this_thread->monitors){m, count, func}; 303 303 304 // __cfaabi_dbg_print_safe( "MGUARD : enter %d\n", count);304 // __cfaabi_dbg_print_safe( "MGUARD : enter %d\n", count); 305 305 306 306 // Enter the monitors in order … … 308 308 enter( group ); 309 309 310 // __cfaabi_dbg_print_safe( "MGUARD : entered\n");310 // __cfaabi_dbg_print_safe( "MGUARD : entered\n" ); 311 311 } 312 312 … … 314 314 // Dtor for monitor guard 315 315 void ^?{}( monitor_guard_t & this ) { 316 // __cfaabi_dbg_print_safe( "MGUARD : leaving %d\n", this.count);316 // __cfaabi_dbg_print_safe( "MGUARD : leaving %d\n", this.count); 317 317 318 318 // Leave the monitors in order 319 319 leave( this.m, this.count ); 320 320 321 // __cfaabi_dbg_print_safe( "MGUARD : left\n");321 // __cfaabi_dbg_print_safe( "MGUARD : left\n" ); 322 322 323 323 // Restore thread context … … 427 427 thread_desc * this_thrd = this_thread; 428 428 if ( this.monitor_count != this_thrd->monitors.size ) { 429 abort f( "Signal on condition %p made with different number of monitor(s), expected %i got %i", &this, this.monitor_count, this_thrd->monitors.size );429 abort( "Signal on condition %p made with different number of monitor(s), expected %i got %i", &this, this.monitor_count, this_thrd->monitors.size ); 430 430 } 431 431 432 432 for(int i = 0; i < this.monitor_count; i++) { 433 433 if ( this.monitors[i] != this_thrd->monitors[i] ) { 434 abort f( "Signal on condition %p made with different monitor, expected %p got %i", &this, this.monitors[i], this_thrd->monitors[i] );434 abort( "Signal on condition %p made with different monitor, expected %p got %i", &this, this.monitors[i], this_thrd->monitors[i] ); 435 435 } 436 436 } … … 534 534 if(actual_count == 0) return; 535 535 536 __cfaabi_dbg_print_buffer_local( "Kernel : waitfor internal proceeding\n" );536 __cfaabi_dbg_print_buffer_local( "Kernel : waitfor internal proceeding\n" ); 537 537 538 538 // Create storage for monitor context … … 551 551 __acceptable_t& accepted = mask[index]; 552 552 if( accepted.is_dtor ) { 553 __cfaabi_dbg_print_buffer_local( "Kernel : dtor already there\n" );553 __cfaabi_dbg_print_buffer_local( "Kernel : dtor already there\n" ); 554 554 verifyf( accepted.size == 1, "ERROR: Accepted dtor has more than 1 mutex parameter." ); 555 555 … … 563 563 } 564 564 else { 565 __cfaabi_dbg_print_buffer_local( "Kernel : thread present, baton-passing\n" );565 __cfaabi_dbg_print_buffer_local( "Kernel : thread present, baton-passing\n" ); 566 566 567 567 // Create the node specific to this wait operation … … 577 577 } 578 578 #endif 579 __cfaabi_dbg_print_buffer_local( "\n" );579 __cfaabi_dbg_print_buffer_local( "\n" ); 580 580 581 581 // Set the owners to be the next thread … … 588 588 monitor_restore; 589 589 590 __cfaabi_dbg_print_buffer_local( "Kernel : thread present, returned\n" );590 __cfaabi_dbg_print_buffer_local( "Kernel : thread present, returned\n" ); 591 591 } 592 592 … … 598 598 599 599 if( duration == 0 ) { 600 __cfaabi_dbg_print_buffer_local( "Kernel : non-blocking, exiting\n" );600 __cfaabi_dbg_print_buffer_local( "Kernel : non-blocking, exiting\n" ); 601 601 602 602 unlock_all( locks, count ); … … 607 607 608 608 609 verifyf( duration < 0, "Timeout on waitfor statments not supported yet." );610 611 __cfaabi_dbg_print_buffer_local( "Kernel : blocking waitfor\n" );609 verifyf( duration < 0, "Timeout on waitfor statments not supported yet." ); 610 611 __cfaabi_dbg_print_buffer_local( "Kernel : blocking waitfor\n" ); 612 612 613 613 // Create the node specific to this wait operation … … 631 631 monitor_restore; 632 632 633 __cfaabi_dbg_print_buffer_local( "Kernel : exiting\n" );633 __cfaabi_dbg_print_buffer_local( "Kernel : exiting\n" ); 634 634 635 635 __cfaabi_dbg_print_buffer_local( "Kernel : accepted %d\n", *mask.accepted); … … 640 640 641 641 static inline void set_owner( monitor_desc * this, thread_desc * owner ) { 642 // __cfaabi_dbg_print_safe( "Kernal : Setting owner of %p to %p ( was %p)\n", this, owner, this->owner );642 // __cfaabi_dbg_print_safe( "Kernal : Setting owner of %p to %p ( was %p)\n", this, owner, this->owner ); 643 643 644 644 //Pass the monitor appropriately … … 672 672 static inline thread_desc * next_thread( monitor_desc * this ) { 673 673 //Check the signaller stack 674 __cfaabi_dbg_print_safe( "Kernel : mon %p AS-stack top %p\n", this, this->signal_stack.top);674 __cfaabi_dbg_print_safe( "Kernel : mon %p AS-stack top %p\n", this, this->signal_stack.top); 675 675 __condition_criterion_t * urgent = pop( this->signal_stack ); 676 676 if( urgent ) { … … 814 814 thread_desc * thrd = this_thread; 815 815 if( !this.monitors ) { 816 // __cfaabi_dbg_print_safe( "Branding\n");816 // __cfaabi_dbg_print_safe( "Branding\n" ); 817 817 assertf( thrd->monitors.data != NULL, "No current monitor to brand condition %p", thrd->monitors.data ); 818 818 this.monitor_count = thrd->monitors.size; -
src/libcfa/concurrency/preemption.c
r381fdee rbede27b 10 10 // Created On : Mon Jun 5 14:20:42 2017 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Feb 9 1 4:42:34201813 // Update Count : 2512 // Last Modified On : Fri Feb 9 16:38:13 2018 13 // Update Count : 14 14 14 // 15 15 … … 67 67 } 68 68 69 enum { 70 PREEMPT_NORMAL = 0, 71 PREEMPT_TERMINATE = 1, 72 }; 73 69 74 //============================================================================================= 70 75 // Kernel Preemption logic … … 192 197 193 198 if ( pthread_sigmask( SIG_UNBLOCK, &mask, NULL ) == -1 ) { 194 abort f( "internal error, pthread_sigmask" );199 abort( "internal error, pthread_sigmask" ); 195 200 } 196 201 } … … 203 208 204 209 if ( pthread_sigmask( SIG_BLOCK, &mask, NULL ) == -1 ) { 205 abort f( "internal error, pthread_sigmask" );210 abort( "internal error, pthread_sigmask" ); 206 211 } 207 212 } … … 209 214 // kill wrapper : signal a processor 210 215 static void preempt( processor * this ) { 211 pthread_kill( this->kernel_thread, SIGUSR1 ); 216 sigval_t value = { PREEMPT_NORMAL }; 217 pthread_sigqueue( this->kernel_thread, SIGUSR1, value ); 218 } 219 220 // kill wrapper : signal a processor 221 void terminate(processor * this) { 222 this->do_terminate = true; 223 sigval_t value = { PREEMPT_TERMINATE }; 224 pthread_sigqueue( this->kernel_thread, SIGUSR1, value ); 212 225 } 213 226 … … 234 247 // Called from kernel_startup 235 248 void kernel_start_preemption() { 236 __cfaabi_dbg_print_safe( "Kernel : Starting preemption\n");249 __cfaabi_dbg_print_safe( "Kernel : Starting preemption\n" ); 237 250 238 251 // Start with preemption disabled until ready … … 255 268 // Called from kernel_shutdown 256 269 void kernel_stop_preemption() { 257 __cfaabi_dbg_print_safe( "Kernel : Preemption stopping\n");270 __cfaabi_dbg_print_safe( "Kernel : Preemption stopping\n" ); 258 271 259 272 // Block all signals since we are already shutting down … … 271 284 // Preemption is now fully stopped 272 285 273 __cfaabi_dbg_print_safe( "Kernel : Preemption stopped\n");286 __cfaabi_dbg_print_safe( "Kernel : Preemption stopped\n" ); 274 287 } 275 288 … … 299 312 __cfaabi_dbg_debug_do( last_interrupt = (void *)(cxt->uc_mcontext.CFA_REG_IP); ) 300 313 314 // SKULLDUGGERY: if a thread creates a processor and the immediately deletes it, 315 // the interrupt that is supposed to force the kernel thread to preempt might arrive 316 // before the kernel thread has even started running. When that happens an iterrupt 317 // we a null 'this_processor' will be caught, just ignore it. 318 if(!this_processor) return; 319 320 choose(sfp->si_value.sival_int) { 321 case PREEMPT_NORMAL : ;// Normal case, nothing to do here 322 case PREEMPT_TERMINATE: verify(this_processor->do_terminate); 323 default: 324 abort( "internal error, signal value is %d", sfp->si_value.sival_int ); 325 } 326 301 327 // Check if it is safe to preempt here 302 328 if( !preemption_ready() ) { return; } 303 329 304 __cfaabi_dbg_print_buffer_decl( " KERNEL: preempting core %p (%p).\n", this_processor, this_thread);330 __cfaabi_dbg_print_buffer_decl( " KERNEL: preempting core %p (%p).\n", this_processor, this_thread); 305 331 306 332 preemption_in_progress = true; // Sync flag : prevent recursive calls to the signal handler … … 322 348 323 349 if ( pthread_sigmask( SIG_BLOCK, &mask, NULL ) == -1 ) { 324 abort f( "internal error, pthread_sigmask" );350 abort( "internal error, pthread_sigmask" ); 325 351 } 326 352 … … 339 365 continue; 340 366 case EINVAL : 341 abort f("Timeout was invalid.");367 abort( "Timeout was invalid." ); 342 368 default: 343 abort f("Unhandled error %d", err);369 abort( "Unhandled error %d", err); 344 370 } 345 371 } … … 348 374 assertf(sig == SIGALRM, "Kernel Internal Error, sigwait: Unexpected signal %d (%d : %d)\n", sig, info.si_code, info.si_value.sival_int); 349 375 350 // __cfaabi_dbg_print_safe( "Kernel : Caught alarm from %d with %d\n", info.si_code, info.si_value.sival_int );376 // __cfaabi_dbg_print_safe( "Kernel : Caught alarm from %d with %d\n", info.si_code, info.si_value.sival_int ); 351 377 // Switch on the code (a.k.a. the sender) to 352 378 switch( info.si_code ) … … 356 382 case SI_TIMER: 357 383 case SI_KERNEL: 358 // __cfaabi_dbg_print_safe( "Kernel : Preemption thread tick\n");384 // __cfaabi_dbg_print_safe( "Kernel : Preemption thread tick\n" ); 359 385 lock( event_kernel->lock __cfaabi_dbg_ctx2 ); 360 386 tick_preemption(); … … 370 396 371 397 EXIT: 372 __cfaabi_dbg_print_safe( "Kernel : Preemption thread stopping\n");398 __cfaabi_dbg_print_safe( "Kernel : Preemption thread stopping\n" ); 373 399 return NULL; 374 400 } -
src/libcfa/interpose.c
r381fdee rbede27b 10 10 // Created On : Wed Mar 29 16:10:31 2017 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : T ue Feb 6 17:57:56201813 // Update Count : 4912 // Last Modified On : Thu Feb 8 16:18:09 2018 13 // Update Count : 75 14 14 // 15 15 … … 33 33 #include "startup.h" 34 34 35 //============================================================================================= 36 // Interposing helpers 37 //============================================================================================= 38 35 39 typedef void (*generic_fptr_t)(void); 36 40 generic_fptr_t interpose_symbol( const char* symbol, const char *version ) { … … 46 50 error = dlerror(); 47 51 if ( error ) { 48 abort f( "interpose_symbol : failed to open libc, %s\n", error );52 abort( "interpose_symbol : failed to open libc, %s\n", error ); 49 53 } 50 54 #endif … … 64 68 65 69 error = dlerror(); 66 if ( error ) abort f( "interpose_symbol : internal error, %s\n", error );70 if ( error ) abort( "interpose_symbol : internal error, %s\n", error ); 67 71 68 72 return originalFunc.fptr; 69 73 } 70 74 71 72 __typeof__( exit ) libc_exit __attribute__(( noreturn ));73 __typeof__( abort ) libc_abort __attribute__(( noreturn ));74 75 75 forall(dtype T) 76 static inline void assign_ptr( T** symbol_ptr, const char * symbol_name, const char * version) {76 static inline void ptr_from_symbol( T** symbol_ptr, const char * symbol_name, const char * version) { 77 77 union { 78 78 generic_fptr_t gp; … … 85 85 } 86 86 87 #define INIT_REALRTN( x, ver ) assign_ptr( (void**)&libc_##x, #x, ver) 87 #define INTERPOSE_LIBC( x, ver ) ptr_from_symbol( (void**)&__cabi_libc.x, #x, ver) 88 89 //============================================================================================= 90 // Terminating Signals logic 91 //============================================================================================= 88 92 89 93 void sigHandler_segv ( __CFA_SIGPARMS__ ); … … 92 96 void sigHandler_abort( __CFA_SIGPARMS__ ); 93 97 98 struct { 99 void (* exit)( int ) __attribute__ (( __noreturn__ )); 100 void (* abort)( void ) __attribute__ (( __noreturn__ )); 101 } __cabi_libc; 102 94 103 extern "C" { 95 104 void __cfaabi_interpose_startup(void) __attribute__(( constructor( STARTUP_PRIORITY_CORE ) )); … … 97 106 const char *version = NULL; 98 107 99 IN IT_REALRTN( abort, version );100 IN IT_REALRTN( exit, version );108 INTERPOSE_LIBC( abort, version ); 109 INTERPOSE_LIBC( exit , version ); 101 110 102 111 __cfaabi_sigaction( SIGSEGV, sigHandler_segv , SA_SIGINFO ); // Failure handler … … 112 121 //============================================================================================= 113 122 123 // Forward declare abort after the __typeof__ call to avoid ambiguities 124 void exit( int status, const char fmt[], ... ) __attribute__ (( format(printf, 2, 3), __nothrow__, __leaf__, __noreturn__ )); 125 void abort( const char fmt[], ... ) __attribute__ (( format(printf, 1, 2), __nothrow__, __leaf__, __noreturn__ )); 126 114 127 extern "C" { 115 void abort( void ) __attribute__ (( __nothrow__, __leaf__, __noreturn__)) {116 abort f( NULL );117 } 118 119 void exit( int __status ) __attribute__ ((__nothrow__, __leaf__, __noreturn__)) {120 libc_exit(__status);121 }122 } 123 124 void abort( const char fmt[], ... ) __attribute__ ((__nothrow__, __leaf__, __noreturn__)) { 125 va_list argp; 126 v a_start( argp, fmt );127 abortf( fmt, argp);128 va_end( argp );129 } 130 131 void * kernel_abort ( void ) __attribute__ (( __nothrow__, __leaf__, __weak__)) { return NULL; }132 void kernel_abort_msg( void * data, char * buffer, int size ) __attribute__ (( __nothrow__, __leaf__, __weak__)) {}133 int kernel_abort_lastframe( void ) __attribute__ (( __nothrow__, __leaf__, __weak__)) { return 4; }128 void abort( void ) __attribute__ (( __nothrow__, __leaf__, __noreturn__ )) { 129 abort( NULL ); 130 } 131 132 void __cabi_abort( const char fmt[], ... ) __attribute__ (( format(printf, 1, 2), __nothrow__, __leaf__, __noreturn__ )) { 133 va_list argp; 134 va_start( argp, fmt ); 135 abort( fmt, argp ); 136 va_end( argp ); 137 } 138 139 void exit( int status ) __attribute__ (( __nothrow__, __leaf__, __noreturn__ )) { 140 __cabi_libc.exit( status ); 141 } 142 } 143 144 void * kernel_abort ( void ) __attribute__ (( __nothrow__, __leaf__, __weak__ )) { return NULL; } 145 void kernel_abort_msg( void * data, char * buffer, int size ) __attribute__ (( __nothrow__, __leaf__, __weak__ )) {} 146 int kernel_abort_lastframe( void ) __attribute__ (( __nothrow__, __leaf__, __weak__ )) { return 4; } 134 147 135 148 enum { abort_text_size = 1024 }; … … 137 150 static int abort_lastframe; 138 151 139 extern "C" { 140 void abortf( const char fmt[], ... ) __attribute__ ((__nothrow__, __leaf__, __noreturn__)) { 141 void * kernel_data = kernel_abort(); // must be done here to lock down kernel 142 int len; 143 144 abort_lastframe = kernel_abort_lastframe(); 145 len = snprintf( abort_text, abort_text_size, "Cforall Runtime error (UNIX pid:%ld) ", (long int)getpid() ); // use UNIX pid (versus getPid) 152 void exit( int status, const char fmt[], ... ) __attribute__ (( format(printf, 2, 3), __nothrow__, __leaf__, __noreturn__ )) { 153 va_list args; 154 va_start( args, fmt ); 155 vfprintf( stderr, fmt, args ); 156 va_end( args ); 157 __cabi_libc.exit( status ); 158 } 159 160 void abort( const char fmt[], ... ) __attribute__ (( format(printf, 1, 2), __nothrow__, __leaf__, __noreturn__ )) { 161 void * kernel_data = kernel_abort(); // must be done here to lock down kernel 162 int len; 163 164 abort_lastframe = kernel_abort_lastframe(); 165 len = snprintf( abort_text, abort_text_size, "Cforall Runtime error (UNIX pid:%ld) ", (long int)getpid() ); // use UNIX pid (versus getPid) 166 __cfaabi_dbg_bits_write( abort_text, len ); 167 168 if ( fmt ) { 169 va_list args; 170 va_start( args, fmt ); 171 172 len = vsnprintf( abort_text, abort_text_size, fmt, args ); 173 va_end( args ); 146 174 __cfaabi_dbg_bits_write( abort_text, len ); 147 175 148 if ( fmt ) { 149 va_list args; 150 va_start( args, fmt ); 151 152 len = vsnprintf( abort_text, abort_text_size, fmt, args ); 153 va_end( args ); 154 __cfaabi_dbg_bits_write( abort_text, len ); 155 156 if ( fmt[strlen( fmt ) - 1] != '\n' ) { // add optional newline if missing at the end of the format text 157 __cfaabi_dbg_bits_write( "\n", 1 ); 158 } 159 } 160 161 kernel_abort_msg( kernel_data, abort_text, abort_text_size ); 162 libc_abort(); 163 } 176 if ( fmt[strlen( fmt ) - 1] != '\n' ) { // add optional newline if missing at the end of the format text 177 __cfaabi_dbg_bits_write( "\n", 1 ); 178 } 179 } 180 181 kernel_abort_msg( kernel_data, abort_text, abort_text_size ); 182 __cabi_libc.abort(); 164 183 } 165 184 … … 215 234 216 235 void sigHandler_segv( __CFA_SIGPARMS__ ) { 217 abort f( "Attempt to addresslocation %p\n"236 abort( "Addressing invalid memory at location %p\n" 218 237 "Possible cause is reading outside the address space or writing to a protected area within the address space with an invalid pointer or subscript.\n", 219 238 sfp->si_addr ); … … 221 240 222 241 void sigHandler_ill( __CFA_SIGPARMS__ ) { 223 abort f( "Attempt to execute codeat location %p.\n"242 abort( "Executing illegal instruction at location %p.\n" 224 243 "Possible cause is stack corruption.\n", 225 244 sfp->si_addr ); … … 229 248 const char * msg; 230 249 231 switch ( sfp->si_code ) { 232 case FPE_INTDIV: 233 case FPE_FLTDIV: msg = "divide by zero"; break; 234 case FPE_FLTOVF: msg = "overflow"; break; 235 case FPE_FLTUND: msg = "underflow"; break; 236 case FPE_FLTRES: msg = "inexact result"; break; 237 case FPE_FLTINV: msg = "invalid operation"; break; 250 choose( sfp->si_code ) { 251 case FPE_INTDIV, FPE_FLTDIV: msg = "divide by zero"; 252 case FPE_FLTOVF: msg = "overflow"; 253 case FPE_FLTUND: msg = "underflow"; 254 case FPE_FLTRES: msg = "inexact result"; 255 case FPE_FLTINV: msg = "invalid operation"; 238 256 default: msg = "unknown"; 239 } // switch 240 abortf( "Floating point error.\n" 241 "Cause is %s.\n", msg ); 257 } // choose 258 abort( "Computation error %s at location %p.\n", msg, sfp->si_addr ); 242 259 } 243 260
Note: See TracChangeset
for help on using the changeset viewer.