Changeset 45c8eea in mainline
- Timestamp:
- 2018-11-11T15:47:39Z (6 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- f4cb6c5f
- Parents:
- 269bc459
- git-author:
- Jakub Jermar <jakub@…> (2018-11-10 17:49:44)
- git-committer:
- Jakub Jermar <jakub@…> (2018-11-11 15:47:39)
- Location:
- uspace/lib/c
- Files:
-
- 14 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/async/client.c
r269bc459 r45c8eea 122 122 #include "../private/fibril.h" 123 123 124 static FIBRIL_RMUTEX_INITIALIZE(message_mutex);124 static fibril_rmutex_t message_mutex; 125 125 126 126 /** Naming service session */ … … 173 173 void __async_client_init(void) 174 174 { 175 if (fibril_rmutex_initialize(&message_mutex) != EOK) 176 abort(); 177 175 178 session_ns.iface = 0; 176 179 session_ns.mgmt = EXCHANGE_ATOMIC; -
uspace/lib/c/generic/async/ports.c
r269bc459 r45c8eea 100 100 101 101 /** Futex guarding the interface hash table. */ 102 static FIBRIL_RMUTEX_INITIALIZE(interface_mutex);102 static fibril_rmutex_t interface_mutex; 103 103 static hash_table_t interface_hash_table; 104 104 … … 292 292 void __async_ports_init(void) 293 293 { 294 if (fibril_rmutex_initialize(&interface_mutex) != EOK) 295 abort(); 296 294 297 if (!hash_table_create(&interface_hash_table, 0, 0, 295 298 &interface_hash_table_ops)) -
uspace/lib/c/generic/async/server.c
r269bc459 r45c8eea 216 216 } 217 217 218 static FIBRIL_RMUTEX_INITIALIZE(client_mutex);218 static fibril_rmutex_t client_mutex; 219 219 static hash_table_t client_hash_table; 220 220 221 221 // TODO: lockfree notification_queue? 222 static FIBRIL_RMUTEX_INITIALIZE(notification_mutex);222 static fibril_rmutex_t notification_mutex; 223 223 static hash_table_t notification_hash_table; 224 224 static LIST_INITIALIZE(notification_queue); … … 1013 1013 void __async_server_init(void) 1014 1014 { 1015 if (fibril_rmutex_initialize(&client_mutex) != EOK) 1016 abort(); 1017 if (fibril_rmutex_initialize(¬ification_mutex) != EOK) 1018 abort(); 1019 1015 1020 if (!hash_table_create(&client_hash_table, 0, 0, &client_hash_table_ops)) 1016 1021 abort(); -
uspace/lib/c/generic/io/kio.c
r269bc459 r45c8eea 38 38 #include <str.h> 39 39 #include <stdint.h> 40 #include <stdlib.h> 40 41 #include <errno.h> 41 42 #include <abi/kio.h> … … 53 54 char data[KIO_BUFFER_SIZE]; 54 55 size_t used; 55 } kio_buffer = { .futex = FUTEX_INITIALIZER, }; 56 } kio_buffer; 57 58 void __kio_init(void) 59 { 60 if (futex_initialize(&kio_buffer.futex, 1) != EOK) 61 abort(); 62 } 56 63 57 64 errno_t kio_write(const void *buf, size_t size, size_t *nwritten) -
uspace/lib/c/generic/libc.c
r269bc459 r45c8eea 40 40 #include <tls.h> 41 41 #include <fibril.h> 42 #include <fibril_synch.h> 42 43 #include <task.h> 43 44 #include <loader/pcb.h> 44 45 #include <vfs/vfs.h> 45 46 #include <vfs/inbox.h> 47 #include <io/kio.h> 46 48 #include "private/libc.h" 47 49 #include "private/async.h" … … 61 63 void __libc_main(void *pcb_ptr) 62 64 { 65 __kio_init(); 66 63 67 assert(!__tcb_is_set()); 64 68 … … 81 85 82 86 __fibrils_init(); 87 __fibril_synch_init(); 83 88 84 89 /* Initialize the fibril. */ -
uspace/lib/c/generic/malloc.c
r269bc459 r45c8eea 195 195 196 196 /** Futex for thread-safe heap manipulation */ 197 static FIBRIL_RMUTEX_INITIALIZE(malloc_mutex);197 static fibril_rmutex_t malloc_mutex; 198 198 199 199 #define malloc_assert(expr) safe_assert(expr) … … 484 484 void __malloc_init(void) 485 485 { 486 if (fibril_rmutex_initialize(&malloc_mutex) != EOK) 487 abort(); 488 486 489 if (!area_create(PAGE_SIZE)) 487 490 abort(); -
uspace/lib/c/generic/private/fibril.h
r269bc459 r45c8eea 120 120 } fibril_rmutex_t; 121 121 122 #define FIBRIL_RMUTEX_INITIALIZER(name) \ 123 { .futex = FUTEX_INITIALIZE(1) } 124 125 #define FIBRIL_RMUTEX_INITIALIZE(name) \ 126 fibril_rmutex_t name = FIBRIL_RMUTEX_INITIALIZER(name) 127 128 extern void fibril_rmutex_initialize(fibril_rmutex_t *); 122 extern errno_t fibril_rmutex_initialize(fibril_rmutex_t *); 129 123 extern void fibril_rmutex_destroy(fibril_rmutex_t *); 130 124 extern void fibril_rmutex_lock(fibril_rmutex_t *); -
uspace/lib/c/generic/private/futex.h
r269bc459 r45c8eea 46 46 typedef struct futex { 47 47 volatile atomic_int val; 48 volatile atomic_int lock;49 48 volatile cap_waitq_handle_t whandle; 50 49 … … 54 53 } futex_t; 55 54 56 extern voidfutex_initialize(futex_t *futex, int value);55 extern errno_t futex_initialize(futex_t *futex, int value); 57 56 58 57 static inline errno_t futex_destroy(futex_t *futex) … … 64 63 65 64 #ifdef CONFIG_DEBUG_FUTEX 66 67 #define FUTEX_INITIALIZE(val) { (val), 0, CAP_NIL, NULL }68 #define FUTEX_INITIALIZER FUTEX_INITIALIZE(1)69 65 70 66 void __futex_assert_is_locked(futex_t *, const char *); … … 85 81 #else 86 82 87 #define FUTEX_INITIALIZE(val) { (val), 0, CAP_NIL }88 #define FUTEX_INITIALIZER FUTEX_INITIALIZE(1)89 90 83 #define futex_lock(fut) (void) futex_down((fut)) 91 84 #define futex_trylock(fut) futex_trydown((fut)) … … 98 91 #endif 99 92 100 static errno_t allocate_waitq(futex_t *futex) 101 { 102 int expected = 0; 103 while (!atomic_compare_exchange_weak_explicit(&futex->lock, &expected, 104 1, memory_order_acquire, memory_order_relaxed)) 105 expected = 0; 106 107 if (futex->whandle == CAP_NIL) { 108 errno_t rc = __SYSCALL1(SYS_WAITQ_CREATE, 109 (sysarg_t) &futex->whandle); 110 if (rc != EOK) { 111 atomic_store_explicit(&futex->lock, 0, 112 memory_order_release); 113 return rc; 114 } 115 } 116 117 atomic_store_explicit(&futex->lock, 0, memory_order_release); 118 return EOK; 93 static inline errno_t futex_allocate_waitq(futex_t *futex) 94 { 95 return __SYSCALL1(SYS_WAITQ_CREATE, (sysarg_t) &futex->whandle); 119 96 } 120 97 … … 140 117 // TODO: Add tests for this. 141 118 142 // Preallocate the waitq handle so that we don't need to risk a failure 143 // during wakeup 144 if (futex->whandle == CAP_NIL) { 145 errno_t rc = allocate_waitq(futex); 146 if (rc != EOK) 147 return rc; 148 } 119 assert(futex->whandle != CAP_NIL); 149 120 150 121 if (atomic_fetch_sub_explicit(&futex->val, 1, memory_order_acquire) > 0) -
uspace/lib/c/generic/thread/fibril.c
r269bc459 r45c8eea 87 87 88 88 /* This futex serializes access to global data. */ 89 static futex_t fibril_futex = FUTEX_INITIALIZER;89 static futex_t fibril_futex; 90 90 static futex_t ready_semaphore; 91 91 static long ready_st_count; … … 95 95 static LIST_INITIALIZE(timeout_list); 96 96 97 static futex_t ipc_lists_futex = FUTEX_INITIALIZER;97 static futex_t ipc_lists_futex; 98 98 static LIST_INITIALIZE(ipc_waiter_list); 99 99 static LIST_INITIALIZE(ipc_buffer_list); … … 796 796 if (!multithreaded) { 797 797 _ready_debug_check(); 798 futex_initialize(&ready_semaphore, ready_st_count); 798 if (futex_initialize(&ready_semaphore, ready_st_count) != EOK) 799 abort(); 799 800 multithreaded = true; 800 801 } … … 861 862 void __fibrils_init(void) 862 863 { 864 if (futex_initialize(&fibril_futex, 1) != EOK) 865 abort(); 866 if (futex_initialize(&ipc_lists_futex, 1) != EOK) 867 abort(); 868 863 869 /* 864 870 * We allow a fixed, small amount of parallelism for IPC reads, but -
uspace/lib/c/generic/thread/fibril_synch.c
r269bc459 r45c8eea 51 51 #include "../private/futex.h" 52 52 53 voidfibril_rmutex_initialize(fibril_rmutex_t *m)54 { 55 futex_initialize(&m->futex, 1);53 errno_t fibril_rmutex_initialize(fibril_rmutex_t *m) 54 { 55 return futex_initialize(&m->futex, 1); 56 56 } 57 57 … … 90 90 static fibril_local bool deadlocked = false; 91 91 92 static futex_t fibril_synch_futex = FUTEX_INITIALIZER; 92 static futex_t fibril_synch_futex; 93 94 void __fibril_synch_init(void) 95 { 96 if (futex_initialize(&fibril_synch_futex, 1) != EOK) 97 abort(); 98 } 93 99 94 100 typedef struct { -
uspace/lib/c/generic/thread/futex.c
r269bc459 r45c8eea 49 49 * @param val Initialization value. 50 50 * 51 * @return Error code. 51 52 */ 52 voidfutex_initialize(futex_t *futex, int val)53 errno_t futex_initialize(futex_t *futex, int val) 53 54 { 54 55 atomic_store_explicit(&futex->val, val, memory_order_relaxed); 55 atomic_store_explicit(&futex->lock, 0, memory_order_relaxed);56 56 futex->whandle = CAP_NIL; 57 return futex_allocate_waitq(futex); 57 58 } 58 59 -
uspace/lib/c/generic/thread/mpsc.c
r269bc459 r45c8eea 80 80 } 81 81 82 if (fibril_rmutex_initialize(&q->t_lock) != EOK) { 83 free(q); 84 free(n); 85 free(c); 86 return NULL; 87 } 88 82 89 q->elem_size = elem_size; 83 fibril_rmutex_initialize(&q->t_lock);84 90 q->head = q->tail = n; 85 91 q->close_node = c; -
uspace/lib/c/include/fibril_synch.h
r269bc459 r45c8eea 164 164 fibril_semaphore_t name = FIBRIL_SEMAPHORE_INITIALIZER(name, cnt) 165 165 166 extern void __fibril_synch_init(void); 167 166 168 extern void fibril_mutex_initialize(fibril_mutex_t *); 167 169 extern void fibril_mutex_lock(fibril_mutex_t *); -
uspace/lib/c/include/io/kio.h
r269bc459 r45c8eea 42 42 #include <_bits/size_t.h> 43 43 44 extern void __kio_init(void); 44 45 extern errno_t kio_write(const void *, size_t, size_t *); 45 46 extern void kio_update(void);
Note:
See TracChangeset
for help on using the changeset viewer.