#include #include #include const unsigned int num_times = 50; struct MutexObj { LOCK l; thread$ * id; uint32_t sum; uint32_t cnt; }; MutexObj mo; void trash() { unsigned t[100]; for(i; 100) { t[i] = 0xDEADBEEF; } } uint32_t cs(uint32_t & entries) { thread$ * me = active_thread(); uint32_t value; lock(mo.l); { entries++; uint32_t tsum = mo.sum; uint32_t cnt = mo.cnt; mo.id = me; yield(random(5)); value = ((uint32_t)random()) ^ ((uint32_t)me); if(mo.id != me) sout | "Intruder!"; mo.cnt = cnt + 1; mo.sum = tsum + value; } unlock(mo.l); return value; } thread LockCheck { uint32_t sum; uint32_t entries; }; void main(LockCheck & this) { this.sum = 0; this.entries = 0; for(num_times) { trash(); this.sum += cs( this.entries ); trash(); yield(random(10)); } } void test() { uint32_t sum = -32; mo.sum = -32; mo.cnt = 0; uint32_t real_entries = 0; processor p[2]; sout | "Starting"; { LockCheck checkers[13]; for(i;13) { LockCheck & curr = join(checkers[i]); sum += curr.sum; real_entries += curr.entries; } } sout | "Done!"; if(real_entries != (13 * num_times)) sout | "Invalid real cs count!" | mo.cnt | "vs "| (13 * num_times) | "(13 *" | num_times | ')'; if(mo.cnt != (13 * num_times)) sout | "Invalid concurrent cs count!" | mo.cnt | "vs "| (13 * num_times) | "(13 *" | num_times | ')'; if(sum == mo.sum) sout | "Match!"; else sout | "No Match!" | sum | "vs" | mo.sum; }