Ignore:
File:
1 edited

Legend:

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

    rafd550c rde94a60  
    4949thread_desc * mainThread;
    5050
     51struct { __dllist_t(thread_desc) list; __spinlock_t lock; } global_threads ;
     52struct { __dllist_t(cluster    ) list; __spinlock_t lock; } global_clusters;
     53
    5154//-----------------------------------------------------------------------------
    5255// Global state
     
    117120        self_mon_p = &self_mon;
    118121        next = NULL;
    119         __cfaabi_dbg_debug_do(
    120                 dbg_next = NULL;
    121                 dbg_prev = NULL;
    122                 __cfaabi_dbg_thread_register(&this);
    123         )
     122
     123        node.next = NULL;
     124        node.prev = NULL;
     125        doregister(this);
    124126
    125127        monitors{ &self_mon_p, 1, (fptr_t)0 };
     
    167169        ready_queue{};
    168170        ready_queue_lock{};
     171
     172        procs{ __get };
     173        idles{ __get };
     174
     175        doregister(this);
    169176}
    170177
    171178void ^?{}(cluster & this) {
    172 
     179        unregister(this);
    173180}
    174181
     
    182189
    183190        __cfaabi_dbg_print_safe("Kernel : core %p starting\n", this);
     191
     192        doregister(this->cltr, this);
    184193
    185194        {
     
    215224                __cfaabi_dbg_print_safe("Kernel : core %p stopping\n", this);
    216225        }
     226
     227        unregister(this->cltr, this);
    217228
    218229        V( this->terminated );
     
    512523        __cfaabi_dbg_print_safe("Kernel : Starting\n");
    513524
     525        global_threads. list{ __get };
     526        global_threads. lock{};
     527        global_clusters.list{ __get };
     528        global_clusters.lock{};
     529
    514530        // Initialize the main cluster
    515531        mainCluster = (cluster *)&storage_mainCluster;
     
    639655
    640656static __spinlock_t kernel_abort_lock;
    641 static __spinlock_t kernel_debug_lock;
    642657static bool kernel_abort_called = false;
    643658
     
    648663
    649664        // first task to abort ?
    650         if ( ! kernel_abort_called ) {                  // not first task to abort ?
     665        if ( kernel_abort_called ) {                    // not first task to abort ?
     666                unlock( kernel_abort_lock );
     667
     668                sigset_t mask;
     669                sigemptyset( &mask );
     670                sigaddset( &mask, SIGALRM );            // block SIGALRM signals
     671                sigsuspend( &mask );                    // block the processor to prevent further damage during abort
     672                _exit( EXIT_FAILURE );                  // if processor unblocks before it is killed, terminate it
     673        }
     674        else {
    651675                kernel_abort_called = true;
    652676                unlock( kernel_abort_lock );
    653677        }
    654         else {
    655                 unlock( kernel_abort_lock );
    656 
    657                 sigset_t mask;
    658                 sigemptyset( &mask );
    659                 sigaddset( &mask, SIGALRM );                    // block SIGALRM signals
    660                 sigaddset( &mask, SIGUSR1 );                    // block SIGUSR1 signals
    661                 sigsuspend( &mask );                            // block the processor to prevent further damage during abort
    662                 _exit( EXIT_FAILURE );                          // if processor unblocks before it is killed, terminate it
    663         }
    664678
    665679        return kernelTLS.this_thread;
     
    669683        thread_desc * thrd = kernel_data;
    670684
    671         int len = snprintf( abort_text, abort_text_size, "Error occurred while executing task %.256s (%p)", thrd->self_cor.name, thrd );
    672         __cfaabi_dbg_bits_write( abort_text, len );
    673 
    674         if ( get_coroutine(thrd) != kernelTLS.this_coroutine ) {
    675                 len = snprintf( abort_text, abort_text_size, " in coroutine %.256s (%p).\n", kernelTLS.this_coroutine->name, kernelTLS.this_coroutine );
     685        if(thrd) {
     686                int len = snprintf( abort_text, abort_text_size, "Error occurred while executing thread %.256s (%p)", thrd->self_cor.name, thrd );
    676687                __cfaabi_dbg_bits_write( abort_text, len );
     688
     689                if ( get_coroutine(thrd) != kernelTLS.this_coroutine ) {
     690                        len = snprintf( abort_text, abort_text_size, " in coroutine %.256s (%p).\n", kernelTLS.this_coroutine->name, kernelTLS.this_coroutine );
     691                        __cfaabi_dbg_bits_write( abort_text, len );
     692                }
     693                else {
     694                        __cfaabi_dbg_bits_write( ".\n", 2 );
     695                }
    677696        }
    678697        else {
    679                 __cfaabi_dbg_bits_write( ".\n", 2 );
     698                int len = snprintf( abort_text, abort_text_size, "Error occurred outside of any thread.\n" );
    680699        }
    681700}
     
    684703        return get_coroutine(kernelTLS.this_thread) == get_coroutine(mainThread) ? 4 : 2;
    685704}
     705
     706static __spinlock_t kernel_debug_lock;
    686707
    687708extern "C" {
     
    738759
    739760//-----------------------------------------------------------------------------
     761// Global Queues
     762void doregister( thread_desc & thrd ) {
     763        // lock      ( global_thread.lock );
     764        // push_front( global_thread.list, thrd );
     765        // unlock    ( global_thread.lock );
     766}
     767
     768void unregister( thread_desc & thrd ) {
     769        // lock  ( global_thread.lock );
     770        // remove( global_thread.list, thrd );
     771        // unlock( global_thread.lock );
     772}
     773
     774void doregister( cluster     & cltr ) {
     775        // lock      ( global_cluster.lock );
     776        // push_front( global_cluster.list, cltr );
     777        // unlock    ( global_cluster.lock );
     778}
     779
     780void unregister( cluster     & cltr ) {
     781        // lock  ( global_cluster.lock );
     782        // remove( global_cluster.list, cltr );
     783        // unlock( global_cluster.lock );
     784}
     785
     786
     787void doregister( cluster * cltr, processor * proc ) {
     788        // lock      (cltr->proc_list_lock __cfaabi_dbg_ctx2);
     789        // push_front(cltr->procs, *proc);
     790        // unlock    (cltr->proc_list_lock);
     791}
     792
     793void unregister( cluster * cltr, processor * proc ) {
     794        // lock  (cltr->proc_list_lock __cfaabi_dbg_ctx2);
     795        // remove(cltr->procs, *proc );
     796        // unlock(cltr->proc_list_lock);
     797}
     798
     799//-----------------------------------------------------------------------------
    740800// Debug
    741801__cfaabi_dbg_debug_do(
    742         struct {
    743                 thread_desc * tail;
    744         } __cfaabi_dbg_thread_list = { NULL };
    745 
    746         void __cfaabi_dbg_thread_register( thread_desc * thrd ) {
    747                 if( !__cfaabi_dbg_thread_list.tail ) {
    748                         __cfaabi_dbg_thread_list.tail = thrd;
    749                         return;
    750                 }
    751                 __cfaabi_dbg_thread_list.tail->dbg_next = thrd;
    752                 thrd->dbg_prev = __cfaabi_dbg_thread_list.tail;
    753                 __cfaabi_dbg_thread_list.tail = thrd;
    754         }
    755 
    756         void __cfaabi_dbg_thread_unregister( thread_desc * thrd ) {
    757                 thread_desc * prev = thrd->dbg_prev;
    758                 thread_desc * next = thrd->dbg_next;
    759 
    760                 if( next ) { next->dbg_prev = prev; }
    761                 else       {
    762                         assert( __cfaabi_dbg_thread_list.tail == thrd );
    763                         __cfaabi_dbg_thread_list.tail = prev;
    764                 }
    765 
    766                 if( prev ) { prev->dbg_next = next; }
    767 
    768                 thrd->dbg_prev = NULL;
    769                 thrd->dbg_next = NULL;
    770         }
    771 
    772802        void __cfaabi_dbg_record(__spinlock_t & this, const char * prev_name) {
    773803                this.prev_name = prev_name;
Note: See TracChangeset for help on using the changeset viewer.