source: src/tests/concurrent/signal/block.c@ 682dcae

ADT aaron-thesis arm-eh ast-experimental cleanup-dtors deferred_resn demangler enum forall-pointer-decay jacob/cs343-translation jenkins-sandbox new-ast new-ast-unique-expr new-env no_list persistent-indexer pthread-emulation qualifiedEnum with_gc
Last change on this file since 682dcae was 0f56058, checked in by Peter A. Buhr <pabuhr@…>, 7 years ago

divide "time" into type and functions

  • Property mode set to 100644
File size: 3.1 KB
RevLine 
[9fe39530]1//---------------------------------------------------------
2// Barging test
3// Ensures that no barging can occur between :
4// - the frontend of the signal_block and the signaled thread
5// - the signaled threadand the backend of the signal_block
6//---------------------------------------------------------
7
8
[2c9ebab]9#include <fstream>
10#include <kernel>
11#include <monitor>
12#include <stdlib>
13#include <thread>
[0f56058]14#include <time>
[cd99ef1]15
[70969f8]16#ifdef LONG_TEST
17static const unsigned long N = 150_000ul;
18#else
[cd99ef1]19static const unsigned long N = 5_000ul;
[70969f8]20#endif
[cd99ef1]21
22#ifndef PREEMPTION_RATE
[8ad6533]23#define PREEMPTION_RATE 10`ms
[e1c1829]24#endif
[2c9ebab]25
[8ad6533]26Duration default_preemption() {
[cd99ef1]27 return PREEMPTION_RATE;
28}
29
[2c9ebab]30enum state_t { WAITED, SIGNAL, BARGE };
31
32monitor global_data_t {
[ccd349d]33 thread_desc * last_thread;
34 thread_desc * last_signaller;
[2c9ebab]35};
36
[00e80b6]37void ?{} ( global_data_t & this ) {
38 this.last_thread = NULL;
39 this.last_signaller = NULL;
[2c9ebab]40}
41
[00e80b6]42void ^?{} ( global_data_t & this ) {}
[2c9ebab]43
44global_data_t globalA, globalB;
45
46condition cond;
47
48volatile bool done;
49
50//------------------------------------------------------------------------------
[83a071f9]51void wait_op( global_data_t & mutex a, global_data_t & mutex b, unsigned i ) {
[94ddede]52 wait( cond, (uintptr_t)active_thread() );
[2c9ebab]53
[6c7b1e7]54 yield( random( 10 ) );
[2c9ebab]55
[83a071f9]56 if(a.last_thread != a.last_signaller || b.last_thread != b.last_signaller ) {
57 sout | "ERROR Barging detected, expected" | a.last_signaller | b.last_signaller | "got" | a.last_thread | b.last_thread | endl;
[2c9ebab]58 abort();
59 }
60
[94ddede]61 a.last_thread = b.last_thread = active_thread();
[2c9ebab]62
[6c7b1e7]63 yield( random( 10 ) );
[2c9ebab]64}
65
66thread Waiter {};
[83a071f9]67void main( Waiter & this ) {
[2c9ebab]68 for( int i = 0; i < N; i++ ) {
[83a071f9]69 wait_op( globalA, globalB, i );
[2c9ebab]70 }
71}
72
73//------------------------------------------------------------------------------
[83a071f9]74void signal_op( global_data_t & mutex a, global_data_t & mutex b ) {
[6c7b1e7]75 yield( random( 10 ) );
[2c9ebab]76
[94ddede]77 [a.last_thread, b.last_thread, a.last_signaller, b.last_signaller] = active_thread();
[2c9ebab]78
[4cedd9f]79 if( !is_empty( cond ) ) {
[2c9ebab]80
[4cedd9f]81 thread_desc * next = front( cond );
[2c9ebab]82
[4cedd9f]83 if( ! signal_block( cond ) ) {
[ccd349d]84 sout | "ERROR expected to be able to signal" | endl;
85 abort();
86 }
87
[6c7b1e7]88 yield( random( 10 ) );
[ccd349d]89
[83a071f9]90 if(a.last_thread != next || b.last_thread != next) {
91 sout | "ERROR Barging detected, expected" | next | "got" | a.last_thread | b.last_thread | endl;
[2c9ebab]92 abort();
93 }
94 }
95
96}
97
98thread Signaller {};
[83a071f9]99void main( Signaller & this ) {
[2c9ebab]100 while( !done ) {
[83a071f9]101 signal_op( globalA, globalB );
[2c9ebab]102 }
103}
104
105//------------------------------------------------------------------------------
[83a071f9]106void barge_op( global_data_t & mutex a ) {
[94ddede]107 a.last_thread = active_thread();
[2c9ebab]108}
109
110thread Barger {};
[83a071f9]111void main( Barger & this ) {
[2c9ebab]112 for( unsigned i = 0; !done; i++ ) {
113 //Choose some monitor to barge into with some irregular pattern
114 bool choose_a = (i % 13) > (i % 17);
[83a071f9]115 if ( choose_a ) barge_op( globalA );
116 else barge_op( globalB );
[2c9ebab]117 }
118}
119
120//------------------------------------------------------------------------------
121
122int main(int argc, char* argv[]) {
[54aba8d]123 srandom( time( NULL ) );
[2c9ebab]124 done = false;
125 processor p;
126 {
127 Signaller s[4];
128 Barger b[13];
129 sout | "Starting waiters" | endl;
130 {
131 Waiter w[3];
132 }
133 sout | "Waiters done" | endl;
134 done = true;
135 }
[736fe25]136}
Note: See TracBrowser for help on using the repository browser.