Changes in src/libcfa/concurrency/invoke.h [4cc9b13:39fea2f]
- File:
-
- 1 edited
-
src/libcfa/concurrency/invoke.h (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/libcfa/concurrency/invoke.h
r4cc9b13 r39fea2f 84 84 }; 85 85 86 struct __waitfor_mask_t {87 short * accepted; // the index of the accepted function, -1 if none88 struct __acceptable_t * clauses; // list of acceptable functions, null if any89 short size; // number of acceptable functions90 };91 92 86 struct monitor_desc { 93 87 struct spinlock lock; // spinlock to protect internal data … … 96 90 struct __condition_stack_t signal_stack; // stack of conditions to run next once we exit the monitor 97 91 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 monitor99 };100 92 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 }; 106 97 107 98 struct thread_desc { 108 99 // 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 113 102 114 103 // Link lists fields 115 104 struct thread_desc * next; // instrusive link field for threads 116 105 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 118 110 }; 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 match132 for( int i = 0; i < lhs.size; i++ ) {133 // If not a match, check next function134 if( lhs[i] != rhs[i] ) return false;135 }136 137 return true;138 }139 }140 #endif141 111 142 112 #endif //_INVOKE_H_
Note:
See TracChangeset
for help on using the changeset viewer.