Changes in src/libcfa/concurrency/monitor [9f5ecf5:59a0bde]
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/libcfa/concurrency/monitor
r9f5ecf5 r59a0bde 10 10 // Created On : Thd Feb 23 12:27:26 2017 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Sat Jul 22 09:59:01201713 // Update Count : 312 // Last Modified On : Sat Oct 7 18:06:45 2017 13 // Update Count : 10 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 24 29 static inline void ?{}(monitor_desc & this) { 25 30 (this.lock){}; 26 this.owner = NULL;27 31 (this.entry_queue){}; 28 32 (this.signal_stack){}; 29 this.recursion = 0; 30 this.acceptables = NULL; 31 this.acceptable_count = 0; 32 this.accepted_index = -1; 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; 33 39 } 34 40 35 41 struct monitor_guard_t { 36 42 monitor_desc ** m; 37 intcount;43 __lock_size_t count; 38 44 monitor_desc ** prev_mntrs; 39 unsigned shortprev_count;45 __lock_size_t prev_count; 40 46 fptr_t prev_func; 41 47 }; 42 48 43 static inline int ?<?(monitor_desc* lhs, monitor_desc* rhs) { 44 return ((intptr_t)lhs) < ((intptr_t)rhs); 49 void ?{}( monitor_guard_t & this, monitor_desc ** m, __lock_size_t count, void (*func)() ); 50 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 ); 45 66 } 46 47 void ?{}( monitor_guard_t & this, monitor_desc ** m, int count, void (*func)() );48 void ^?{}( monitor_guard_t & this );49 67 50 68 //----------------------------------------------------------------------------- … … 52 70 53 71 struct __condition_criterion_t { 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 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; 58 83 }; 59 84 60 85 struct __condition_node_t { 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 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; 66 100 }; 67 101 … … 71 105 }; 72 106 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 73 111 void ?{}( __condition_blocked_queue_t & ); 74 void append( __condition_blocked_queue_t *, __condition_node_t * );75 __condition_node_t * pop_head( __condition_blocked_queue_t *);112 void append( __condition_blocked_queue_t &, __condition_node_t * ); 113 __condition_node_t * pop_head( __condition_blocked_queue_t & ); 76 114 77 115 struct condition { 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 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; 81 124 }; 82 125 … … 90 133 } 91 134 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 );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 ); 97 140 98 141 //----------------------------------------------------------------------------- … … 100 143 101 144 struct __acceptable_t { 102 fptr_t func; 103 unsigned short count; 104 monitor_desc ** monitors; 145 __monitor_group_t; 105 146 bool is_dtor; 106 147 }; 107 148 108 int __accept_internal( unsigned short count, __acceptable_t * acceptables);149 void __waitfor_internal( const __waitfor_mask_t & mask, int duration ); 109 150 110 151 // Local Variables: //
Note:
See TracChangeset
for help on using the changeset viewer.