Ignore:
File:
1 edited

Legend:

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

    r015925a ra167c70c  
    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//-----------------------------------------------------------------------------
     
    4245        curr_cluster = &cl;
    4346        link.next = 0p;
    44         link.ts   = -1llu;
     47        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
     
    8791}
    8892
    89 forall(T & | is_thread(T) | IS_EXCEPTION(ThreadCancelled, (T))
    90     | { EHM_DEFAULT_VTABLE(ThreadCancelled, (T)); })
     93forall(T & | is_thread(T) | IS_EXCEPTION(ThreadCancelled(T))
     94    | { EHM_DEFAULT_VTABLE(ThreadCancelled(T)); })
    9195void ?{}( thread_dtor_guard_t & this,
    9296                T & thrd, void(*cancelHandler)(ThreadCancelled(T) &)) {
     
    166170
    167171//-----------------------------------------------------------------------------
    168 forall(T & | is_thread(T) | IS_RESUMPTION_EXCEPTION(ThreadCancelled, (T))
    169     | { EHM_DEFAULT_VTABLE(ThreadCancelled, (T)); })
     172forall(T & | is_thread(T) | IS_RESUMPTION_EXCEPTION(ThreadCancelled(T))
     173        | { EHM_DEFAULT_VTABLE(ThreadCancelled(T)); })
    170174T & join( T & this ) {
    171175        thread_dtor_guard_t guard = { this, defaultResumptionHandler };
    172176        return this;
     177}
     178
     179//-----------------------------------------------------------------------------
     180bool migrate( thread$ * thrd, struct cluster & cl ) {
     181
     182        monitor$ * tmon = get_monitor(thrd);
     183        monitor$ * __monitors[] = { tmon };
     184        monitor_guard_t __guard = { __monitors, 1 };
     185
     186
     187        {
     188                // if nothing needs to be done, return false
     189                if( thrd->curr_cluster == &cl ) return false;
     190
     191                // are we migrating ourself?
     192                const bool local = thrd == active_thread();
     193
     194                /* paranoid */ verify( !local || &cl != active_cluster() );
     195                /* paranoid */ verify( !local || thrd->curr_cluster == active_cluster() );
     196                /* paranoid */ verify( !local || thrd->curr_cluster == active_processor()->cltr );
     197                /* paranoid */ verify( local || tmon->signal_stack.top->owner->waiting_thread == thrd );
     198                /* paranoid */ verify( local || tmon->signal_stack.top );
     199
     200                // make sure we aren't interrupted while doing this
     201                // not as important if we aren't local
     202                disable_interrupts();
     203
     204                // actually move the thread
     205                unregister( thrd->curr_cluster, *thrd );
     206                thrd->curr_cluster = &cl;
     207                doregister( thrd->curr_cluster, *thrd );
     208
     209                // restore interrupts
     210                enable_interrupts();
     211
     212                // if this is the local thread, we are still running on the old cluster
     213                if(local) yield();
     214
     215                /* paranoid */ verify( !local || &cl == active_cluster() );
     216                /* paranoid */ verify( !local || thrd->curr_cluster == active_cluster() );
     217                /* paranoid */ verify( !local || thrd->curr_cluster == active_processor()->cltr );
     218                /* paranoid */ verify(  local || tmon->signal_stack.top );
     219                /* paranoid */ verify(  local || tmon->signal_stack.top->owner->waiting_thread == thrd );
     220
     221                return true;
     222        }
    173223}
    174224
Note: See TracChangeset for help on using the changeset viewer.