Ignore:
File:
1 edited

Legend:

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

    r015925a rcd5b58f  
    1919#include "thread.hfa"
    2020
     21#include "exception.hfa"
    2122#include "kernel/private.hfa"
    22 #include "exception.hfa"
     23#include "limits.hfa"
    2324
    2425#define __CFA_INVOKE_PRIVATE__
     
    2627
    2728extern uint32_t __global_random_seed, __global_random_prime, __global_random_mask;
     29
     30#pragma GCC visibility push(default)
    2831
    2932//-----------------------------------------------------------------------------
     
    4144        self_mon_p = &self_mon;
    4245        curr_cluster = &cl;
    43         link.next = 0p;
    44         link.ts   = -1llu;
     46        rdy_link.next = 0p;
     47        rdy_link.ts   = MAX;
    4548        preferred = ready_queue_new_preferred();
    4649        last_proc = 0p;
    4750        random_state = __global_random_mask ? __global_random_prime : __global_random_prime ^ rdtscl();
    4851        #if defined( __CFA_WITH_VERIFY__ )
     52                executing = 0p;
    4953                canary = 0x0D15EA5E0D15EA5Ep;
    5054        #endif
    51 
    52         node.next = 0p;
    53         node.prev = 0p;
    5455
    5556        clh_node = malloc( );
     
    8788}
    8889
    89 forall(T & | is_thread(T) | IS_EXCEPTION(ThreadCancelled, (T))
    90     | { EHM_DEFAULT_VTABLE(ThreadCancelled, (T)); })
     90forall(T & | is_thread(T) | IS_EXCEPTION(ThreadCancelled(T))
     91    | { EHM_DEFAULT_VTABLE(ThreadCancelled(T)); })
    9192void ?{}( thread_dtor_guard_t & this,
    9293                T & thrd, void(*cancelHandler)(ThreadCancelled(T) &)) {
     
    166167
    167168//-----------------------------------------------------------------------------
    168 forall(T & | is_thread(T) | IS_RESUMPTION_EXCEPTION(ThreadCancelled, (T))
    169     | { EHM_DEFAULT_VTABLE(ThreadCancelled, (T)); })
     169forall(T & | is_thread(T) | IS_RESUMPTION_EXCEPTION(ThreadCancelled(T))
     170        | { EHM_DEFAULT_VTABLE(ThreadCancelled(T)); })
    170171T & join( T & this ) {
    171172        thread_dtor_guard_t guard = { this, defaultResumptionHandler };
    172173        return this;
     174}
     175
     176//-----------------------------------------------------------------------------
     177bool 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        }
    173220}
    174221
Note: See TracChangeset for help on using the changeset viewer.