- File:
-
- 1 edited
-
libcfa/src/concurrency/kernel/startup.cfa (modified) (14 diffs)
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/concurrency/kernel/startup.cfa
rdddb3dd0 rda3963a 22 22 extern "C" { 23 23 #include <limits.h> // PTHREAD_STACK_MIN 24 #include <sys/eventfd.h> // eventfd25 24 #include <sys/mman.h> // mprotect 26 25 #include <sys/resource.h> // getrlimit … … 81 80 static void ?{}(processorCtx_t & this) {} 82 81 static void ?{}(processorCtx_t & this, processor * proc, current_stack_info_t * info); 82 static void ?{}(__bin_sem_t & this); 83 static void ^?{}(__bin_sem_t & this); 83 84 84 85 #if defined(__CFA_WITH_VERIFY__) … … 90 91 extern void __kernel_alarm_startup(void); 91 92 extern void __kernel_alarm_shutdown(void); 93 extern void __kernel_io_startup (void); 94 extern void __kernel_io_shutdown(void); 92 95 93 96 //----------------------------------------------------------------------------- … … 101 104 KERNEL_STORAGE($thread, mainThread); 102 105 KERNEL_STORAGE(__stack_t, mainThreadCtx); 106 KERNEL_STORAGE(io_context, mainPollerThread); 103 107 KERNEL_STORAGE(__scheduler_RWLock_t, __scheduler_lock); 104 108 #if !defined(__CFA_NO_STATISTICS__) … … 196 200 197 201 void ?{}(processor & this) with( this ) { 202 ( this.idle ){}; 198 203 ( this.terminated ){}; 199 204 ( this.runner ){}; … … 223 228 __kernel_alarm_startup(); 224 229 230 // Start IO 231 __kernel_io_startup(); 232 225 233 // Add the main thread to the ready queue 226 234 // once resume is called on mainProcessor->runner the mainThread needs to be scheduled like any normal thread … … 235 243 // THE SYSTEM IS NOW COMPLETELY RUNNING 236 244 245 246 // SKULLDUGGERY: The constructor for the mainCluster will call alloc with a dimension of 0 247 // malloc *can* return a non-null value, we should free it if that is the case 248 free( mainCluster->io.ctxs ); 249 250 // Now that the system is up, finish creating systems that need threading 251 mainCluster->io.ctxs = (io_context *)&storage_mainPollerThread; 252 mainCluster->io.cnt = 1; 253 (*mainCluster->io.ctxs){ *mainCluster }; 254 237 255 __cfadbg_print_safe(runtime_core, "Kernel : Started\n--------------------------------------------------\n\n"); 238 256 … … 244 262 245 263 static void __kernel_shutdown(void) { 264 //Before we start shutting things down, wait for systems that need threading to shutdown 265 ^(*mainCluster->io.ctxs){}; 266 mainCluster->io.cnt = 0; 267 mainCluster->io.ctxs = 0p; 268 246 269 /* paranoid */ verify( __preemption_enabled() ); 247 270 disable_interrupts(); … … 261 284 // Disable preemption 262 285 __kernel_alarm_shutdown(); 286 287 // Stop IO 288 __kernel_io_shutdown(); 263 289 264 290 // Destroy the main processor and its context in reverse order of construction … … 460 486 pending_preemption = false; 461 487 462 this.io.ctx = 0p;463 this.io.pending = false;464 this.io.dirty = false;465 466 this.idle = eventfd(0, 0);467 if (idle < 0) {468 abort("KERNEL ERROR: PROCESSOR EVENTFD - %s\n", strerror(errno));469 }470 471 488 #if !defined(__CFA_NO_STATISTICS__) 472 489 print_stats = 0; … … 509 526 // Finally we don't need the read_lock any more 510 527 unregister((__processor_id_t*)&this); 511 512 close(this.idle);513 528 } 514 529 515 530 void ?{}(processor & this, const char name[], cluster & _cltr) { 531 ( this.idle ){}; 516 532 ( this.terminated ){}; 517 533 ( this.runner ){}; … … 568 584 threads{ __get }; 569 585 570 io.arbiter = create();571 io.params = io_params;572 573 586 doregister(this); 574 587 … … 583 596 ready_mutate_unlock( last_size ); 584 597 enable_interrupts_noPoll(); // Don't poll, could be in main cluster 598 599 600 this.io.cnt = num_io; 601 this.io.ctxs = aalloc(num_io); 602 for(i; this.io.cnt) { 603 (this.io.ctxs[i]){ this, io_params }; 604 } 585 605 } 586 606 587 607 void ^?{}(cluster & this) { 588 destroy(this.io.arbiter); 608 for(i; this.io.cnt) { 609 ^(this.io.ctxs[i]){ true }; 610 } 611 free(this.io.ctxs); 589 612 590 613 // Lock the RWlock so no-one pushes/pops while we are changing the queue … … 715 738 } 716 739 740 extern "C" { 741 char * strerror(int); 742 } 743 #define CHECKED(x) { int err = x; if( err != 0 ) abort("KERNEL ERROR: Operation \"" #x "\" return error %d - %s\n", err, strerror(err)); } 744 745 static void ?{}(__bin_sem_t & this) with( this ) { 746 // Create the mutex with error checking 747 pthread_mutexattr_t mattr; 748 pthread_mutexattr_init( &mattr ); 749 pthread_mutexattr_settype( &mattr, PTHREAD_MUTEX_ERRORCHECK_NP); 750 pthread_mutex_init(&lock, &mattr); 751 752 pthread_cond_init (&cond, (const pthread_condattr_t *)0p); // workaround trac#208: cast should not be required 753 val = 0; 754 } 755 756 static void ^?{}(__bin_sem_t & this) with( this ) { 757 CHECKED( pthread_mutex_destroy(&lock) ); 758 CHECKED( pthread_cond_destroy (&cond) ); 759 } 760 761 #undef CHECKED 762 717 763 #if defined(__CFA_WITH_VERIFY__) 718 764 static bool verify_fwd_bck_rng(void) {
Note:
See TracChangeset
for help on using the changeset viewer.