Ignore:
File:
1 edited

Legend:

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

    rab8c6a6 r09f357ec  
    2222#include "kernel.hfa"
    2323#include "monitor.hfa"
    24 #include "exception.hfa"
    2524
    2625//-----------------------------------------------------------------------------
    2726// thread trait
    2827trait is_thread(dtype T) {
    29         void ^?{}(T& mutex this);
    30         void main(T& this);
    31         $thread* get_thread(T& this);
     28      void ^?{}(T& mutex this);
     29      void main(T& this);
     30      thread_desc* get_thread(T& this);
    3231};
    3332
    34 FORALL_DATA_EXCEPTION(ThreadCancelled, (dtype thread_t), (thread_t)) (
    35         thread_t * the_thread;
    36         exception_t * the_exception;
    37 );
    38 
    39 forall(dtype T)
    40 void copy(ThreadCancelled(T) * dst, ThreadCancelled(T) * src);
    41 
    42 forall(dtype T)
    43 const char * msg(ThreadCancelled(T) *);
    44 
    45 // define that satisfies the trait without using the thread keyword
    46 #define DECL_THREAD(X) $thread* get_thread(X& this) __attribute__((const)) { return &this.__thrd; } void main(X& this)
    47 
    48 // Inline getters for threads/coroutines/monitors
    49 forall( dtype T | is_thread(T) )
    50 static inline $coroutine* get_coroutine(T & this) __attribute__((const)) { return &get_thread(this)->self_cor; }
     33#define DECL_THREAD(X) thread_desc* get_thread(X& this) { return &this.__thrd; } void main(X& this)
    5134
    5235forall( dtype T | is_thread(T) )
    53 static inline $monitor  * get_monitor  (T & this) __attribute__((const)) { return &get_thread(this)->self_mon; }
     36static inline coroutine_desc* get_coroutine(T & this) {
     37        return &get_thread(this)->self_cor;
     38}
    5439
    55 static inline $coroutine* get_coroutine($thread * this) __attribute__((const)) { return &this->self_cor; }
    56 static inline $monitor  * get_monitor  ($thread * this) __attribute__((const)) { return &this->self_mon; }
     40forall( dtype T | is_thread(T) )
     41static inline monitor_desc* get_monitor(T & this) {
     42        return &get_thread(this)->self_mon;
     43}
    5744
    58 //-----------------------------------------------------------------------------
    59 // forward declarations needed for threads
     45static inline coroutine_desc* get_coroutine(thread_desc * this) {
     46        return &this->self_cor;
     47}
     48
     49static inline monitor_desc* get_monitor(thread_desc * this) {
     50        return &this->self_mon;
     51}
     52
    6053extern struct cluster * mainCluster;
    6154
     
    6558//-----------------------------------------------------------------------------
    6659// Ctors and dtors
    67 void ?{}($thread & this, const char * const name, struct cluster & cl, void * storage, size_t storageSize );
    68 void ^?{}($thread & this);
     60void ?{}(thread_desc & this, const char * const name, struct cluster & cl, void * storage, size_t storageSize );
     61void ^?{}(thread_desc & this);
    6962
    70 static inline void ?{}($thread & this)                                                                  { this{ "Anonymous Thread", *mainCluster, 0p, 65000 }; }
    71 static inline void ?{}($thread & this, size_t stackSize )                                               { this{ "Anonymous Thread", *mainCluster, 0p, stackSize }; }
    72 static inline void ?{}($thread & this, void * storage, size_t storageSize )                             { this{ "Anonymous Thread", *mainCluster, storage, storageSize }; }
    73 static inline void ?{}($thread & this, struct cluster & cl )                                            { this{ "Anonymous Thread", cl, 0p, 65000 }; }
    74 static inline void ?{}($thread & this, struct cluster & cl, size_t stackSize )                          { this{ "Anonymous Thread", cl, 0p, stackSize }; }
    75 static inline void ?{}($thread & this, struct cluster & cl, void * storage, size_t storageSize )        { this{ "Anonymous Thread", cl, storage, storageSize }; }
    76 static inline void ?{}($thread & this, const char * const name)                                         { this{ name, *mainCluster, 0p, 65000 }; }
    77 static inline void ?{}($thread & this, const char * const name, struct cluster & cl )                   { this{ name, cl, 0p, 65000 }; }
    78 static inline void ?{}($thread & this, const char * const name, struct cluster & cl, size_t stackSize ) { this{ name, cl, 0p, stackSize }; }
    79 
    80 struct thread_dtor_guard_t {
    81         monitor_dtor_guard_t mg;
    82 };
    83 
    84 forall( dtype T | is_thread(T) | IS_EXCEPTION(ThreadCancelled, (T)) )
    85 void ?{}( thread_dtor_guard_t & this, T & thrd, void(*)(ThreadCancelled(T) &) );
    86 void ^?{}( thread_dtor_guard_t & this );
     63static inline void ?{}(thread_desc & this)                                                                  { this{ "Anonymous Thread", *mainCluster, 0p, 65000 }; }
     64static inline void ?{}(thread_desc & this, size_t stackSize )                                               { this{ "Anonymous Thread", *mainCluster, 0p, stackSize }; }
     65static inline void ?{}(thread_desc & this, void * storage, size_t storageSize )                             { this{ "Anonymous Thread", *mainCluster, storage, storageSize }; }
     66static inline void ?{}(thread_desc & this, struct cluster & cl )                                            { this{ "Anonymous Thread", cl, 0p, 65000 }; }
     67static inline void ?{}(thread_desc & this, struct cluster & cl, size_t stackSize )                          { this{ "Anonymous Thread", cl, 0p, stackSize }; }
     68static inline void ?{}(thread_desc & this, struct cluster & cl, void * storage, size_t storageSize )        { this{ "Anonymous Thread", cl, storage, storageSize }; }
     69static inline void ?{}(thread_desc & this, const char * const name)                                         { this{ name, *mainCluster, 0p, 65000 }; }
     70static inline void ?{}(thread_desc & this, const char * const name, struct cluster & cl )                   { this{ name, cl, 0p, 65000 }; }
     71static inline void ?{}(thread_desc & this, const char * const name, struct cluster & cl, size_t stackSize ) { this{ name, cl, 0p, stackSize }; }
    8772
    8873//-----------------------------------------------------------------------------
     
    10388void ^?{}( scoped(T)& this );
    10489
    105 //-----------------------------------------------------------------------------
    106 // Scheduler API
     90void yield();
     91void yield( unsigned times );
    10792
    108 //----------
    109 // Park thread: block until corresponding call to unpark, won't block if unpark is already called
    110 void park( void );
    111 
    112 //----------
    113 // Unpark a thread, if the thread is already blocked, schedule it
    114 //                  if the thread is not yet block, signal that it should rerun immediately
    115 void unpark( $thread * this );
    116 
    117 forall( dtype T | is_thread(T) )
    118 static inline void unpark( T & this ) { if(!&this) return; unpark( get_thread( this ) );}
    119 
    120 //----------
    121 // Yield: force thread to block and be rescheduled
    122 bool force_yield( enum __Preemption_Reason );
    123 
    124 //----------
    125 // sleep: force thread to block and be rescheduled after Duration duration
    126 void sleep( Duration duration );
    127 
    128 //----------
    129 // join
    130 forall( dtype T | is_thread(T) | IS_RESUMPTION_EXCEPTION(ThreadCancelled, (T)) )
    131 T & join( T & this );
     93static inline struct thread_desc * active_thread () { return TL_GET( this_thread ); }
    13294
    13395// Local Variables: //
Note: See TracChangeset for help on using the changeset viewer.