Changes in / [578e6037:24fc196]


Ignore:
Location:
src
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • src/benchmark/create_pthrd.c

    r578e6037 r24fc196  
    1717
    1818        for (size_t i = 0; i < n; i++) {
    19                 pthread_attr_t attr;
    20                 if (pthread_attr_init(&attr) < 0) {
     19                pthread_t thread;
     20                if (pthread_create(&thread, NULL, foo, NULL) < 0) {
    2121                        return 1;
    2222                }
    23                 if (pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED) < 0) {
    24                         return 1;
    25                 }
    26                 pthread_t thread;
    27                 if (pthread_create(&thread, &attr, foo, NULL) < 0) {
     23
     24                if (pthread_join( thread, NULL) < 0) {
    2825                        return 1;
    2926                }
  • src/libcfa/concurrency/kernel.c

    r578e6037 r24fc196  
    6060volatile thread_local coroutine_desc * this_coroutine;
    6161volatile thread_local thread_desc * this_thread;
     62volatile thread_local bool preemption_in_progress = 0;
    6263volatile thread_local unsigned short disable_preempt_count = 1;
    6364
  • src/libcfa/concurrency/kernel_private.h

    r578e6037 r24fc196  
    7979extern volatile thread_local coroutine_desc * this_coroutine;
    8080extern volatile thread_local thread_desc * this_thread;
     81extern volatile thread_local bool preemption_in_progress;
    8182extern volatile thread_local unsigned short disable_preempt_count;
    8283
  • src/libcfa/concurrency/preemption.c

    r578e6037 r24fc196  
    180180
    181181static inline bool preemption_ready() {
    182         return disable_preempt_count == 0;
     182        return disable_preempt_count == 0 && !preemption_in_progress;
    183183}
    184184
     
    218218
    219219void kernel_stop_preemption() {
     220        LIB_DEBUG_PRINT_SAFE("Kernel : Preemption stopping\n");
     221
    220222        sigset_t mask;
    221223        sigfillset( &mask );
    222224        sigprocmask( SIG_BLOCK, &mask, NULL );
    223225
    224         pthread_kill( alarm_thread, SIGINT );
     226        sigval val = { 1 };
     227        pthread_sigqueue( alarm_thread, SIGALRM, val );
    225228        pthread_join( alarm_thread, NULL );
    226229        LIB_DEBUG_PRINT_SAFE("Kernel : Preemption stopped\n");
     
    247250        LIB_DEBUG_DO( last_interrupt = (void *)(cxt->uc_mcontext.gregs[CFA_REG_IP]); )
    248251        if( preemption_ready() ) {
     252                preemption_in_progress = true;
    249253                signal_unblock( SIGUSR1 );
     254                this_processor->pending_preemption = false;
     255                preemption_in_progress = false;
    250256                BlockInternal( (thread_desc*)this_thread );
    251257        }
     
    254260        }
    255261}
    256 
    257 // void sigHandler_alarm( __CFA_SIGPARMS__ ) {
    258 //      LIB_DEBUG_DO( last_interrupt = (void *)(cxt->uc_mcontext.gregs[CFA_REG_IP]); )
    259 //      verify( this_processor == systemProcessor );
    260 
    261 //      if( try_lock( &systemProcessor->alarm_lock DEBUG_CTX2 ) ) {
    262 //              tick_preemption();
    263 //              systemProcessor->pending_alarm = false;
    264 //              unlock( &systemProcessor->alarm_lock );
    265 //      }
    266 //      else {
    267 //              defer_alarm();
    268 //      }
    269 
    270 //      signal_unblock( SIGALRM );
    271 
    272 //      if( preemption_ready() && this_processor->pending_preemption ) {
    273 
    274 //              this_processor->pending_preemption = false;
    275 //              BlockInternal( (thread_desc*)this_thread );
    276 //      }
    277 // }
    278262
    279263void * alarm_loop( __attribute__((unused)) void * args ) {
     
    281265        sigemptyset( &mask );
    282266        sigaddset( &mask, SIGALRM );
    283         sigaddset( &mask, SIGUSR2 );
    284         sigaddset( &mask, SIGINT  );
    285267
    286268        if ( pthread_sigmask( SIG_BLOCK, &mask, NULL ) == -1 ) {
     
    289271
    290272        while( true ) {
    291                 int sig;
    292                 if( sigwait( &mask, &sig ) != 0  ) {
     273                siginfo_t info;
     274                int sig = sigwaitinfo( &mask, &info );
     275                if( sig < 0 ) {
    293276                        abortf( "internal error, sigwait" );
    294277                }
    295 
    296                 switch( sig) {
    297                         case SIGALRM:
     278                else if( sig == SIGALRM )
     279                {
     280                        LIB_DEBUG_PRINT_SAFE("Kernel : Caught signal %d (%d)\n", sig, info.si_value.sival_int );
     281                        if( info.si_value.sival_int == 0 )
     282                        {
    298283                                LIB_DEBUG_PRINT_SAFE("Kernel : Preemption thread tick\n");
    299284                                lock( &systemProcessor->alarm_lock DEBUG_CTX2 );
    300285                                tick_preemption();
    301286                                unlock( &systemProcessor->alarm_lock );
     287                        }
     288                        else if( info.si_value.sival_int == 1 )
     289                        {
    302290                                break;
    303                         case SIGUSR2:
    304                                 //TODO other actions
    305                                 break;
    306                         case SIGINT:
    307                                 LIB_DEBUG_PRINT_SAFE("Kernel : Preemption thread stopping\n");
    308                                 return NULL;
    309                         default:
    310                                 abortf( "internal error, sigwait returned sig %d", sig );
    311                                 break;
    312                 }
    313         }
     291                        }
     292                }
     293                else
     294                {
     295                        LIB_DEBUG_PRINT_SAFE("Kernel : Unexpected signal %d (%d)\n", sig, info.si_value.sival_int);
     296                }
     297        }
     298
     299        LIB_DEBUG_PRINT_SAFE("Kernel : Preemption thread stopping\n");
     300        return NULL;
    314301}
    315302
  • src/tests/preempt_longrun/Makefile.am

    r578e6037 r24fc196  
    1616
    1717repeats=10
    18 max_time=30
     18max_time=600
    1919preempt=1_000ul
    2020
  • src/tests/preempt_longrun/Makefile.in

    r578e6037 r24fc196  
    449449top_srcdir = @top_srcdir@
    450450repeats = 10
    451 max_time = 30
     451max_time = 600
    452452preempt = 1_000ul
    453453REPEAT = ${abs_top_srcdir}/tools/repeat -s
  • src/tests/preempt_longrun/create.c

    r578e6037 r24fc196  
    1515
    1616int main(int argc, char* argv[]) {
     17        processor p;
    1718        for(int i = 0; i < 10_000ul; i++) {
    1819                worker_t w[7];
Note: See TracChangeset for help on using the changeset viewer.