source:
tests/concurrency/channels/daisy_chain.cfa@
b7f8cadb
| Last change on this file since b7f8cadb was d923fca, checked in by , 8 months ago | |
|---|---|
|
|
| File size: 1.5 KB | |
| Rev | Line | |
|---|---|---|
| [9319a23] | 1 | #include <locks.hfa> |
| 2 | #include <fstream.hfa> | |
| 3 | #include <stdio.h> | |
| 4 | #include <channel.hfa> | |
| 5 | #include <thread.hfa> | |
| 6 | #include <time.hfa> | |
| 7 | #include <string.h> | |
| 8 | ||
| 9 | size_t total_operations = 0; | |
| [50be8af5] | 10 | ssize_t Processors = 1, Tasks = 4; // must be signed |
| [9319a23] | 11 | |
| 12 | owner_lock o; | |
| 13 | ||
| 14 | typedef channel( int ) Channel; | |
| 15 | ||
| 16 | Channel * chain; | |
| 17 | ||
| 18 | thread Task {}; | |
| [d923fca] | 19 | void main(Task &) { |
| [9319a23] | 20 | size_t runs = 0; |
| [5adb277] | 21 | int token = 0; |
| [9319a23] | 22 | try{ |
| 23 | for ( ;; ) { | |
| [5adb277] | 24 | token << *chain; |
| [cb344f7] | 25 | *chain << token; |
| [9319a23] | 26 | runs++; |
| 27 | } | |
| 28 | } catch ( channel_closed * e ) {} | |
| 29 | lock( o ); | |
| 30 | total_operations += runs; | |
| 31 | unlock( o ); | |
| 32 | } | |
| 33 | ||
| 34 | ||
| 35 | int main( int argc, char * argv[] ) { | |
| 36 | switch ( argc ) { | |
| 37 | case 3: | |
| 38 | if ( strcmp( argv[2], "d" ) != 0 ) { // default ? | |
| [50be8af5] | 39 | Tasks = ato( argv[2] ); |
| [d96f7c4] | 40 | if ( Tasks < 1 ) fallthrough default; |
| [9319a23] | 41 | } // if |
| [d923fca] | 42 | fallthrough; |
| [9319a23] | 43 | case 2: |
| 44 | if ( strcmp( argv[1], "d" ) != 0 ) { // default ? | |
| [50be8af5] | 45 | Processors = ato( argv[1] ); |
| [d96f7c4] | 46 | if ( Processors < 1 ) fallthrough default; |
| [9319a23] | 47 | } // if |
| [d923fca] | 48 | fallthrough; |
| [9319a23] | 49 | case 1: // use defaults |
| 50 | break; | |
| 51 | default: | |
| [50be8af5] | 52 | exit | "Usage: " | argv[0] |
| [9319a23] | 53 | | " [ processors (> 0) | 'd' (default " | Processors |
| 54 | | ") ] [ channel size (>= 0) | 'd' (default " | Tasks | |
| 55 | | ") ]" ; | |
| 56 | } // switch | |
| 57 | processor proc[Processors - 1]; | |
| 58 | ||
| 59 | sout | "start"; | |
| 60 | Channel chainChan{ 1 }; | |
| 61 | ||
| [cb344f7] | 62 | chainChan << ((int)0); |
| [9319a23] | 63 | |
| 64 | chain = &chainChan; | |
| 65 | { | |
| 66 | Task t[Tasks]; | |
| 67 | sleep(10`s); | |
| 68 | close( chainChan ); | |
| 69 | } | |
| 70 | ||
| 71 | // sout | total_operations; | |
| 72 | sout | "done"; | |
| [50be8af5] | 73 | } |
Note:
See TracBrowser
for help on using the repository browser.