Lines Matching refs:lt
37 void _lthread_exit_handler(struct lthread *lt) in _lthread_exit_handler() argument
40 lt->state |= BIT(ST_LT_EXITED); in _lthread_exit_handler()
42 if (!(lt->state & BIT(ST_LT_DETACH))) { in _lthread_exit_handler()
59 void _lthread_free(struct lthread *lt) in _lthread_free() argument
62 DIAG_EVENT(lt, LT_DIAG_LTHREAD_FREE, lt, 0); in _lthread_free()
65 _lthread_tls_destroy(lt); in _lthread_free()
69 _lthread_objcache_free(lt->tls->root_sched->per_lthread_cache, in _lthread_free()
70 lt->per_lthread_data); in _lthread_free()
73 _lthread_objcache_free(lt->tls->root_sched->tls_cache, lt->tls); in _lthread_free()
76 _lthread_objcache_free(lt->stack_container->root_sched->stack_cache, in _lthread_free()
77 lt->stack_container); in _lthread_free()
80 _lthread_objcache_free(lt->root_sched->lthread_cache, lt); in _lthread_free()
105 struct lthread *lt = (struct lthread *)arg; in _lthread_exec() local
108 lt->fun(lt->arg); in _lthread_exec()
110 if (lt->exit_handler != NULL) in _lthread_exec()
111 lt->exit_handler(lt); in _lthread_exec()
119 _lthread_init(struct lthread *lt, in _lthread_init() argument
124 lt->fun = fun; in _lthread_init()
125 lt->arg = arg; in _lthread_init()
126 lt->exit_handler = exit_handler; in _lthread_init()
129 lt->birth = _sched_now(); in _lthread_init()
130 lt->state = BIT(ST_LT_INIT); in _lthread_init()
131 lt->join = LT_JOIN_INITIAL; in _lthread_init()
137 void _lthread_set_stack(struct lthread *lt, void *stack, size_t stack_size) in _lthread_set_stack() argument
140 lt->stack = stack; in _lthread_set_stack()
141 lt->stack_size = stack_size; in _lthread_set_stack()
143 arch_set_stack(lt, _lthread_exec); in _lthread_set_stack()
162 struct lthread *lt = NULL; in lthread_create() local
173 lt = _lthread_objcache_alloc((THIS_SCHED)->lthread_cache); in lthread_create()
174 if (lt == NULL) in lthread_create()
177 bzero(lt, sizeof(struct lthread)); in lthread_create()
178 lt->root_sched = THIS_SCHED; in lthread_create()
181 _lthread_init(lt, fun, arg, _lthread_exit_handler); in lthread_create()
184 *new_lt = lt; in lthread_create()
189 DIAG_CREATE_EVENT(lt, LT_DIAG_LTHREAD_CREATE); in lthread_create()
192 _ready_queue_insert(_lthread_sched_get(lcore_id), lt); in lthread_create()
201 static inline void _lthread_sched_sleep(struct lthread *lt, uint64_t nsecs) in _lthread_sched_sleep() argument
203 uint64_t state = lt->state; in _lthread_sched_sleep()
207 _timer_start(lt, clks); in _lthread_sched_sleep()
208 lt->state = state | BIT(ST_LT_SLEEPING); in _lthread_sched_sleep()
210 DIAG_EVENT(lt, LT_DIAG_LTHREAD_SLEEP, clks, 0); in _lthread_sched_sleep()
221 int _lthread_desched_sleep(struct lthread *lt) in _lthread_desched_sleep() argument
223 uint64_t state = lt->state; in _lthread_desched_sleep()
226 _timer_stop(lt); in _lthread_desched_sleep()
228 lt->state = state | BIT(ST_LT_READY); in _lthread_desched_sleep()
271 struct lthread *lt = (struct lthread *) arg; in _cancel() local
273 lt->state |= BIT(ST_LT_CANCELLED); in _cancel()
284 struct lthread *lt; in lthread_cancel() local
294 lthread_create(<, in lthread_cancel()
309 struct lthread *lt = THIS_LTHREAD; in lthread_sleep() local
311 _lthread_sched_sleep(lt, nsecs); in lthread_sleep()
320 struct lthread *lt = THIS_LTHREAD; in lthread_sleep_clks() local
321 uint64_t state = lt->state; in lthread_sleep_clks()
324 _timer_start(lt, clks); in lthread_sleep_clks()
325 lt->state = state | BIT(ST_LT_SLEEPING); in lthread_sleep_clks()
327 DIAG_EVENT(lt, LT_DIAG_LTHREAD_SLEEP, clks, 0); in lthread_sleep_clks()
336 struct lthread *lt = THIS_LTHREAD; in lthread_yield() local
338 DIAG_EVENT(lt, LT_DIAG_LTHREAD_YIELD, 0, 0); in lthread_yield()
340 _ready_queue_insert(THIS_SCHED, lt); in lthread_yield()
341 ctx_switch(&(THIS_SCHED)->ctx, <->ctx); in lthread_yield()
350 struct lthread *lt = THIS_LTHREAD; in lthread_exit() local
353 if (lt->state & BIT(ST_LT_DETACH)) in lthread_exit()
360 if ((lt->join == LT_JOIN_INITIAL) in lthread_exit()
361 && rte_atomic64_cmpset(<->join, LT_JOIN_INITIAL, in lthread_exit()
364 DIAG_EVENT(lt, LT_DIAG_LTHREAD_EXIT, 1, 0); in lthread_exit()
367 if ((ptr != NULL) && (lt->lt_join->lt_exit_ptr != NULL)) in lthread_exit()
368 *(lt->lt_join->lt_exit_ptr) = ptr; in lthread_exit()
371 lt->join = LT_JOIN_EXIT_VAL_SET; in lthread_exit()
374 DIAG_EVENT(lt, LT_DIAG_LTHREAD_EXIT, 0, 0); in lthread_exit()
376 if ((ptr != NULL) && (lt->lt_join->lt_exit_ptr != NULL)) in lthread_exit()
377 *(lt->lt_join->lt_exit_ptr) = ptr; in lthread_exit()
379 lt->join = LT_JOIN_EXIT_VAL_SET; in lthread_exit()
380 _ready_queue_insert(lt->lt_join->sched, in lthread_exit()
381 (struct lthread *)lt->lt_join); in lthread_exit()
386 while (lt->join != LT_JOIN_EXIT_VAL_READ) in lthread_exit()
390 lt->join = LT_JOIN_INITIAL; in lthread_exit()
393 lt->state |= (BIT(ST_LT_DETACH) | BIT(ST_LT_EXITED)); in lthread_exit()
400 int lthread_join(struct lthread *lt, void **ptr) in lthread_join() argument
402 if (lt == NULL) in lthread_join()
406 uint64_t lt_state = lt->state; in lthread_join()
409 if ((lt_state & BIT(ST_LT_DETACH)) || (lt->join == LT_JOIN_THREAD_SET)) in lthread_join()
412 lt->lt_join = current; in lthread_join()
418 if ((lt->join == LT_JOIN_INITIAL) in lthread_join()
419 && rte_atomic64_cmpset(<->join, LT_JOIN_INITIAL, in lthread_join()
422 DIAG_EVENT(current, LT_DIAG_LTHREAD_JOIN, lt, 1); in lthread_join()
425 DIAG_EVENT(current, LT_DIAG_LTHREAD_JOIN, lt, 0); in lthread_join()
426 _ready_queue_insert(lt->sched, lt); in lthread_join()
430 while (lt->join != LT_JOIN_EXIT_VAL_SET) in lthread_join()
438 lt->join = LT_JOIN_EXIT_VAL_READ; in lthread_join()
449 struct lthread *lt = THIS_LTHREAD; in lthread_detach() local
451 DIAG_EVENT(lt, LT_DIAG_LTHREAD_DETACH, 0, 0); in lthread_detach()
453 uint64_t state = lt->state; in lthread_detach()
455 lt->state = state | BIT(ST_LT_DETACH); in lthread_detach()
464 struct lthread *lt = THIS_LTHREAD; in lthread_set_funcname() local
466 strncpy(lt->funcname, f, sizeof(lt->funcname)); in lthread_set_funcname()
467 lt->funcname[sizeof(lt->funcname)-1] = 0; in lthread_set_funcname()