Lines Matching refs:lwp

213     rt_inline void _free_proc_dentry(rt_lwp_t lwp)  in _free_proc_dentry()  argument
217 rt_snprintf(pid_str, 64, "%d", lwp->pid); in _free_proc_dentry()
222 #define _free_proc_dentry(lwp) argument
225 void lwp_pid_put(struct rt_lwp *lwp) in lwp_pid_put() argument
227 _free_proc_dentry(lwp); in lwp_pid_put()
230 lwp_pid_put_locked(lwp->pid); in lwp_pid_put()
242 lwp->pid = 0; in lwp_pid_put()
244 lwp_ref_dec(lwp); in lwp_pid_put()
247 static void lwp_pid_set_lwp_locked(pid_t pid, struct rt_lwp *lwp) in lwp_pid_set_lwp_locked() argument
254 p->data = lwp; in lwp_pid_set_lwp_locked()
255 lwp_ref_inc(lwp); in lwp_pid_set_lwp_locked()
266 static void __exit_files(struct rt_lwp *lwp) in __exit_files() argument
268 int fd = lwp->fdt.maxfd - 1; in __exit_files()
274 d = lwp->fdt.fds[fd]; in __exit_files()
278 fdt_fd_release(&lwp->fdt, fd); in __exit_files()
284 void lwp_user_object_lock_init(struct rt_lwp *lwp) in lwp_user_object_lock_init() argument
286 rt_mutex_init(&lwp->object_mutex, "lwp_obj", RT_IPC_FLAG_PRIO); in lwp_user_object_lock_init()
289 void lwp_user_object_lock_destroy(struct rt_lwp *lwp) in lwp_user_object_lock_destroy() argument
291 rt_mutex_detach(&lwp->object_mutex); in lwp_user_object_lock_destroy()
294 void lwp_user_object_lock(struct rt_lwp *lwp) in lwp_user_object_lock() argument
296 if (lwp) in lwp_user_object_lock()
298 rt_mutex_take(&lwp->object_mutex, RT_WAITING_FOREVER); in lwp_user_object_lock()
306 void lwp_user_object_unlock(struct rt_lwp *lwp) in lwp_user_object_unlock() argument
308 if (lwp) in lwp_user_object_unlock()
310 rt_mutex_release(&lwp->object_mutex); in lwp_user_object_unlock()
318 int lwp_user_object_add(struct rt_lwp *lwp, rt_object_t object) in lwp_user_object_add() argument
322 if (lwp && object) in lwp_user_object_add()
324 lwp_user_object_lock(lwp); in lwp_user_object_add()
325 if (!lwp_avl_find((avl_key_t)object, lwp->object_root)) in lwp_user_object_add()
334 lwp_avl_insert(node, &lwp->object_root); in lwp_user_object_add()
338 lwp_user_object_unlock(lwp); in lwp_user_object_add()
343 static rt_err_t _object_node_delete(struct rt_lwp *lwp, struct lwp_avl_struct *node) in _object_node_delete() argument
348 if (!lwp || !node) in _object_node_delete()
389 lwp_avl_remove(node, &lwp->object_root); in _object_node_delete()
394 rt_err_t lwp_user_object_delete(struct rt_lwp *lwp, rt_object_t object) in lwp_user_object_delete() argument
398 if (lwp && object) in lwp_user_object_delete()
402 lwp_user_object_lock(lwp); in lwp_user_object_delete()
403 node = lwp_avl_find((avl_key_t)object, lwp->object_root); in lwp_user_object_delete()
404 ret = _object_node_delete(lwp, node); in lwp_user_object_delete()
405 lwp_user_object_unlock(lwp); in lwp_user_object_delete()
410 void lwp_user_object_clear(struct rt_lwp *lwp) in lwp_user_object_clear() argument
414 lwp_user_object_lock(lwp); in lwp_user_object_clear()
415 while ((node = lwp_map_find_first(lwp->object_root)) != RT_NULL) in lwp_user_object_clear()
417 _object_node_delete(lwp, node); in lwp_user_object_clear()
419 lwp_user_object_unlock(lwp); in lwp_user_object_clear()
504 void lwp_free(struct rt_lwp* lwp) in lwp_free() argument
508 if (lwp == RT_NULL) in lwp_free()
520 LOG_D("lwp free: %p", lwp); in lwp_free()
521 rt_free(lwp->exe_file); in lwp_free()
522 group = lwp_pgrp_find(lwp_pgid_get_byprocess(lwp)); in lwp_free()
524 lwp_pgrp_remove(group, lwp); in lwp_free()
526 LWP_LOCK(lwp); in lwp_free()
528 if (lwp->args != RT_NULL) in lwp_free()
531 lwp->args_length = RT_NULL; in lwp_free()
533 rt_free(lwp->args); in lwp_free()
536 lwp->args = RT_NULL; in lwp_free()
539 lwp_user_object_clear(lwp); in lwp_free()
540 lwp_user_object_lock_destroy(lwp); in lwp_free()
543 if (lwp->data_entry != RT_NULL) in lwp_free()
546 rt_free_align(lwp->data_entry); in lwp_free()
549 rt_lwp_umap_user(lwp, lwp->text_entry, 0); in lwp_free()
550 rt_lwp_free_user(lwp, lwp->data_entry, lwp->data_size); in lwp_free()
552 rt_free_align(lwp->data_entry); in lwp_free()
555 lwp->data_entry = RT_NULL; in lwp_free()
559 if (lwp->lwp_type == LWP_TYPE_DYN_ADDR) in lwp_free()
561 if (lwp->text_entry) in lwp_free()
563 LOG_D("lwp text free: %p", lwp->text_entry); in lwp_free()
565 rt_free((void*)lwp->text_entry); in lwp_free()
567 lwp->text_entry = RT_NULL; in lwp_free()
572 lwp_unmap_user_space(lwp); in lwp_free()
574 timer_list_free(&lwp->timer); in lwp_free()
576 LWP_UNLOCK(lwp); in lwp_free()
577 RT_ASSERT(lwp->lwp_lock.owner == RT_NULL); in lwp_free()
578 rt_mutex_detach(&lwp->lwp_lock); in lwp_free()
584 RT_ASSERT(lwp->pid == 0); in lwp_free()
585 rt_free(lwp); in lwp_free()
589 void _thread_exit(rt_lwp_t lwp, rt_thread_t thread) in _thread_exit() argument
591 LWP_LOCK(lwp); in _thread_exit()
592 lwp->rt_rusage.ru_stime.tv_sec += thread->system_time / RT_TICK_PER_SECOND; in _thread_exit()
593lwp->rt_rusage.ru_stime.tv_usec += thread->system_time % RT_TICK_PER_SECOND * (1000000 / RT_TICK_P… in _thread_exit()
594 lwp->rt_rusage.ru_utime.tv_sec += thread->user_time / RT_TICK_PER_SECOND; in _thread_exit()
595lwp->rt_rusage.ru_utime.tv_usec += thread->user_time % RT_TICK_PER_SECOND * (1000000 / RT_TICK_PER… in _thread_exit()
597 LWP_UNLOCK(lwp); in _thread_exit()
625 void lwp_exit(rt_lwp_t lwp, lwp_status_t status) in lwp_exit() argument
629 if (!lwp) in lwp_exit()
636 RT_ASSERT((struct rt_lwp *)thread->lwp == lwp); in lwp_exit()
637 LOG_D("process(lwp.pid=%d) exit", lwp->pid); in lwp_exit()
642 LWP_LOCK(lwp); in lwp_exit()
647 lwp->lwp_status = status; in lwp_exit()
648 LWP_UNLOCK(lwp); in lwp_exit()
650 lwp_terminate(lwp); in lwp_exit()
652 main_thread = rt_list_entry(lwp->t_grp.prev, struct rt_thread, sibling); in lwp_exit()
658 lwp_terminate(lwp); in lwp_exit()
661 while ((list = tid->sibling.prev) != &lwp->t_grp) in lwp_exit()
667 lwp->lwp_ret = value; in lwp_exit()
671 _thread_exit(lwp, thread); in lwp_exit()
677 struct rt_lwp *lwp; in lwp_thread_exit() local
682 lwp = (struct rt_lwp *)thread->lwp; in lwp_thread_exit()
683 RT_ASSERT(lwp != RT_NULL); in lwp_thread_exit()
688 LWP_LOCK(lwp); in lwp_thread_exit()
689 header_thr = rt_list_entry(lwp->t_grp.prev, struct rt_thread, sibling); in lwp_thread_exit()
690 if (header_thr == thread && thread->sibling.prev == &lwp->t_grp) in lwp_thread_exit()
696 lwp->lwp_status = LWP_CREATE_STAT_EXIT(status); in lwp_thread_exit()
697 LWP_UNLOCK(lwp); in lwp_thread_exit()
699 lwp_terminate(lwp); in lwp_thread_exit()
703 LWP_UNLOCK(lwp); in lwp_thread_exit()
707 _thread_exit(lwp, thread); in lwp_thread_exit()
711 int lwp_ref_inc(struct rt_lwp *lwp) in lwp_ref_inc() argument
714 ref = rt_atomic_add(&lwp->ref, 1); in lwp_ref_inc()
715 LOG_D("%s(%p(%s)): before %d", __func__, lwp, lwp->cmd, ref); in lwp_ref_inc()
720 int lwp_ref_dec(struct rt_lwp *lwp) in lwp_ref_dec() argument
724 ref = rt_atomic_add(&lwp->ref, -1); in lwp_ref_dec()
725 LOG_D("%s(lwp=%p,lwp->cmd=%s): before ref=%d", __func__, lwp, lwp->cmd, ref); in lwp_ref_dec()
731 if (lwp->debug) in lwp_ref_dec()
739 lwp_shm_lwp_free(lwp); in lwp_ref_dec()
742 lwp_free(lwp); in lwp_ref_dec()
756 struct rt_lwp *lwp = RT_NULL; in lwp_from_pid_raw_locked() local
761 lwp = (struct rt_lwp *)p->data; in lwp_from_pid_raw_locked()
764 return lwp; in lwp_from_pid_raw_locked()
769 struct rt_lwp* lwp; in lwp_from_pid_locked() local
770 lwp = pid ? lwp_from_pid_raw_locked(pid) : lwp_self(); in lwp_from_pid_locked()
771 return lwp; in lwp_from_pid_locked()
774 pid_t lwp_to_pid(struct rt_lwp* lwp) in lwp_to_pid() argument
776 if (!lwp) in lwp_to_pid()
780 return lwp->pid; in lwp_to_pid()
785 struct rt_lwp *lwp; in lwp_pid2name() local
789 lwp = lwp_from_pid_locked(pid); in lwp_pid2name()
790 if (lwp) in lwp_pid2name()
792 process_name = strrchr(lwp->cmd, '/'); in lwp_pid2name()
793 process_name = process_name? process_name + 1: lwp->cmd; in lwp_pid2name()
812 struct rt_lwp *lwp = (struct rt_lwp *)lwp_pid_ary[idx].data; in lwp_name2pid() local
814 if (lwp) in lwp_name2pid()
816 process_name = strrchr(lwp->exe_file, '/'); in lwp_name2pid()
817 process_name = process_name? process_name + 1: lwp->cmd; in lwp_name2pid()
820 main_thread = rt_list_entry(lwp->t_grp.prev, struct rt_thread, sibling); in lwp_name2pid()
824 pid = lwp->pid; in lwp_name2pid()
836 rt_lwp_t lwp = lwp_self(); in lwp_getpid() local
837 return lwp ? lwp->pid : 1; in lwp_getpid()
1007 can_accept_evt = waker_lwp->parent == waiter->lwp; in _waitq_filter()
1015 waiter_pgid = lwp_pgid_get_byprocess(waiter->lwp); in _waitq_filter()
1313 if (th.lwp == RT_NULL) in list_process()
1326 struct rt_lwp *lwp = (struct rt_lwp *)lwp_pid_ary[index].data; in list_process() local
1328 if (lwp) in list_process()
1330 list = &lwp->t_grp; in list_process()
1334 … rt_kprintf("%4d %4d %-*.*s ", lwp_to_pid(lwp), thread->tid, maxlen, RT_NAME_MAX, lwp->cmd); in list_process()
1394 if (!thread->lwp) in lwp_check_exit_request()
1403 static void _wait_sibling_exit(rt_lwp_t lwp, rt_thread_t curr_thread);
1404 static void _resr_cleanup(struct rt_lwp *lwp);
1406 void lwp_terminate(struct rt_lwp *lwp) in lwp_terminate() argument
1408 if (!lwp) in lwp_terminate()
1414 LOG_D("%s(lwp=%p \"%s\")", __func__, lwp, lwp->cmd); in lwp_terminate()
1416 LWP_LOCK(lwp); in lwp_terminate()
1418 if (!lwp->terminated) in lwp_terminate()
1421 lwp->terminated = RT_TRUE; in lwp_terminate()
1422 LWP_UNLOCK(lwp); in lwp_terminate()
1424 _wait_sibling_exit(lwp, rt_thread_self()); in lwp_terminate()
1425 _resr_cleanup(lwp); in lwp_terminate()
1429 LWP_UNLOCK(lwp); in lwp_terminate()
1433 static void _wait_sibling_exit(rt_lwp_t lwp, rt_thread_t curr_thread) in _wait_sibling_exit() argument
1441 LWP_LOCK(lwp); in _wait_sibling_exit()
1442 for (list = lwp->t_grp.next; list != &lwp->t_grp; list = list->next) in _wait_sibling_exit()
1463 LWP_UNLOCK(lwp); in _wait_sibling_exit()
1476 LWP_LOCK(lwp); in _wait_sibling_exit()
1477 subthread_is_terminated = (int)(curr_thread->sibling.prev == &lwp->t_grp); in _wait_sibling_exit()
1486 for (list = curr_thread->sibling.prev; list != &lwp->t_grp; list = list->prev) in _wait_sibling_exit()
1504 while ((list = curr_thread->sibling.prev) != &lwp->t_grp) in _wait_sibling_exit()
1522 LWP_UNLOCK(lwp); in _wait_sibling_exit()
1532 static void _notify_parent(rt_lwp_t lwp) in _notify_parent() argument
1537 lwp_status_t lwp_status = lwp->lwp_status; in _notify_parent()
1538 rt_lwp_t parent = lwp->parent; in _notify_parent()
1548 signo_or_exitcode = WEXITSTATUS(lwp->lwp_status); in _notify_parent()
1551 lwp_waitpid_kick(parent, lwp); in _notify_parent()
1565 static void _resr_cleanup(struct rt_lwp *lwp) in _resr_cleanup() argument
1568 lwp_jobctrl_on_exit(lwp); in _resr_cleanup()
1570 LWP_LOCK(lwp); in _resr_cleanup()
1571 lwp_signal_detach(&lwp->signal); in _resr_cleanup()
1580 while (lwp->first_child) in _resr_cleanup()
1584 child = lwp->first_child; in _resr_cleanup()
1585 lwp->first_child = child->sibling; in _resr_cleanup()
1588 LWP_UNLOCK(lwp); in _resr_cleanup()
1603 lwp_ref_dec(lwp); in _resr_cleanup()
1605 LWP_LOCK(lwp); in _resr_cleanup()
1607 LWP_UNLOCK(lwp); in _resr_cleanup()
1616 LWP_LOCK(lwp); in _resr_cleanup()
1617 if (lwp->parent && in _resr_cleanup()
1618 !lwp_sigismember(&lwp->parent->signal.sig_action_nocldwait, SIGCHLD)) in _resr_cleanup()
1621 LWP_UNLOCK(lwp); in _resr_cleanup()
1627 _notify_parent(lwp); in _resr_cleanup()
1631 LWP_UNLOCK(lwp); in _resr_cleanup()
1640 LWP_LOCK(lwp); in _resr_cleanup()
1641 if (lwp->fdt.fds != RT_NULL) in _resr_cleanup()
1646 __exit_files(lwp); in _resr_cleanup()
1647 fds = lwp->fdt.fds; in _resr_cleanup()
1648 lwp->fdt.fds = RT_NULL; in _resr_cleanup()
1649 LWP_UNLOCK(lwp); in _resr_cleanup()
1655 LWP_UNLOCK(lwp); in _resr_cleanup()
1660 lwp_pid_put(lwp); in _resr_cleanup()