Ignore:
Timestamp:
Dec 10, 2020, 1:26:44 PM (3 years ago)
Author:
Thierry Delisle <tdelisle@…>
Branches:
ADT, arm-eh, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, master, new-ast-unique-expr, pthread-emulation, qualifiedEnum
Children:
297cf18, 8b73526, 98168b9
Parents:
c920317
Message:

check_preemption is now one of the interrupt protected functions.

File:
1 edited

Legend:

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

    rc920317 radf34b3  
    354354}
    355355
     356//-----------------------------------------------------------------------------
     357// Kernel Signal Debug
     358void __cfaabi_check_preemption() {
     359        bool ready = __preemption_enabled();
     360        if(!ready) { abort("Preemption should be ready"); }
     361
     362        __cfaasm_label(debug, before);
     363
     364                sigset_t oldset;
     365                int ret;
     366                ret = pthread_sigmask(0, ( const sigset_t * ) 0p, &oldset);  // workaround trac#208: cast should be unnecessary
     367                if(ret != 0) { abort("ERROR sigprocmask returned %d", ret); }
     368
     369                ret = sigismember(&oldset, SIGUSR1);
     370                if(ret <  0) { abort("ERROR sigismember returned %d", ret); }
     371                if(ret == 1) { abort("ERROR SIGUSR1 is disabled"); }
     372
     373                ret = sigismember(&oldset, SIGALRM);
     374                if(ret <  0) { abort("ERROR sigismember returned %d", ret); }
     375                if(ret == 0) { abort("ERROR SIGALRM is enabled"); }
     376
     377                ret = sigismember(&oldset, SIGTERM);
     378                if(ret <  0) { abort("ERROR sigismember returned %d", ret); }
     379                if(ret == 1) { abort("ERROR SIGTERM is disabled"); }
     380
     381        __cfaasm_label(debug, after);
     382}
     383
     384#ifdef __CFA_WITH_VERIFY__
     385bool __cfaabi_dbg_in_kernel() {
     386        return !__preemption_enabled();
     387}
     388#endif
     389
    356390#undef __cfaasm_label
     391
     392//-----------------------------------------------------------------------------
     393// Signal handling
    357394
    358395// sigprocmask wrapper : unblock a single signal
     
    479516        __cfaasm_label( check  );
    480517        __cfaasm_label( dsable );
     518        __cfaasm_label( debug  );
    481519
    482520        // Check if preemption is safe
     
    485523        if( __cfaasm_in( ip, check  ) ) { ready = false; goto EXIT; };
    486524        if( __cfaasm_in( ip, dsable ) ) { ready = false; goto EXIT; };
     525        if( __cfaasm_in( ip, debug  ) ) { ready = false; goto EXIT; };
    487526        if( !__cfaabi_tls.preemption_state.enabled) { ready = false; goto EXIT; };
    488527        if( __cfaabi_tls.preemption_state.in_progress ) { ready = false; goto EXIT; };
     
    697736}
    698737
    699 //=============================================================================================
    700 // Kernel Signal Debug
    701 //=============================================================================================
    702 
    703 void __cfaabi_check_preemption() {
    704         bool ready = __preemption_enabled();
    705         if(!ready) { abort("Preemption should be ready"); }
    706 
    707         sigset_t oldset;
    708         int ret;
    709         ret = pthread_sigmask(0, ( const sigset_t * ) 0p, &oldset);  // workaround trac#208: cast should be unnecessary
    710         if(ret != 0) { abort("ERROR sigprocmask returned %d", ret); }
    711 
    712         ret = sigismember(&oldset, SIGUSR1);
    713         if(ret <  0) { abort("ERROR sigismember returned %d", ret); }
    714         if(ret == 1) { abort("ERROR SIGUSR1 is disabled"); }
    715 
    716         ret = sigismember(&oldset, SIGALRM);
    717         if(ret <  0) { abort("ERROR sigismember returned %d", ret); }
    718         if(ret == 0) { abort("ERROR SIGALRM is enabled"); }
    719 
    720         ret = sigismember(&oldset, SIGTERM);
    721         if(ret <  0) { abort("ERROR sigismember returned %d", ret); }
    722         if(ret == 1) { abort("ERROR SIGTERM is disabled"); }
    723 }
    724 
    725 #ifdef __CFA_WITH_VERIFY__
    726 bool __cfaabi_dbg_in_kernel() {
    727         return !__preemption_enabled();
    728 }
    729 #endif
    730 
    731738// Local Variables: //
    732739// mode: c //
Note: See TracChangeset for help on using the changeset viewer.