Ignore:
File:
1 edited

Legend:

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

    rba0e1bc ree9ad40  
    11#include <thread.hfa>
    2 #include <locks.hfa>
    3 #include <list.hfa>
    42
    53//////////////////////////////////////////////////////////////////////////////////////////
     
    1614                __Cofor__( low, high, __CFA_loopLambda__ ); \
    1715        }
    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 }
    6616
    6717//////////////////////////////////////////////////////////////////////////////////////////
     
    9242    delete( this.runner );
    9343}
     44
Note: See TracChangeset for help on using the changeset viewer.