- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/concurrency/locks.hfa
rac5816d r4aeaee5 3 3 #include <stdbool.h> 4 4 5 #include "bits/algorithm.hfa" 5 6 #include "bits/locks.hfa" 6 7 #include "bits/sequence.hfa" 8 #include "bits/containers.hfa" 7 9 8 10 #include "invoke.h" … … 10 12 #include "time_t.hfa" 11 13 #include "time.hfa" 14 #include <sys/time.h> 15 #include "alarm.hfa" 12 16 13 //----------------------------------------------------------------------------- 14 // is_blocking_lock 17 /////////////////////////////////////////////////////////////////// 18 //// is_blocking_lock 19 /////////////////////////////////////////////////////////////////// 20 15 21 trait is_blocking_lock(dtype L | sized(L)) { 16 // For synchronization locks to use when acquiring 17 void on_notify( L &, struct $thread * ); 18 19 // For synchronization locks to use when releasing 20 void on_wait( L & ); 21 22 // to get recursion count for cond lock to reset after waking 23 size_t get_recursion_count( L & ); 24 25 // to set recursion count after getting signalled; 26 void set_recursion_count( L &, size_t recursion ); 22 void add_( L &, struct $thread * ); // For synchronization locks to use when acquiring 23 void remove_( L & ); // For synchronization locks to use when releasing 24 size_t get_recursion_count( L & ); // to get recursion count for cond lock to reset after waking 25 void set_recursion_count( L &, size_t recursion ); // to set recursion count after getting signalled; 27 26 }; 28 27 29 // -----------------------------------------------------------------------------30 // info_thread31 // the info thread is a wrapper around a thread used32 // to store extra data for use in the condition variable 28 /////////////////////////////////////////////////////////////////// 29 //// info_thread 30 /////////////////////////////////////////////////////////////////// 31 33 32 forall(dtype L | is_blocking_lock(L)) { 34 struct info_thread; 33 struct info_thread { 34 inline Seqable; 35 struct $thread * t; 36 uintptr_t info; 37 L * lock; 38 bool listed; // true if info_thread is on queue, false otherwise; 39 }; 35 40 36 // for use by sequence 37 info_thread(L) *& Back( info_thread(L) * this ); 38 info_thread(L) *& Next( info_thread(L) * this ); 41 42 void ?{}( info_thread(L) & this, $thread * t ); 43 void ?{}( info_thread(L) & this, $thread * t, uintptr_t info ); 44 void ^?{}( info_thread(L) & this ); 39 45 } 40 46 41 //----------------------------------------------------------------------------- 42 // Blocking Locks 47 /////////////////////////////////////////////////////////////////// 48 //// Blocking Locks 49 /////////////////////////////////////////////////////////////////// 50 51 // struct lock_thread { 52 // struct $thread * t; 53 // lock_thread * next; 54 // }; 55 56 // void ?{}( lock_thread & this, struct $thread * thd ); 57 // void ^?{}( lock_thread & this ); 58 59 // lock_thread *& get_next( lock_thread & ); 60 43 61 struct blocking_lock { 44 62 // Spin lock used for mutual exclusion … … 46 64 47 65 // List of blocked threads 48 Sequence( $thread ) blocked_threads;66 __queue_t( $thread ) blocked_threads; 49 67 50 68 // Count of current blocked threads … … 76 94 }; 77 95 78 void 96 void ?{}( blocking_lock & this, bool multi_acquisition, bool strict_owner ); 79 97 void ^?{}( blocking_lock & this ); 80 98 81 void 99 void ?{}( single_acquisition_lock & this ); 82 100 void ^?{}( single_acquisition_lock & this ); 83 101 84 void 102 void ?{}( owner_lock & this ); 85 103 void ^?{}( owner_lock & this ); 86 104 87 void 105 void ?{}( multiple_acquisition_lock & this ); 88 106 void ^?{}( multiple_acquisition_lock & this ); 89 107 … … 91 109 bool try_lock( blocking_lock & this ); 92 110 void unlock( blocking_lock & this ); 93 void on_notify( blocking_lock & this, struct $thread * t );94 void on_wait( blocking_lock & this );111 void add_( blocking_lock & this, struct $thread * t ); 112 void remove_( blocking_lock & this ); 95 113 size_t wait_count( blocking_lock & this ); 96 114 void set_recursion_count( blocking_lock & this, size_t recursion ); … … 99 117 void lock( single_acquisition_lock & this ); 100 118 void unlock( single_acquisition_lock & this ); 101 void on_notify( single_acquisition_lock & this, struct $thread * t );102 void on_wait( single_acquisition_lock & this );119 void add_( single_acquisition_lock & this, struct $thread * t ); 120 void remove_( single_acquisition_lock & this ); 103 121 void set_recursion_count( single_acquisition_lock & this, size_t recursion ); 104 122 size_t get_recursion_count( single_acquisition_lock & this ); … … 106 124 void lock( owner_lock & this ); 107 125 void unlock( owner_lock & this ); 108 void on_notify( owner_lock & this, struct $thread * t );109 void on_wait( owner_lock & this );126 void add_( owner_lock & this, struct $thread * t ); 127 void remove_( owner_lock & this ); 110 128 void set_recursion_count( owner_lock & this, size_t recursion ); 111 129 size_t get_recursion_count( owner_lock & this ); … … 113 131 void lock( multiple_acquisition_lock & this ); 114 132 void unlock( multiple_acquisition_lock & this ); 115 void on_notify( multiple_acquisition_lock & this, struct $thread * t );116 void on_wait( multiple_acquisition_lock & this );133 void add_( multiple_acquisition_lock & this, struct $thread * t ); 134 void remove_( multiple_acquisition_lock & this ); 117 135 void set_recursion_count( multiple_acquisition_lock & this, size_t recursion ); 118 136 size_t get_recursion_count( multiple_acquisition_lock & this ); 119 137 120 //----------------------------------------------------------------------------- 121 // Synchronization Locks 138 /////////////////////////////////////////////////////////////////// 139 //// Synchronization Locks 140 /////////////////////////////////////////////////////////////////// 122 141 forall(dtype L | is_blocking_lock(L)) { 123 142 struct condition_variable { 124 143 // Spin lock used for mutual exclusion 125 144 __spinlock_t lock; 145 146 info_thread(L) * last_thread; 126 147 127 148 // List of blocked threads … … 132 153 }; 133 154 134 void 155 void ?{}( condition_variable(L) & this ); 135 156 void ^?{}( condition_variable(L) & this ); 157 158 struct alarm_node_wrap { 159 alarm_node_t alarm_node; 160 161 condition_variable(L) * cond; 162 163 info_thread(L) * i; 164 }; 165 166 void ?{}( alarm_node_wrap(L) & this, Time alarm, Duration period, Alarm_Callback callback ); 167 void ^?{}( alarm_node_wrap(L) & this ); 168 169 void alarm_node_callback( alarm_node_wrap(L) & this ); 170 171 void alarm_node_wrap_cast( alarm_node_t & a ); 136 172 137 173 bool notify_one( condition_variable(L) & this ); … … 140 176 uintptr_t front( condition_variable(L) & this ); 141 177 142 bool empty 143 int 178 bool empty( condition_variable(L) & this ); 179 int counter( condition_variable(L) & this ); 144 180 181 // TODO: look into changing timout routines to return bool showing if signalled or woken by kernel 145 182 void wait( condition_variable(L) & this ); 146 183 void wait( condition_variable(L) & this, uintptr_t info ); 147 boolwait( condition_variable(L) & this, Duration duration );148 boolwait( condition_variable(L) & this, uintptr_t info, Duration duration );149 boolwait( condition_variable(L) & this, Time time );150 boolwait( condition_variable(L) & this, uintptr_t info, Time time );184 void wait( condition_variable(L) & this, Duration duration ); 185 void wait( condition_variable(L) & this, uintptr_t info, Duration duration ); 186 void wait( condition_variable(L) & this, Time time ); 187 void wait( condition_variable(L) & this, uintptr_t info, Time time ); 151 188 152 189 void wait( condition_variable(L) & this, L & l ); 153 190 void wait( condition_variable(L) & this, L & l, uintptr_t info ); 154 boolwait( condition_variable(L) & this, L & l, Duration duration );155 boolwait( condition_variable(L) & this, L & l, uintptr_t info, Duration duration );156 boolwait( condition_variable(L) & this, L & l, Time time );157 boolwait( condition_variable(L) & this, L & l, uintptr_t info, Time time );191 void wait( condition_variable(L) & this, L & l, Duration duration ); 192 void wait( condition_variable(L) & this, L & l, uintptr_t info, Duration duration ); 193 void wait( condition_variable(L) & this, L & l, Time time ); 194 void wait( condition_variable(L) & this, L & l, uintptr_t info, Time time ); 158 195 }
Note: See TracChangeset
for help on using the changeset viewer.