Changeset b7b3e41 for tests/concurrency
- Timestamp:
- Jun 19, 2023, 1:57:11 PM (2 years ago)
- Branches:
- master
- Children:
- adc73a5
- Parents:
- fa5e1aa5 (diff), 33d4bc8 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - Location:
- tests/concurrency
- Files:
-
- 2 added
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
tests/concurrency/actors/.expect/inherit.txt
rfa5e1aa5 rb7b3e41 4 4 A 5 5 A 6 A 7 A 6 8 Finished -
tests/concurrency/actors/dynamic.cfa
rfa5e1aa5 rb7b3e41 19 19 void ?{}( derived_msg & this ) { ((derived_msg &)this){ 0 }; } 20 20 21 Allocation receive( derived_actor & receiver, derived_msg & msg ) {21 allocation receive( derived_actor & receiver, derived_msg & msg ) { 22 22 if ( msg.cnt >= Times ) { 23 23 sout | "Done"; … … 28 28 derived_actor * d_actor = alloc(); 29 29 (*d_actor){}; 30 *d_actor <<*d_msg;30 *d_actor | *d_msg; 31 31 return Delete; 32 32 } … … 58 58 derived_actor * d_actor = alloc(); 59 59 (*d_actor){}; 60 *d_actor <<*d_msg;60 *d_actor | *d_msg; 61 61 62 62 printf("stopping\n"); -
tests/concurrency/actors/executor.cfa
rfa5e1aa5 rb7b3e41 24 24 struct d_msg { inline message; } shared_msg; 25 25 26 Allocation receive( d_actor & this, d_msg & msg ) with( this ) {26 allocation receive( d_actor & this, d_msg & msg ) with( this ) { 27 27 if ( recs == rounds ) return Finished; 28 28 if ( recs % Batch == 0 ) { 29 29 for ( i; Batch ) { 30 gstart[sends % Set] <<shared_msg;30 gstart[sends % Set] | shared_msg; 31 31 sends += 1; 32 32 } … … 94 94 95 95 for ( i; Actors ) { 96 actors[i] <<shared_msg;96 actors[i] | shared_msg; 97 97 } // for 98 98 -
tests/concurrency/actors/inherit.cfa
rfa5e1aa5 rb7b3e41 7 7 8 8 struct Server { inline actor; }; 9 9 10 struct Server2 { inline Server; int b; }; 11 void ^?{}( Server2 & this ) { mutex(sout) sout | 'A'; } 12 10 13 struct D_msg { int a; inline message; }; 11 struct D_msg2 { inline D_msg; };12 13 void ^?{}( Server2 & this ) { mutex(sout) sout | 'A'; }14 14 void ?{}( D_msg & this ) { set_allocation( this, Delete ); } 15 15 void ^?{}( D_msg & this ) { mutex(sout) sout | 'A'; } 16 16 17 Allocation handle() { 17 struct D_msg2 { inline D_msg; }; 18 19 allocation handle() { 18 20 return Finished; 19 21 } 20 22 21 Allocation receive( Server & receiver, D_msg & msg ) { return handle(); }22 Allocation receive( Server & receiver, D_msg2 & msg ) { return handle(); }23 Allocation receive( Server2 & receiver, D_msg & msg ) { return Delete; }24 Allocation receive( Server2 & receiver, D_msg2 & msg ) { return Delete; }23 allocation receive( Server & receiver, D_msg & msg ) { return handle(); } 24 allocation receive( Server & receiver, D_msg2 & msg ) { return handle(); } 25 allocation receive( Server2 & receiver, D_msg & msg ) { return Delete; } 26 allocation receive( Server2 & receiver, D_msg2 & msg ) { return Delete; } 25 27 26 28 int main() { … … 30 32 D_msg * dm = alloc(); 31 33 (*dm){}; 32 D_msg2 dm2; 34 D_msg2 * dm2 = alloc(); 35 (*dm2){}; 33 36 Server2 * s = alloc(); 34 37 (*s){}; 35 38 Server2 * s2 = alloc(); 36 39 (*s2){}; 37 *s <<*dm;38 *s2 <<dm2;40 *s | *dm; 41 *s2 | *dm2; 39 42 stop_actor_system(); 40 43 } … … 44 47 D_msg * dm = alloc(); 45 48 (*dm){}; 46 D_msg2 dm2; 47 s[0] << *dm; 48 s[1] << dm2; 49 D_msg2 * dm2 = alloc(); 50 (*dm2){}; 51 s[0] | *dm; 52 s[1] | *dm2; 49 53 stop_actor_system(); 50 54 } -
tests/concurrency/actors/matrix.cfa
rfa5e1aa5 rb7b3e41 24 24 } 25 25 26 Allocation receive( derived_actor & receiver, derived_msg & msg ) {26 allocation receive( derived_actor & receiver, derived_msg & msg ) { 27 27 for ( unsigned int i = 0; i < yc; i += 1 ) { // multiply X_row by Y_col and sum products 28 28 msg.Z[i] = 0; … … 105 105 106 106 for ( unsigned int r = 0; r < xr; r += 1 ) { 107 actors[r] <<messages[r];107 actors[r] | messages[r]; 108 108 } // for 109 109 -
tests/concurrency/actors/pingpong.cfa
rfa5e1aa5 rb7b3e41 19 19 size_t times = 100000; 20 20 21 Allocation receive( ping & receiver, p_msg & msg ) {21 allocation receive( ping & receiver, p_msg & msg ) { 22 22 msg.count++; 23 23 if ( msg.count > times ) return Finished; 24 24 25 Allocation retval = Nodelete;25 allocation retval = Nodelete; 26 26 if ( msg.count == times ) retval = Finished; 27 *po <<msg;27 *po | msg; 28 28 return retval; 29 29 } 30 30 31 Allocation receive( pong & receiver, p_msg & msg ) {31 allocation receive( pong & receiver, p_msg & msg ) { 32 32 msg.count++; 33 33 if ( msg.count > times ) return Finished; 34 34 35 Allocation retval = Nodelete;35 allocation retval = Nodelete; 36 36 if ( msg.count == times ) retval = Finished; 37 *pi <<msg;37 *pi | msg; 38 38 return retval; 39 39 } … … 53 53 pi = &pi_actor; 54 54 p_msg m; 55 pi_actor <<m;55 pi_actor | m; 56 56 stop_actor_system(); 57 57 -
tests/concurrency/actors/poison.cfa
rfa5e1aa5 rb7b3e41 18 18 Server s[10]; 19 19 for ( i; 10 ) { 20 s[i] << FinishedMsg;20 s[i] | finished_msg; 21 21 } 22 22 stop_actor_system(); … … 29 29 Server * s = alloc(); 30 30 (*s){}; 31 (*s) << DeleteMsg;31 (*s) | delete_msg; 32 32 } 33 33 stop_actor_system(); … … 39 39 Server s[10]; 40 40 for ( i; 10 ) 41 s[i] << DestroyMsg;41 s[i] | destroy_msg; 42 42 stop_actor_system(); 43 43 for ( i; 10 ) -
tests/concurrency/actors/static.cfa
rfa5e1aa5 rb7b3e41 19 19 void ?{}( derived_msg & this ) { ((derived_msg &)this){ 0 }; } 20 20 21 Allocation receive( derived_actor & receiver, derived_msg & msg ) {21 allocation receive( derived_actor & receiver, derived_msg & msg ) { 22 22 if ( msg.cnt >= Times ) { 23 23 sout | "Done"; … … 25 25 } 26 26 msg.cnt++; 27 receiver <<msg;27 receiver | msg; 28 28 return Nodelete; 29 29 } … … 55 55 derived_actor actor; 56 56 57 actor <<msg;57 actor | msg; 58 58 59 59 printf("stopping\n"); -
tests/concurrency/actors/types.cfa
rfa5e1aa5 rb7b3e41 20 20 21 21 // this isn't a valid receive routine since int is not a message type 22 Allocation receive( derived_actor & receiver, int i ) with( receiver ) {22 allocation receive( derived_actor & receiver, int i ) with( receiver ) { 23 23 mutex(sout) sout | i; 24 24 counter++; … … 27 27 } 28 28 29 Allocation receive( derived_actor & receiver, d_msg & msg ) {29 allocation receive( derived_actor & receiver, d_msg & msg ) { 30 30 return receive( receiver, msg.num ); 31 31 } … … 36 36 }; 37 37 38 Allocation receive( derived_actor2 & receiver, d_msg & msg ) {38 allocation receive( derived_actor2 & receiver, d_msg & msg ) { 39 39 mutex(sout) sout | msg.num; 40 40 return Finished; … … 48 48 }; 49 49 50 Allocation receive( derived_actor3 & receiver, d_msg & msg ) {50 allocation receive( derived_actor3 & receiver, d_msg & msg ) { 51 51 mutex(sout) sout | msg.num; 52 52 if ( msg.num == -1 ) return Nodelete; … … 54 54 } 55 55 56 Allocation receive( derived_actor3 & receiver, d_msg2 & msg ) {56 allocation receive( derived_actor3 & receiver, d_msg2 & msg ) { 57 57 mutex(sout) sout | msg.num; 58 58 return Finished; … … 72 72 b.num = 1; 73 73 c.num = 2; 74 a << b <<c;74 a | b | c; 75 75 stop_actor_system(); 76 76 … … 80 80 d_msg d_ac2_msg; 81 81 d_ac2_msg.num = 3; 82 d_ac2_0 <<d_ac2_msg;83 d_ac2_1 <<d_ac2_msg;82 d_ac2_0 | d_ac2_msg; 83 d_ac2_1 | d_ac2_msg; 84 84 stop_actor_system(); 85 85 … … 93 93 d_msg d_ac23_msg; 94 94 d_ac23_msg.num = 4; 95 d_ac3_0 <<d_ac23_msg;96 d_ac2_2 <<d_ac23_msg;95 d_ac3_0 | d_ac23_msg; 96 d_ac2_2 | d_ac23_msg; 97 97 stop_actor_system(); 98 98 } // RAII to clean up executor … … 107 107 b1.num = -1; 108 108 c2.num = 5; 109 a3 << b1 <<c2;109 a3 | b1 | c2; 110 110 stop_actor_system(); 111 111 } // RAII to clean up executor … … 120 120 b1.num = -1; 121 121 c2.num = 5; 122 a4 << b1 <<c2;122 a4 | b1 | c2; 123 123 stop_actor_system(); 124 124 } // RAII to clean up executor -
tests/concurrency/lockfree_stack.cfa
rfa5e1aa5 rb7b3e41 10 10 // Created On : Thu May 25 15:36:50 2023 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Tue May 30 19:02:32202313 // Update Count : 1812 // Last Modified On : Fri Jun 9 14:01:07 2023 13 // Update Count : 68 14 14 // 15 15 … … 29 29 int64_t atom; 30 30 #endif // __SIZEOF_INT128__ 31 } __attribute__(( aligned( 16 ) ));31 }; 32 32 33 33 struct Node { … … 42 42 n.next = stack; // atomic assignment unnecessary 43 43 for () { // busy wait 44 if ( CASV( stack.atom, n.next.atom, ((Link){ &n, n.next.count + 1 }.atom) ) ) break; // attempt to update top node 44 Link temp{ &n, n.next.count + 1 }; 45 if ( CASV( s.stack.atom, n.next.atom, temp.atom ) ) break; // attempt to update top node 45 46 } 46 47 } … … 50 51 for () { // busy wait 51 52 if ( t.top == NULL ) return NULL; // empty stack ? 52 if ( CASV( stack.atom, t.atom, ((Link){ t.top->next.top, t.count }.atom) ) ) return t.top; // attempt to update top node 53 Link temp{ t.top->next.top, t.count }; 54 if ( CASV( stack.atom, t.atom, temp.atom ) ) return t.top; // attempt to update top node 53 55 } 54 56 } … … 57 59 Stack stack; // global stack 58 60 59 enum { Times = 60 #if defined( __ARM_ARCH ) // ARM CASV is very slow 61 10_000 62 #else 63 1_000_000 64 #endif // __arm_64__ 65 }; 61 enum { Times = 2_000_000 }; 66 62 67 63 thread Worker {}; … … 82 78 83 79 for ( i; N ) { // push N values on stack 84 // storage must be 16-bytes aligned for cmpxchg16b 85 push( stack, *(Node *)memalign( 16, sizeof( Node ) ) ); 80 push( stack, *(Node *)new() ); // must be 16-byte aligned 86 81 } 87 82 { -
tests/concurrency/waituntil/locks.cfa
rfa5e1aa5 rb7b3e41 2 2 #include <thread.hfa> 3 3 #include <locks.hfa> 4 #include <fstream.hfa> 4 5 #include <mutex_stmt.hfa> 5 6
Note:
See TracChangeset
for help on using the changeset viewer.