Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/libcfa/concurrency/invoke.h

    r4cc9b13 r39fea2f  
    8484      };
    8585
    86       struct __waitfor_mask_t {
    87             short * accepted;                         // the index of the accepted function, -1 if none
    88             struct __acceptable_t * clauses;          // list of acceptable functions, null if any
    89             short size;                               // number of acceptable functions
    90       };
    91 
    9286      struct monitor_desc {
    9387            struct spinlock lock;                     // spinlock to protect internal data
     
    9690            struct __condition_stack_t signal_stack;  // stack of conditions to run next once we exit the monitor
    9791            unsigned int recursion;                   // monitor routines can be called recursively, we need to keep track of that
    98             struct __waitfor_mask_t mask;               // mask used to know if some thread is waiting for something while holding the monitor
    99       };
    10092
    101       struct __monitor_group_t {
    102             struct monitor_desc ** list;              // currently held monitors
    103             short                  size;              // number of currently held monitors
    104             fptr_t                 func;              // last function that acquired monitors
    105       };
     93            struct __acceptable_t * acceptables;      // list of acceptable functions, null if any
     94            unsigned short acceptable_count;          // number of acceptable functions
     95            short accepted_index;                     // the index of the accepted function, -1 if none
     96       };
    10697
    10798      struct thread_desc {
    10899            // Core threading fields
    109             struct coroutine_desc  self_cor;          // coroutine body used to store context
    110             struct monitor_desc    self_mon;          // monitor body used for mutual exclusion
    111             struct monitor_desc *  self_mon_p;        // pointer to monitor with sufficient lifetime for current monitors
    112             struct __monitor_group_t monitors;          // monitors currently held by this thread
     100            struct coroutine_desc cor;                // coroutine body used to store context
     101            struct monitor_desc mon;                  // monitor body used for mutual exclusion
    113102
    114103            // Link lists fields
    115104            struct thread_desc * next;                // instrusive link field for threads
    116105
    117 
     106            // Current status related to monitors
     107            struct monitor_desc ** current_monitors;  // currently held monitors
     108            unsigned short current_monitor_count;     // number of currently held monitors
     109            fptr_t current_monitor_func;              // last function that acquired monitors
    118110     };
    119 
    120      #ifdef __CFORALL__
    121      extern "Cforall" {
    122             static inline monitor_desc * ?[?]( const __monitor_group_t & this, ptrdiff_t index ) {
    123                   return this.list[index];
    124             }
    125 
    126             static inline bool ?==?( const __monitor_group_t & lhs, const __monitor_group_t & rhs ) {
    127                   if( (lhs.list != 0) != (rhs.list != 0) ) return false;
    128                   if( lhs.size != rhs.size ) return false;
    129                   if( lhs.func != rhs.func ) return false;
    130 
    131                   // Check that all the monitors match
    132                   for( int i = 0; i < lhs.size; i++ ) {
    133                         // If not a match, check next function
    134                         if( lhs[i] != rhs[i] ) return false;
    135                   }
    136 
    137                   return true;
    138             }
    139       }
    140       #endif
    141111
    142112#endif //_INVOKE_H_
Note: See TracChangeset for help on using the changeset viewer.