- File:
-
- 1 edited
-
libcfa/src/concurrency/locks.hfa (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/concurrency/locks.hfa
rab1b971 r454f478 1 //2 // Cforall Version 1.0.0 Copyright (C) 2021 University of Waterloo3 //4 // The contents of this file are covered under the licence agreement in the5 // file "LICENCE" distributed with Cforall.6 //7 // locks.hfa -- PUBLIC8 // Runtime locks that used with the runtime thread system.9 //10 // Author : Colby Alexander Parsons11 // Created On : Thu Jan 21 19:46:50 202112 // Last Modified By :13 // Last Modified On :14 // Update Count :15 //16 17 1 #pragma once 18 2 19 3 #include <stdbool.h> 20 4 21 #include "bits/weakso_locks.hfa" 5 #include "bits/locks.hfa" 6 #include "bits/sequence.hfa" 7 8 #include "invoke.h" 22 9 23 10 #include "time_t.hfa" 24 11 #include "time.hfa" 25 26 //----------27 struct single_acquisition_lock {28 inline blocking_lock;29 };30 31 static inline void ?{}( single_acquisition_lock & this ) {((blocking_lock &)this){ false, false };}32 static inline void ^?{}( single_acquisition_lock & this ) {}33 static inline void lock ( single_acquisition_lock & this ) { lock ( (blocking_lock &)this ); }34 static inline void unlock ( single_acquisition_lock & this ) { unlock ( (blocking_lock &)this ); }35 static inline void on_wait ( single_acquisition_lock & this ) { on_wait( (blocking_lock &)this ); }36 static inline void on_notify ( single_acquisition_lock & this, struct $thread * t ) { on_notify( (blocking_lock &)this, t ); }37 static inline void set_recursion_count( single_acquisition_lock & this, size_t recursion ) { set_recursion_count( (blocking_lock &)this, recursion ); }38 static inline size_t get_recursion_count( single_acquisition_lock & this ) { return get_recursion_count( (blocking_lock &)this ); }39 40 //----------41 struct owner_lock {42 inline blocking_lock;43 };44 45 static inline void ?{}( owner_lock & this ) {((blocking_lock &)this){ true, true };}46 static inline void ^?{}( owner_lock & this ) {}47 static inline void lock ( owner_lock & this ) { lock ( (blocking_lock &)this ); }48 static inline void unlock ( owner_lock & this ) { unlock ( (blocking_lock &)this ); }49 static inline void on_wait ( owner_lock & this ) { on_wait( (blocking_lock &)this ); }50 static inline void on_notify( owner_lock & this, struct $thread * t ) { on_notify( (blocking_lock &)this, t ); }51 static inline void set_recursion_count( owner_lock & this, size_t recursion ) { set_recursion_count( (blocking_lock &)this, recursion ); }52 static inline size_t get_recursion_count( owner_lock & this ) { return get_recursion_count( (blocking_lock &)this ); }53 12 54 13 //----------------------------------------------------------------------------- … … 79 38 info_thread(L) *& Next( info_thread(L) * this ); 80 39 } 40 41 //----------------------------------------------------------------------------- 42 // Blocking Locks 43 struct blocking_lock { 44 // Spin lock used for mutual exclusion 45 __spinlock_t lock; 46 47 // List of blocked threads 48 Sequence( $thread ) blocked_threads; 49 50 // Count of current blocked threads 51 size_t wait_count; 52 53 // Flag if the lock allows multiple acquisition 54 bool multi_acquisition; 55 56 // Flag if lock can be released by non owner 57 bool strict_owner; 58 59 // Current thread owning the lock 60 struct $thread * owner; 61 62 // Number of recursion level 63 size_t recursion_count; 64 }; 65 66 struct single_acquisition_lock { 67 inline blocking_lock; 68 }; 69 70 struct owner_lock { 71 inline blocking_lock; 72 }; 73 74 struct multiple_acquisition_lock { 75 inline blocking_lock; 76 }; 77 78 void ?{}( blocking_lock & this, bool multi_acquisition, bool strict_owner ); 79 void ^?{}( blocking_lock & this ); 80 81 void ?{}( single_acquisition_lock & this ); 82 void ^?{}( single_acquisition_lock & this ); 83 84 void ?{}( owner_lock & this ); 85 void ^?{}( owner_lock & this ); 86 87 void ?{}( multiple_acquisition_lock & this ); 88 void ^?{}( multiple_acquisition_lock & this ); 89 90 void lock( blocking_lock & this ); 91 bool try_lock( blocking_lock & this ); 92 void unlock( blocking_lock & this ); 93 void on_notify( blocking_lock & this, struct $thread * t ); 94 void on_wait( blocking_lock & this ); 95 size_t wait_count( blocking_lock & this ); 96 void set_recursion_count( blocking_lock & this, size_t recursion ); 97 size_t get_recursion_count( blocking_lock & this ); 98 99 void lock( single_acquisition_lock & this ); 100 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 ); 103 void set_recursion_count( single_acquisition_lock & this, size_t recursion ); 104 size_t get_recursion_count( single_acquisition_lock & this ); 105 106 void lock( owner_lock & this ); 107 void unlock( owner_lock & this ); 108 void on_notify( owner_lock & this, struct $thread * t ); 109 void on_wait( owner_lock & this ); 110 void set_recursion_count( owner_lock & this, size_t recursion ); 111 size_t get_recursion_count( owner_lock & this ); 112 113 void lock( multiple_acquisition_lock & this ); 114 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 ); 117 void set_recursion_count( multiple_acquisition_lock & this, size_t recursion ); 118 size_t get_recursion_count( multiple_acquisition_lock & this ); 81 119 82 120 //-----------------------------------------------------------------------------
Note:
See TracChangeset
for help on using the changeset viewer.