Changes in src/libcfa/concurrency/monitor [59a0bde:9f5ecf5]
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/libcfa/concurrency/monitor
r59a0bde r9f5ecf5 10 10 // Created On : Thd Feb 23 12:27:26 2017 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Sat Oct 7 18:06:45201713 // Update Count : 1012 // Last Modified On : Sat Jul 22 09:59:01 2017 13 // Update Count : 3 14 14 // 15 15 … … 22 22 #include "stdlib" 23 23 24 trait is_monitor(dtype T) {25 monitor_desc * get_monitor( T & );26 void ^?{}( T & mutex );27 };28 29 24 static inline void ?{}(monitor_desc & this) { 30 25 (this.lock){}; 26 this.owner = NULL; 31 27 (this.entry_queue){}; 32 28 (this.signal_stack){}; 33 this.owner = NULL; 34 this.recursion = 0; 35 this.mask.accepted = NULL; 36 this.mask.clauses = NULL; 37 this.mask.size = 0; 38 this.dtor_node = NULL; 29 this.recursion = 0; 30 this.acceptables = NULL; 31 this.acceptable_count = 0; 32 this.accepted_index = -1; 39 33 } 40 34 41 35 struct monitor_guard_t { 42 36 monitor_desc ** m; 43 __lock_size_tcount;37 int count; 44 38 monitor_desc ** prev_mntrs; 45 __lock_size_tprev_count;39 unsigned short prev_count; 46 40 fptr_t prev_func; 47 41 }; 48 42 49 void ?{}( monitor_guard_t & this, monitor_desc ** m, __lock_size_t count, void (*func)() ); 43 static inline int ?<?(monitor_desc* lhs, monitor_desc* rhs) { 44 return ((intptr_t)lhs) < ((intptr_t)rhs); 45 } 46 47 void ?{}( monitor_guard_t & this, monitor_desc ** m, int count, void (*func)() ); 50 48 void ^?{}( monitor_guard_t & this ); 51 52 struct monitor_dtor_guard_t {53 monitor_desc * m;54 monitor_desc ** prev_mntrs;55 __lock_size_t prev_count;56 fptr_t prev_func;57 };58 59 void ?{}( monitor_dtor_guard_t & this, monitor_desc ** m, void (*func)() );60 void ^?{}( monitor_dtor_guard_t & this );61 62 static inline forall( dtype T | sized(T) | { void ^?{}( T & mutex ); } )63 void delete( T * th ) {64 ^(*th){};65 free( th );66 }67 49 68 50 //----------------------------------------------------------------------------- … … 70 52 71 53 struct __condition_criterion_t { 72 // Whether or not the criterion is met (True if met) 73 bool ready; 74 75 // The monitor this criterion concerns 76 monitor_desc * target; 77 78 // The parent node to which this criterion belongs 79 struct __condition_node_t * owner; 80 81 // Intrusive linked list Next field 82 __condition_criterion_t * next; 54 bool ready; //Whether or not the criterion is met (True if met) 55 monitor_desc * target; //The monitor this criterion concerns 56 struct __condition_node_t * owner; //The parent node to which this criterion belongs 57 __condition_criterion_t * next; //Intrusive linked list Next field 83 58 }; 84 59 85 60 struct __condition_node_t { 86 // Thread that needs to be woken when all criteria are met 87 thread_desc * waiting_thread; 88 89 // Array of criteria (Criterions are contiguous in memory) 90 __condition_criterion_t * criteria; 91 92 // Number of criterions in the criteria 93 __lock_size_t count; 94 95 // Intrusive linked list Next field 96 __condition_node_t * next; 97 98 // Custom user info accessible before signalling 99 uintptr_t user_info; 61 thread_desc * waiting_thread; //Thread that needs to be woken when all criteria are met 62 __condition_criterion_t * criteria; //Array of criteria (Criterions are contiguous in memory) 63 unsigned short count; //Number of criterions in the criteria 64 __condition_node_t * next; //Intrusive linked list Next field 65 uintptr_t user_info; //Custom user info accessible before signalling 100 66 }; 101 67 … … 105 71 }; 106 72 107 void ?{}(__condition_node_t & this, thread_desc * waiting_thread, __lock_size_t count, uintptr_t user_info );108 void ?{}(__condition_criterion_t & this );109 void ?{}(__condition_criterion_t & this, monitor_desc * target, __condition_node_t * owner );110 111 73 void ?{}( __condition_blocked_queue_t & ); 112 void append( __condition_blocked_queue_t &, __condition_node_t * );113 __condition_node_t * pop_head( __condition_blocked_queue_t &);74 void append( __condition_blocked_queue_t *, __condition_node_t * ); 75 __condition_node_t * pop_head( __condition_blocked_queue_t * ); 114 76 115 77 struct condition { 116 // Link list which contains the blocked threads as-well as the information needed to unblock them 117 __condition_blocked_queue_t blocked; 118 119 // Array of monitor pointers (Monitors are NOT contiguous in memory) 120 monitor_desc ** monitors; 121 122 // Number of monitors in the array 123 __lock_size_t monitor_count; 78 __condition_blocked_queue_t blocked; //Link list which contains the blocked threads as-well as the information needed to unblock them 79 monitor_desc ** monitors; //Array of monitor pointers (Monitors are NOT contiguous in memory) 80 unsigned short monitor_count; //Number of monitors in the array 124 81 }; 125 82 … … 133 90 } 134 91 135 void wait ( condition &this, uintptr_t user_info = 0 );136 bool signal ( condition &this );137 bool signal_block( condition &this );138 static inline bool is_empty ( condition & this ) { return !this.blocked.head; }139 uintptr_t front ( condition &this );92 void wait( condition * this, uintptr_t user_info = 0 ); 93 bool signal( condition * this ); 94 bool signal_block( condition * this ); 95 static inline bool is_empty( condition * this ) { return !this->blocked.head; } 96 uintptr_t front( condition * this ); 140 97 141 98 //----------------------------------------------------------------------------- … … 143 100 144 101 struct __acceptable_t { 145 __monitor_group_t; 102 fptr_t func; 103 unsigned short count; 104 monitor_desc ** monitors; 146 105 bool is_dtor; 147 106 }; 148 107 149 void __waitfor_internal( const __waitfor_mask_t & mask, int duration);108 int __accept_internal( unsigned short count, __acceptable_t * acceptables ); 150 109 151 110 // Local Variables: //
Note:
See TracChangeset
for help on using the changeset viewer.