- File:
-
- 1 edited
-
src/libcfa/concurrency/preemption.c (modified) (6 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/libcfa/concurrency/preemption.c
r4dad189 r381fdee 10 10 // Created On : Mon Jun 5 14:20:42 2017 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Tue Feb 6 15:00:36201813 // Update Count : 1012 // Last Modified On : Fri Feb 9 14:42:34 2018 13 // Update Count : 25 14 14 // 15 15 16 16 #include "preemption.h" 17 17 18 #define ftype `ftype`19 18 extern "C" { 20 19 #include <errno.h> … … 23 22 #include <unistd.h> 24 23 } 25 #undef ftype26 24 27 25 #include "bits/signal.h" … … 50 48 51 49 // Machine specific register name 52 #if defined(__x86_64__) 50 #if defined( __i386 ) 51 #define CFA_REG_IP gregs[REG_EIP] 52 #elif defined( __x86_64 ) 53 53 #define CFA_REG_IP gregs[REG_RIP] 54 #elif defined(__i386__) 55 #define CFA_REG_IP gregs[REG_EIP] 56 #elif defined(__ARM_ARCH__) 54 #elif defined( __ARM_ARCH ) 57 55 #define CFA_REG_IP arm_pc 56 #else 57 #error unknown hardware architecture 58 58 #endif 59 59 … … 66 66 lock{}; 67 67 } 68 69 enum {70 PREEMPT_NORMAL = 0,71 PREEMPT_TERMINATE = 1,72 };73 68 74 69 //============================================================================================= … … 214 209 // kill wrapper : signal a processor 215 210 static void preempt( processor * this ) { 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 ); 211 pthread_kill( this->kernel_thread, SIGUSR1 ); 225 212 } 226 213 … … 311 298 void sigHandler_ctxSwitch( __CFA_SIGPARMS__ ) { 312 299 __cfaabi_dbg_debug_do( last_interrupt = (void *)(cxt->uc_mcontext.CFA_REG_IP); ) 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 arrive316 // before the kernel thread has even started running. When that happens an iterrupt317 // 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 here322 case PREEMPT_TERMINATE: verify(this_processor->do_terminate);323 default:324 abortf( "internal error, signal value is %d", sfp->si_value.sival_int );325 }326 300 327 301 // Check if it is safe to preempt here
Note:
See TracChangeset
for help on using the changeset viewer.