Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/libcfa/concurrency/preemption.c

    r4dad189 r381fdee  
    1010// Created On       : Mon Jun 5 14:20:42 2017
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Tue Feb  6 15:00:36 2018
    13 // Update Count     : 10
     12// Last Modified On : Fri Feb  9 14:42:34 2018
     13// Update Count     : 25
    1414//
    1515
    1616#include "preemption.h"
    1717
    18 #define ftype `ftype`
    1918extern "C" {
    2019#include <errno.h>
     
    2322#include <unistd.h>
    2423}
    25 #undef ftype
    2624
    2725#include "bits/signal.h"
     
    5048
    5149// 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 )
    5353#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 )
    5755#define CFA_REG_IP arm_pc
     56#else
     57#error unknown hardware architecture
    5858#endif
    5959
     
    6666        lock{};
    6767}
    68 
    69 enum {
    70         PREEMPT_NORMAL    = 0,
    71         PREEMPT_TERMINATE = 1,
    72 };
    7368
    7469//=============================================================================================
     
    214209// kill wrapper : signal a processor
    215210static 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 );
    225212}
    226213
     
    311298void sigHandler_ctxSwitch( __CFA_SIGPARMS__ ) {
    312299        __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 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                         abortf( "internal error, signal value is %d", sfp->si_value.sival_int );
    325         }
    326300
    327301        // Check if it is safe to preempt here
Note: See TracChangeset for help on using the changeset viewer.