lwp_jobctrl.c 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. /*
  2. * Copyright (c) 2006-2023, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2023-11-13 Shell init ver.
  9. */
  10. #define DBG_TAG "lwp.tty"
  11. #define DBG_LVL DBG_INFO
  12. #include <rtdbg.h>
  13. #include <terminal/terminal.h>
  14. #include "lwp_internal.h"
  15. static void jobctrl_set_pgrp_orphaned(struct rt_processgroup *pgrp)
  16. {
  17. rt_lwp_t proc, nx_proc;
  18. PGRP_LOCK(pgrp);
  19. pgrp->is_orphaned = 1;
  20. rt_list_for_each_entry(proc, &pgrp->process, pgrp_node)
  21. {
  22. LWP_LOCK(proc);
  23. if (proc->jobctl_stopped)
  24. {
  25. LWP_UNLOCK(proc);
  26. rt_list_for_each_entry_safe(proc, nx_proc, &pgrp->process, pgrp_node)
  27. {
  28. LWP_LOCK(proc);
  29. lwp_signal_kill(proc, SIGHUP, SI_KERNEL, 0);
  30. lwp_signal_kill(proc, SIGCONT, SI_KERNEL, 0);
  31. LWP_UNLOCK(proc);
  32. }
  33. }
  34. LWP_UNLOCK(proc);
  35. }
  36. PGRP_UNLOCK(pgrp);
  37. }
  38. void lwp_jobctrl_on_exit(struct rt_lwp *lwp)
  39. {
  40. rt_processgroup_t pgrp;
  41. rt_session_t session;
  42. lwp_tty_t tp;
  43. pgrp = lwp->pgrp;
  44. RT_ASSERT(pgrp);
  45. session = pgrp->session;
  46. RT_ASSERT(session);
  47. /**
  48. * as a session leader, we have to mark tty as freed. So others can race to
  49. * take it before we actually close and released that tty
  50. */
  51. SESS_LOCK(session);
  52. if (session->sid == lwp->pid)
  53. {
  54. tp = session->ctty;
  55. session->leader = 0;
  56. /* signal to foreground group that modem is disconnected */
  57. if (tp)
  58. {
  59. tty_lock(tp);
  60. if (tp->t_session == session)
  61. lwp_tty_signal_pgrp(tp, SIGHUP);
  62. tty_unlock(tp);
  63. }
  64. /* revoke tty vnode ? */
  65. rt_list_for_each_entry(pgrp, &session->processgroup, pgrp_list_node)
  66. {
  67. jobctrl_set_pgrp_orphaned(pgrp);
  68. }
  69. }
  70. SESS_UNLOCK(session);
  71. /* release tty */
  72. /* allow tty stolen? */
  73. }