Ignore:
File:
1 edited

Legend:

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

    rcd5b58f r015925a  
    1919#include "thread.hfa"
    2020
     21#include "kernel/private.hfa"
    2122#include "exception.hfa"
    22 #include "kernel/private.hfa"
    23 #include "limits.hfa"
    2423
    2524#define __CFA_INVOKE_PRIVATE__
     
    2726
    2827extern uint32_t __global_random_seed, __global_random_prime, __global_random_mask;
    29 
    30 #pragma GCC visibility push(default)
    3128
    3229//-----------------------------------------------------------------------------
     
    4441        self_mon_p = &self_mon;
    4542        curr_cluster = &cl;
    46         rdy_link.next = 0p;
    47         rdy_link.ts   = MAX;
     43        link.next = 0p;
     44        link.ts   = -1llu;
    4845        preferred = ready_queue_new_preferred();
    4946        last_proc = 0p;
    5047        random_state = __global_random_mask ? __global_random_prime : __global_random_prime ^ rdtscl();
    5148        #if defined( __CFA_WITH_VERIFY__ )
    52                 executing = 0p;
    5349                canary = 0x0D15EA5E0D15EA5Ep;
    5450        #endif
     51
     52        node.next = 0p;
     53        node.prev = 0p;
    5554
    5655        clh_node = malloc( );
     
    8887}
    8988
    90 forall(T & | is_thread(T) | IS_EXCEPTION(ThreadCancelled(T))
    91     | { EHM_DEFAULT_VTABLE(ThreadCancelled(T)); })
     89forall(T & | is_thread(T) | IS_EXCEPTION(ThreadCancelled, (T))
     90    | { EHM_DEFAULT_VTABLE(ThreadCancelled, (T)); })
    9291void ?{}( thread_dtor_guard_t & this,
    9392                T & thrd, void(*cancelHandler)(ThreadCancelled(T) &)) {
     
    167166
    168167//-----------------------------------------------------------------------------
    169 forall(T & | is_thread(T) | IS_RESUMPTION_EXCEPTION(ThreadCancelled(T))
    170         | { EHM_DEFAULT_VTABLE(ThreadCancelled(T)); })
     168forall(T & | is_thread(T) | IS_RESUMPTION_EXCEPTION(ThreadCancelled, (T))
     169    | { EHM_DEFAULT_VTABLE(ThreadCancelled, (T)); })
    171170T & join( T & this ) {
    172171        thread_dtor_guard_t guard = { this, defaultResumptionHandler };
    173172        return this;
    174 }
    175 
    176 //-----------------------------------------------------------------------------
    177 bool migrate( thread$ * thrd, struct cluster & cl ) {
    178 
    179         monitor$ * tmon = get_monitor(thrd);
    180         monitor$ * __monitors[] = { tmon };
    181         monitor_guard_t __guard = { __monitors, 1 };
    182 
    183 
    184         {
    185                 // if nothing needs to be done, return false
    186                 if( thrd->curr_cluster == &cl ) return false;
    187 
    188                 // are we migrating ourself?
    189                 const bool local = thrd == active_thread();
    190 
    191                 /* paranoid */ verify( !local || &cl != active_cluster() );
    192                 /* paranoid */ verify( !local || thrd->curr_cluster == active_cluster() );
    193                 /* paranoid */ verify( !local || thrd->curr_cluster == active_processor()->cltr );
    194                 /* paranoid */ verify( local || tmon->signal_stack.top->owner->waiting_thread == thrd );
    195                 /* paranoid */ verify( local || tmon->signal_stack.top );
    196 
    197                 // make sure we aren't interrupted while doing this
    198                 // not as important if we aren't local
    199                 disable_interrupts();
    200 
    201                 // actually move the thread
    202                 unregister( thrd->curr_cluster, *thrd );
    203                 thrd->curr_cluster = &cl;
    204                 doregister( thrd->curr_cluster, *thrd );
    205 
    206                 // restore interrupts
    207                 enable_interrupts();
    208 
    209                 // if this is the local thread, we are still running on the old cluster
    210                 if(local) yield();
    211 
    212                 /* paranoid */ verify( !local || &cl == active_cluster() );
    213                 /* paranoid */ verify( !local || thrd->curr_cluster == active_cluster() );
    214                 /* paranoid */ verify( !local || thrd->curr_cluster == active_processor()->cltr );
    215                 /* paranoid */ verify(  local || tmon->signal_stack.top );
    216                 /* paranoid */ verify(  local || tmon->signal_stack.top->owner->waiting_thread == thrd );
    217 
    218                 return true;
    219         }
    220173}
    221174
Note: See TracChangeset for help on using the changeset viewer.