Changeset ba0e1bc for libcfa/src/concurrency/cofor.hfa
- Timestamp:
- Nov 6, 2023, 2:20:09 PM (11 months ago)
- Branches:
- master
- Children:
- 0d41b2e
- Parents:
- 3d9d017
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/concurrency/cofor.hfa
r3d9d017 rba0e1bc 1 1 #include <thread.hfa> 2 #include <locks.hfa> 3 #include <list.hfa> 2 4 3 5 ////////////////////////////////////////////////////////////////////////////////////////// … … 14 16 __Cofor__( low, high, __CFA_loopLambda__ ); \ 15 17 } 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 lock 27 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 } 16 66 17 67 ////////////////////////////////////////////////////////////////////////////////////////// … … 42 92 delete( this.runner ); 43 93 } 44
Note: See TracChangeset
for help on using the changeset viewer.