source: tests/unified_locking/mutex_test.hfa@ b9f8274

ADT ast-experimental pthread-emulation qualifiedEnum
Last change on this file since b9f8274 was 1dbbef6, checked in by caparsons <caparson@…>, 3 years ago

added non shared critical section entry counter

  • Property mode set to 100644
File size: 1.5 KB
RevLine 
[4ae968e]1
2#include <fstream.hfa>
3#include <locks.hfa>
4#include <thread.hfa>
5
6const unsigned int num_times = 50;
7
8struct MutexObj {
9 LOCK l;
[b16e15e]10 thread$ * id;
[4ae968e]11 uint32_t sum;
[35d73c0]12 uint32_t cnt;
[4ae968e]13};
14
15MutexObj mo;
16
17void trash() {
18 unsigned t[100];
19 for(i; 100) {
20 t[i] = 0xDEADBEEF;
21 }
22}
23
[1dbbef6]24uint32_t cs(uint32_t & entries) {
[b16e15e]25 thread$ * me = active_thread();
[4ae968e]26 uint32_t value;
27 lock(mo.l);
28 {
[1dbbef6]29 entries++;
[4ae968e]30 uint32_t tsum = mo.sum;
[35d73c0]31 uint32_t cnt = mo.cnt;
[4ae968e]32 mo.id = me;
33 yield(random(5));
34 value = ((uint32_t)random()) ^ ((uint32_t)me);
35 if(mo.id != me) sout | "Intruder!";
[35d73c0]36 mo.cnt = cnt + 1;
[4ae968e]37 mo.sum = tsum + value;
38 }
39 unlock(mo.l);
40 return value;
41}
42
43thread LockCheck {
44 uint32_t sum;
[1dbbef6]45 uint32_t entries;
[4ae968e]46};
47
48void main(LockCheck & this) {
49 this.sum = 0;
[1dbbef6]50 this.entries = 0;
[4ae968e]51 for(num_times) {
52 trash();
[1dbbef6]53 this.sum += cs( this.entries );
[4ae968e]54 trash();
55 yield(random(10));
56 }
57}
58
[21a99cc]59void test() {
[4ae968e]60 uint32_t sum = -32;
61 mo.sum = -32;
[35d73c0]62 mo.cnt = 0;
[1dbbef6]63 uint32_t real_entries = 0;
[4ae968e]64 processor p[2];
65 sout | "Starting";
66 {
67 LockCheck checkers[13];
68 for(i;13) {
[1dbbef6]69 LockCheck & curr = join(checkers[i]);
70 sum += curr.sum;
71 real_entries += curr.entries;
[4ae968e]72 }
73 }
74 sout | "Done!";
[1dbbef6]75 if(real_entries != (13 * num_times)) sout | "Invalid real cs count!" | mo.cnt | "vs "| (13 * num_times) | "(13 *" | num_times | ')';
76 if(mo.cnt != (13 * num_times)) sout | "Invalid concurrent cs count!" | mo.cnt | "vs "| (13 * num_times) | "(13 *" | num_times | ')';
[4ae968e]77 if(sum == mo.sum) sout | "Match!";
78 else sout | "No Match!" | sum | "vs" | mo.sum;
79}
Note: See TracBrowser for help on using the repository browser.