Ignore:
File:
1 edited

Legend:

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

    rac2b598 re3fea42  
    3232        __spinlock_t lock;
    3333        int count;
    34         __queue_t($thread) waiting;
     34        __queue_t(thread_desc) waiting;
    3535};
    3636
     
    4444// Processor
    4545extern struct cluster * mainCluster;
     46
     47enum FinishOpCode { No_Action, Release, Schedule, Release_Schedule, Release_Multi, Release_Multi_Schedule, Callback };
     48
     49typedef void (*__finish_callback_fptr_t)(void);
     50
     51//TODO use union, many of these fields are mutually exclusive (i.e. MULTI vs NOMULTI)
     52struct FinishAction {
     53        FinishOpCode action_code;
     54        /*
     55        // Union of possible actions
     56        union {
     57                // Option 1 : locks and threads
     58                struct {
     59                        // 1 thread or N thread
     60                        union {
     61                                thread_desc * thrd;
     62                                struct {
     63                                        thread_desc ** thrds;
     64                                        unsigned short thrd_count;
     65                                };
     66                        };
     67                        // 1 lock or N lock
     68                        union {
     69                                __spinlock_t * lock;
     70                                struct {
     71                                        __spinlock_t ** locks;
     72                                        unsigned short lock_count;
     73                                };
     74                        };
     75                };
     76                // Option 2 : action pointer
     77                __finish_callback_fptr_t callback;
     78        };
     79        /*/
     80        thread_desc * thrd;
     81        thread_desc ** thrds;
     82        unsigned short thrd_count;
     83        __spinlock_t * lock;
     84        __spinlock_t ** locks;
     85        unsigned short lock_count;
     86        __finish_callback_fptr_t callback;
     87        //*/
     88};
     89static inline void ?{}(FinishAction & this) {
     90        this.action_code = No_Action;
     91        this.thrd = 0p;
     92        this.lock = 0p;
     93}
     94static inline void ^?{}(FinishAction &) {}
    4695
    4796// Processor
     
    67116        // RunThread data
    68117        // Action to do after a thread is ran
    69         $thread * destroyer;
     118        struct FinishAction finish;
    70119
    71120        // Preemption data
     
    108157static inline void  ?{}(processor & this, const char name[]) { this{name, *mainCluster }; }
    109158
    110 static inline [processor *&, processor *& ] __get( processor & this ) __attribute__((const)) { return this.node.[next, prev]; }
     159static inline [processor *&, processor *& ] __get( processor & this ) {
     160        return this.node.[next, prev];
     161}
    111162
    112163//-----------------------------------------------------------------------------
     
    117168
    118169        // Ready queue for threads
    119         __queue_t($thread) ready_queue;
     170        __queue_t(thread_desc) ready_queue;
    120171
    121172        // Name of the cluster
     
    133184        // List of threads
    134185        __spinlock_t thread_list_lock;
    135         __dllist_t(struct $thread) threads;
     186        __dllist_t(struct thread_desc) threads;
    136187        unsigned int nthreads;
    137188
     
    151202static inline void ?{} (cluster & this, const char name[])        { this{name, default_preemption()}; }
    152203
    153 static inline [cluster *&, cluster *& ] __get( cluster & this ) __attribute__((const)) { return this.node.[next, prev]; }
     204static inline [cluster *&, cluster *& ] __get( cluster & this ) {
     205        return this.node.[next, prev];
     206}
    154207
    155208static inline struct processor * active_processor() { return TL_GET( this_processor ); } // UNSAFE
Note: See TracChangeset for help on using the changeset viewer.