- File:
-
- 1 edited
-
libcfa/src/concurrency/cofor.hfa (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/concurrency/cofor.hfa
rba0e1bc ree9ad40 1 1 #include <thread.hfa> 2 #include <locks.hfa>3 #include <list.hfa>4 2 5 3 ////////////////////////////////////////////////////////////////////////////////////////// … … 16 14 __Cofor__( low, high, __CFA_loopLambda__ ); \ 17 15 } 18 19 struct runner_node {20 void * value;21 inline dlink(runner_node);22 };23 P9_EMBEDDED( runner_node, dlink(runner_node) )24 25 thread cofor_runner {26 go_mutex mutex_lock; // MX lock27 dlist( runner_node ) items;28 void (*func)(void *);29 volatile bool done;30 };31 32 void ?{}( cofor_runner & this ) { this.done = false; }33 34 void main( cofor_runner & this ) with(this) {35 while ( !done || !items`isEmpty ) {36 lock( mutex_lock );37 runner_node * node = &try_pop_front( items );38 unlock( mutex_lock );39 func( node->value );40 free( node->value );41 free( node );42 }43 }44 45 void start_runners( cofor_runner * thds, unsigned nprocs, void (*func)(void *) ) {46 for ( i; nprocs ) {47 thds[i].func = func;48 }49 }50 51 void end_runners( cofor_runner * thds, unsigned nprocs ) {52 for ( i; nprocs ) {53 thds[i].done = true;54 }55 }56 57 void send_work( cofor_runner * thds, unsigned nprocs, unsigned & curr_proc, void * value ) {58 runner_node * node = malloc();59 (*node){};60 node->value = value;61 lock( thds[curr_proc].mutex_lock );62 insert_last( thds[curr_proc].items, *node );63 unlock( thds[curr_proc].mutex_lock );64 curr_proc = ( curr_proc + 1 ) % nprocs;65 }66 16 67 17 ////////////////////////////////////////////////////////////////////////////////////////// … … 92 42 delete( this.runner ); 93 43 } 44
Note:
See TracChangeset
for help on using the changeset viewer.