Changeset b56ad5e for tests/concurrent/preempt.cfa
- Timestamp:
- Feb 4, 2022, 10:10:34 PM (4 years ago)
- Branches:
- ADT, ast-experimental, enum, forall-pointer-decay, master, pthread-emulation, qualifiedEnum
- Children:
- f8143a6
- Parents:
- 5f3ba11 (diff), 67e86ae6 (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. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
tests/concurrent/preempt.cfa
r5f3ba11 rb56ad5e 1 #include <clock.hfa> 1 2 #include <fstream.hfa> 2 3 #include <kernel.hfa> … … 22 23 extern void __cfaabi_check_preemption(); 23 24 24 static volatile int counter = 0; 25 static struct { 26 volatile int counter; 27 volatile Time prev; 28 Duration durations[6]; 29 } globals; 25 30 26 31 thread worker_t { 27 32 int value; 28 unsigned spin;33 unsigned long long spin; 29 34 }; 30 35 … … 35 40 36 41 void main(worker_t & this) { 37 while(TEST( counter < N)) {38 if(this.spin > 100_000_000) abort | "Worker" | this.value | "has been spinning too long! (" | this.spin | ")";42 while(TEST(globals.counter < N)) { 43 if(this.spin > 50_000_000_000) abort | "Worker" | this.value | "has been spinning too long! (" | this.spin | ")"; 39 44 __cfaabi_check_preemption(); 40 if( ( counter % 7) == this.value ) {45 if( (globals.counter % 7) == this.value ) { 41 46 __cfaabi_check_preemption(); 42 int next = __atomic_add_fetch( &counter, 1, __ATOMIC_SEQ_CST ); 47 #if !defined(TEST_LONG) 48 Time now = timeHiRes(); 49 Duration diff = now - globals.prev; 50 globals.prev = now; 51 #endif 52 int next = __atomic_add_fetch( &globals.counter, 1, __ATOMIC_SEQ_CST ); 43 53 __cfaabi_check_preemption(); 44 if( (next % 100) == 0 ) printf("%d\n", (int)next); 54 if( (next % 100) == 0 ) { 55 #if !defined(TEST_LONG) 56 unsigned idx = next / 100; 57 if (idx >= 6) abort | "Idx from next is invalid: " | idx | "vs" | next; 58 globals.durations[idx] = diff; 59 if(diff > 12`s) serr | "Duration suspiciously large:" | diff; 60 #endif 61 printf("%d\n", (int)next); 62 63 } 45 64 __cfaabi_check_preemption(); 46 65 this.spin = 0; … … 54 73 int main(int argc, char* argv[]) { 55 74 processor p; 75 globals.counter = 0; 76 globals.durations[0] = 0; 77 globals.durations[1] = 0; 78 globals.durations[2] = 0; 79 globals.durations[3] = 0; 80 globals.durations[4] = 0; 81 globals.durations[5] = 0; 56 82 { 83 globals.prev = timeHiRes(); 57 84 worker_t w0 = 0; 58 85 worker_t w1 = 1;
Note:
See TracChangeset
for help on using the changeset viewer.