Changeset fc10e1b in mainline for kernel/generic/include
- Timestamp:
- 2018-09-07T16:34:11Z (7 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- d2c91ab
- Parents:
- 508b0df1 (diff), e90cfa6 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - Location:
- kernel/generic/include
- Files:
-
- 1 added
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/include/adt/cht.h
r508b0df1 rfc10e1b 36 36 #define KERN_CONC_HASH_TABLE_H_ 37 37 38 #include <atomic.h> 38 39 #include <stdint.h> 39 40 #include <adt/list.h> -
kernel/generic/include/atomic.h
r508b0df1 rfc10e1b 40 40 #include <stdatomic.h> 41 41 42 typedef size_t atomic_count_t; 43 typedef ssize_t atomic_signed_t; 42 // TODO: Remove. 43 // Before <stdatomic.h> was available, there was only one atomic type 44 // equivalent to atomic_size_t. This means that in some places, atomic_t can 45 // be replaced with a more appropriate type (e.g. atomic_bool for flags or 46 // a signed type for potentially signed values). 47 // So atomic_t should be replaced with the most appropriate type on a case by 48 // case basis, and after there are no more uses, remove this type. 49 typedef atomic_size_t atomic_t; 44 50 45 #define PRIua "zu" /**< Format for atomic_count_t. */ 51 #define atomic_predec(val) \ 52 (atomic_fetch_sub((val), 1) - 1) 46 53 47 typedef struct { 48 volatile atomic_size_t count; 49 } atomic_t; 54 #define atomic_preinc(val) \ 55 (atomic_fetch_add((val), 1) + 1) 50 56 51 static inline void atomic_set(atomic_t *val, atomic_count_t i) 52 { 53 atomic_store(&val->count, i); 54 } 57 #define atomic_postdec(val) \ 58 atomic_fetch_sub((val), 1) 55 59 56 static inline atomic_count_t atomic_get(atomic_t *val) 57 { 58 return atomic_load(&val->count); 59 } 60 #define atomic_postinc(val) \ 61 atomic_fetch_add((val), 1) 60 62 61 static inline size_t atomic_predec(atomic_t *val) 62 { 63 return atomic_fetch_sub(&val->count, 1) - 1; 64 } 63 #define atomic_dec(val) \ 64 ((void) atomic_fetch_sub(val, 1)) 65 65 66 static inline size_t atomic_preinc(atomic_t *val) 67 { 68 return atomic_fetch_add(&val->count, 1) + 1; 69 } 70 71 static inline size_t atomic_postdec(atomic_t *val) 72 { 73 return atomic_fetch_sub(&val->count, 1); 74 } 75 76 static inline size_t atomic_postinc(atomic_t *val) 77 { 78 return atomic_fetch_add(&val->count, 1); 79 } 80 81 static inline void atomic_dec(atomic_t *val) 82 { 83 atomic_fetch_sub(&val->count, 1); 84 } 85 86 static inline void atomic_inc(atomic_t *val) 87 { 88 atomic_fetch_add(&val->count, 1); 89 } 66 #define atomic_inc(val) \ 67 ((void) atomic_fetch_add(val, 1)) 90 68 91 69 #define local_atomic_exchange(var_addr, new_val) \ 92 70 atomic_exchange_explicit(var_addr, new_val, memory_order_relaxed) 93 94 static inline bool test_and_set(atomic_t *val)95 {96 return atomic_exchange(&val->count, 1);97 }98 99 71 100 72 #endif -
kernel/generic/include/mm/as.h
r508b0df1 rfc10e1b 48 48 #include <lib/elf.h> 49 49 #include <arch.h> 50 #include <lib/refcount.h> 50 51 51 52 #define AS THE->as … … 111 112 112 113 /** Number of references (i.e. tasks that reference this as). */ 113 atomic_ t refcount;114 atomic_refcount_t refcount; 114 115 115 116 mutex_t lock; -
kernel/generic/include/synch/spinlock.h
r508b0df1 rfc10e1b 36 36 #define KERN_SPINLOCK_H_ 37 37 38 #include <assert.h> 39 #include <stdatomic.h> 38 40 #include <stdbool.h> 39 #include <barrier.h>40 #include <assert.h>41 41 #include <preemption.h> 42 #include <atomic.h>43 42 #include <arch/asm.h> 44 43 … … 46 45 47 46 typedef struct spinlock { 48 atomic_ t val;47 atomic_flag flag; 49 48 50 49 #ifdef CONFIG_DEBUG_SPINLOCK … … 70 69 spinlock_t lock_name = { \ 71 70 .name = desc_name, \ 72 . val = { 0 }\71 .flag = ATOMIC_FLAG_INIT \ 73 72 } 74 73 … … 76 75 static spinlock_t lock_name = { \ 77 76 .name = desc_name, \ 78 . val = { 0 }\77 .flag = ATOMIC_FLAG_INIT \ 79 78 } 80 79 … … 89 88 #define SPINLOCK_INITIALIZE_NAME(lock_name, desc_name) \ 90 89 spinlock_t lock_name = { \ 91 . val = { 0 }\90 .flag = ATOMIC_FLAG_INIT \ 92 91 } 93 92 94 93 #define SPINLOCK_STATIC_INITIALIZE_NAME(lock_name, desc_name) \ 95 94 static spinlock_t lock_name = { \ 96 . val = { 0 }\95 .flag = ATOMIC_FLAG_INIT \ 97 96 } 98 97 … … 126 125 NO_TRACE static inline void spinlock_unlock_nondebug(spinlock_t *lock) 127 126 { 128 /* 129 * Prevent critical section code from bleeding out this way down. 130 */ 131 CS_LEAVE_BARRIER(); 132 133 atomic_set(&lock->val, 0); 127 atomic_flag_clear_explicit(&lock->flag, memory_order_release); 134 128 preemption_enable(); 135 129 } … … 215 209 .lock = { \ 216 210 .name = desc_name, \ 217 . val = { 0 }\211 .flag = ATOMIC_FLAG_INIT \ 218 212 }, \ 219 213 .guard = false, \ … … 225 219 .lock = { \ 226 220 .name = desc_name, \ 227 . val = { 0 }\221 .flag = ATOMIC_FLAG_INIT \ 228 222 }, \ 229 223 .guard = false, \ … … 236 230 irq_spinlock_t lock_name = { \ 237 231 .lock = { \ 238 . val = { 0 }\232 .flag = ATOMIC_FLAG_INIT \ 239 233 }, \ 240 234 .guard = false, \ … … 245 239 static irq_spinlock_t lock_name = { \ 246 240 .lock = { \ 247 . val = { 0 }\241 .flag = ATOMIC_FLAG_INIT \ 248 242 }, \ 249 243 .guard = false, \
Note:
See TracChangeset
for help on using the changeset viewer.