source: libcfa/src/concurrency/cofor.hfa @ 2ad5e1d5

Last change on this file since 2ad5e1d5 was ee9ad40, checked in by caparsons <caparson@…>, 9 months ago

Changed cofor files to support the corun statement

  • Property mode set to 100644
File size: 1.1 KB
Line 
1#include <thread.hfa>
2
3//////////////////////////////////////////////////////////////////////////////////////////
4// cofor ( uC++ COFOR )
5typedef void (*__cofor_body_t)( ssize_t );
6
7void __Cofor__( ssize_t low, ssize_t high, __cofor_body_t loop_body );
8
9#define COFOR( lidname, low, high, loopbody ) \
10        { \
11                void __CFA_loopLambda__( ssize_t lidname ) { \
12                        loopbody \
13                } \
14                __Cofor__( low, high, __CFA_loopLambda__ ); \
15        }
16
17//////////////////////////////////////////////////////////////////////////////////////////
18// corun
19
20//
21typedef void (*__CFA_corun_lambda_t)( void );
22
23// used to run a corun statement in parallel
24thread co_runner {
25        __CFA_corun_lambda_t body;
26};
27
28// wraps a co_runner to provide RAII deallocation
29struct runner_block {
30    co_runner * runner;
31};
32static inline void ?{}( co_runner & this, __CFA_corun_lambda_t body ) { this.body = body; }
33
34void main( co_runner & this ) with( this ) { body(); }
35
36static inline void ?{}( runner_block & this ) {}
37static inline void ?{}( runner_block & this, __CFA_corun_lambda_t body ) {
38    (*(this.runner = malloc())){ body };
39}
40
41static inline void ^?{}( runner_block & this ) {
42    delete( this.runner );
43}
44
Note: See TracBrowser for help on using the repository browser.