ADT
        arm-eh
        ast-experimental
        enum
        forall-pointer-decay
        jacob/cs343-translation
        new-ast
        new-ast-unique-expr
        pthread-emulation
        qualifiedEnum
      
      
        
          | 
            Last change
 on this file since 0c30ecc was             3381ed7, checked in by Thierry Delisle <tdelisle@…>, 6 years ago           | 
        
        
          | 
             
Added park/unpark primitives thread and removed BlockInternal. 
Converted monitors to use park unpark. 
Intrusive Queue now mark next field when thread is inside queue. 
Added several asserts to kernel and monitor. 
Added a few tests for park and unpark. 
 
           | 
        
        
          
            
              - 
Property                 mode
 set to                 
100644
               
             
           | 
        
        
          | 
            File size:
            1.2 KB
           | 
        
      
      
| Line |   | 
|---|
| 1 | #include <fstream.hfa>
 | 
|---|
| 2 | #include <kernel.hfa>
 | 
|---|
| 3 | #include <monitor.hfa>
 | 
|---|
| 4 | #include <thread.hfa>
 | 
|---|
| 5 | 
 | 
|---|
| 6 | static int global12, global23, global13;
 | 
|---|
| 7 | 
 | 
|---|
| 8 | monitor monitor_t {};
 | 
|---|
| 9 | 
 | 
|---|
| 10 | static monitor_t m1, m2, m3;
 | 
|---|
| 11 | 
 | 
|---|
| 12 | void increment( monitor_t & mutex p1, monitor_t & mutex p2, int & value ) {
 | 
|---|
| 13 |         assert(active_thread() == get_monitor(p1)->owner);
 | 
|---|
| 14 |         assert(active_thread() == get_monitor(p2)->owner);
 | 
|---|
| 15 |         value += 1;
 | 
|---|
| 16 |         assert(active_thread() == get_monitor(p1)->owner);
 | 
|---|
| 17 |         assert(active_thread() == get_monitor(p2)->owner);
 | 
|---|
| 18 | }
 | 
|---|
| 19 | 
 | 
|---|
| 20 | thread MyThread {
 | 
|---|
| 21 |         int target;
 | 
|---|
| 22 | };
 | 
|---|
| 23 | 
 | 
|---|
| 24 | void ?{}( MyThread & this, int target ) {
 | 
|---|
| 25 |         this.target = target;
 | 
|---|
| 26 | }
 | 
|---|
| 27 | 
 | 
|---|
| 28 | void ^?{}( MyThread & mutex this ) {}
 | 
|---|
| 29 | 
 | 
|---|
| 30 | void main( MyThread & this ) {
 | 
|---|
| 31 |         for(int i = 0; i < 1000000; i++) {
 | 
|---|
| 32 |                 choose(this.target) {
 | 
|---|
| 33 |                         case 0: increment( m1, m2, global12 );
 | 
|---|
| 34 |                         case 1: increment( m2, m3, global23 );
 | 
|---|
| 35 |                         case 2: increment( m1, m3, global13 );
 | 
|---|
| 36 |                 }
 | 
|---|
| 37 |         }
 | 
|---|
| 38 | }
 | 
|---|
| 39 | 
 | 
|---|
| 40 | forall(dtype T | sized(T) | { void ^?{}(T & mutex); })
 | 
|---|
| 41 | void delete_mutex(T * x) {
 | 
|---|
| 42 |         ^(*x){};
 | 
|---|
| 43 |         free(x);
 | 
|---|
| 44 | }
 | 
|---|
| 45 | 
 | 
|---|
| 46 | int main(int argc, char* argv[]) {
 | 
|---|
| 47 |         processor p;
 | 
|---|
| 48 |         {
 | 
|---|
| 49 |                 MyThread * f[6];
 | 
|---|
| 50 |                 for(int i = 0; i < 6; i++) {
 | 
|---|
| 51 |                         f[i] = new(i % 3);
 | 
|---|
| 52 |                 }
 | 
|---|
| 53 | 
 | 
|---|
| 54 |                 for(int i = 0; i < 6; i++) {
 | 
|---|
| 55 |                         delete_mutex( f[i] );
 | 
|---|
| 56 |                 }
 | 
|---|
| 57 |         }
 | 
|---|
| 58 |         sout | global12 | global23 | global13;
 | 
|---|
| 59 | }
 | 
|---|
       
      
  Note:
 See   
TracBrowser
 for help on using the repository browser.