Changes in / [b9c7425:bc7d44c] in mainline
- Files:
-
- 12 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/include/ipc/sysipc.h
rb9c7425 rbc7d44c 52 52 unative_t sys_ipc_wait_for_call(ipc_data_t *calldata, uint32_t usec, 53 53 int nonblocking); 54 unative_t sys_ipc_poke(void); 54 55 unative_t sys_ipc_forward_fast(unative_t callid, unative_t phoneid, 55 56 unative_t method, unative_t arg1, unative_t arg2, int mode); -
kernel/generic/include/synch/waitq.h
rb9c7425 rbc7d44c 68 68 struct thread; 69 69 70 extern void waitq_initialize(waitq_t *wq); 71 extern int waitq_sleep_timeout(waitq_t *wq, uint32_t usec, int flags); 72 extern ipl_t waitq_sleep_prepare(waitq_t *wq); 73 extern int waitq_sleep_timeout_unsafe(waitq_t *wq, uint32_t usec, int flags); 74 extern void waitq_sleep_finish(waitq_t *wq, int rc, ipl_t ipl); 75 extern void waitq_wakeup(waitq_t *wq, wakeup_mode_t mode); 76 extern void _waitq_wakeup_unsafe(waitq_t *wq, wakeup_mode_t mode); 77 extern void waitq_interrupt_sleep(struct thread *t); 70 extern void waitq_initialize(waitq_t *); 71 extern int waitq_sleep_timeout(waitq_t *, uint32_t, int); 72 extern ipl_t waitq_sleep_prepare(waitq_t *); 73 extern int waitq_sleep_timeout_unsafe(waitq_t *, uint32_t, int); 74 extern void waitq_sleep_finish(waitq_t *, int, ipl_t); 75 extern void waitq_wakeup(waitq_t *, wakeup_mode_t); 76 extern void _waitq_wakeup_unsafe(waitq_t *, wakeup_mode_t); 77 extern void waitq_interrupt_sleep(struct thread *); 78 extern void waitq_unsleep(waitq_t *); 78 79 79 80 #endif -
kernel/generic/include/syscall/syscall.h
rb9c7425 rbc7d44c 66 66 SYS_IPC_FORWARD_SLOW, 67 67 SYS_IPC_WAIT, 68 SYS_IPC_POKE, 68 69 SYS_IPC_HANGUP, 69 70 SYS_IPC_REGISTER_IRQ, -
kernel/generic/src/ipc/sysipc.c
rb9c7425 rbc7d44c 44 44 #include <ipc/ipcrsc.h> 45 45 #include <ipc/kbox.h> 46 #include <synch/waitq.h> 46 47 #include <udebug/udebug_ipc.h> 47 48 #include <arch/interrupt.h> … … 1051 1052 } 1052 1053 1054 /** Interrupt one thread from sys_ipc_wait_for_call(). */ 1055 unative_t sys_ipc_poke(void) 1056 { 1057 waitq_unsleep(&TASK->answerbox.wq); 1058 return EOK; 1059 } 1060 1053 1061 /** Connect an IRQ handler to a task. 1054 1062 * -
kernel/generic/src/synch/waitq.c
rb9c7425 rbc7d44c 171 171 out: 172 172 spinlock_unlock(&threads_lock); 173 interrupts_restore(ipl); 174 } 175 176 /** Interrupt the first thread sleeping in the wait queue. 177 * 178 * Note that the caller somehow needs to know that the thread to be interrupted 179 * is sleeping interruptibly. 180 * 181 * @param wq Pointer to wait queue. 182 */ 183 void waitq_unsleep(waitq_t *wq) 184 { 185 ipl_t ipl; 186 187 ipl = interrupts_disable(); 188 spinlock_lock(&wq->lock); 189 190 if (!list_empty(&wq->head)) { 191 thread_t *t; 192 193 t = list_get_instance(wq->head.next, thread_t, wq_link); 194 spinlock_lock(&t->lock); 195 ASSERT(t->sleep_interruptible); 196 if (t->timeout_pending && timeout_unregister(&t->sleep_timeout)) 197 t->timeout_pending = false; 198 list_remove(&t->wq_link); 199 t->saved_context = t->sleep_interruption_context; 200 t->sleep_queue = NULL; 201 spinlock_unlock(&t->lock); 202 thread_ready(t); 203 } 204 205 spinlock_unlock(&wq->lock); 173 206 interrupts_restore(ipl); 174 207 } -
kernel/generic/src/syscall/syscall.c
rb9c7425 rbc7d44c 137 137 (syshandler_t) sys_ipc_forward_slow, 138 138 (syshandler_t) sys_ipc_wait_for_call, 139 (syshandler_t) sys_ipc_poke, 139 140 (syshandler_t) sys_ipc_hangup, 140 141 (syshandler_t) sys_ipc_register_irq, -
uspace/app/trace/syscalls.c
rb9c7425 rbc7d44c 62 62 [SYS_IPC_FORWARD_SLOW] = { "ipc_forward_slow", 3, V_ERRNO }, 63 63 [SYS_IPC_WAIT] = { "ipc_wait_for_call", 3, V_HASH }, 64 [SYS_IPC_POKE] = { "ipc_poke", 0, V_ERRNO }, 64 65 [SYS_IPC_HANGUP] = { "ipc_hangup", 1, V_ERRNO }, 65 66 [SYS_IPC_REGISTER_IRQ] = { "ipc_register_irq", 4, V_ERRNO }, -
uspace/lib/libc/generic/async.c
rb9c7425 rbc7d44c 106 106 107 107 atomic_t async_futex = FUTEX_INITIALIZER; 108 109 /** Number of threads waiting for IPC in the kernel. */ 110 atomic_t threads_in_ipc_wait = { 0 }; 108 111 109 112 /** Structures of this type represent a waiting fibril. */ … … 683 686 684 687 futex_up(&async_futex); 688 689 atomic_inc(&threads_in_ipc_wait); 685 690 686 691 ipc_call_t call; … … 688 693 SYNCH_FLAGS_NONE); 689 694 695 atomic_dec(&threads_in_ipc_wait); 696 690 697 if (!callid) { 691 698 handle_expired_timeouts(); -
uspace/lib/libc/generic/fibril_sync.c
rb9c7425 rbc7d44c 40 40 #include <assert.h> 41 41 42 static void optimize_execution_power(void) 43 { 44 /* 45 * When waking up a worker fibril previously blocked in fibril 46 * synchronization, chances are that there is an idle manager fibril 47 * waiting for IPC, that could start executing the awakened worker 48 * fibril right away. We try to detect this and bring the manager 49 * fibril back to fruitful work. 50 */ 51 if (atomic_get(&threads_in_ipc_wait) > 0) 52 ipc_poke(); 53 } 54 42 55 void fibril_mutex_initialize(fibril_mutex_t *fm) 43 56 { … … 84 97 list_remove(&f->link); 85 98 fibril_add_ready((fid_t) f); 99 optimize_execution_power(); 86 100 } 87 101 } … … 152 166 fibril_add_ready((fid_t) f); 153 167 frw->writers++; 168 optimize_execution_power(); 154 169 break; 155 170 } else { … … 157 172 fibril_add_ready((fid_t) f); 158 173 frw->readers++; 174 optimize_execution_power(); 159 175 } 160 176 } … … 200 216 list_remove(&f->link); 201 217 fibril_add_ready((fid_t) f); 218 optimize_execution_power(); 202 219 if (once) 203 220 break; -
uspace/lib/libc/generic/ipc.c
rb9c7425 rbc7d44c 565 565 } 566 566 567 /** Interrupt one thread of this task from waiting for IPC. */ 568 void ipc_poke(void) 569 { 570 __SYSCALL0(SYS_IPC_POKE); 571 } 572 567 573 /** Ask destination to do a callback connection. 568 574 * -
uspace/lib/libc/include/async.h
rb9c7425 rbc7d44c 47 47 extern atomic_t async_futex; 48 48 49 extern atomic_t threads_in_ipc_wait; 50 49 51 extern int __async_init(void); 50 52 extern ipc_callid_t async_get_call_timeout(ipc_call_t *call, suseconds_t usecs); -
uspace/lib/libc/include/ipc/ipc.h
rb9c7425 rbc7d44c 192 192 extern ipc_callid_t ipc_wait_cycle(ipc_call_t *, uint32_t, int); 193 193 extern ipc_callid_t ipc_wait_for_call_timeout(ipc_call_t *, uint32_t); 194 extern void ipc_poke(void); 194 195 195 196 static inline ipc_callid_t ipc_wait_for_call(ipc_call_t *data)
Note:
See TracChangeset
for help on using the changeset viewer.