(root)/
glibc-2.38/
hurd/
hurdpid.c
       1  /* Copyright (C) 1991-2023 Free Software Foundation, Inc.
       2     This file is part of the GNU C Library.
       3  
       4     The GNU C Library is free software; you can redistribute it and/or
       5     modify it under the terms of the GNU Lesser General Public
       6     License as published by the Free Software Foundation; either
       7     version 2.1 of the License, or (at your option) any later version.
       8  
       9     The GNU C Library is distributed in the hope that it will be useful,
      10     but WITHOUT ANY WARRANTY; without even the implied warranty of
      11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      12     Lesser General Public License for more details.
      13  
      14     You should have received a copy of the GNU Lesser General Public
      15     License along with the GNU C Library; if not, see
      16     <https://www.gnu.org/licenses/>.  */
      17  
      18  #include <hurd.h>
      19  #include <lowlevellock.h>
      20  #include "set-hooks.h"
      21  
      22  pid_t _hurd_pid, _hurd_ppid, _hurd_pgrp;
      23  int _hurd_orphaned;
      24  
      25  static void attribute_used_retain
      26  init_pids (void)
      27  {
      28    __USEPORT (PROC,
      29  	     ({
      30  	       __proc_getpids (port, &_hurd_pid, &_hurd_ppid, &_hurd_orphaned);
      31  	       __proc_getpgrp (port, _hurd_pid, &_hurd_pgrp);
      32  	     }));
      33  }
      34  
      35  SET_RELHOOK (_hurd_proc_subinit, init_pids);
      36  
      37  #include <hurd/msg_server.h>
      38  #include "set-hooks.h"
      39  
      40  DEFINE_HOOK (_hurd_pgrp_changed_hook, (pid_t));
      41  
      42  /* These let user threads synchronize with an operation which changes ids.  */
      43  unsigned int _hurd_pids_changed_stamp;
      44  
      45  kern_return_t
      46  _S_msg_proc_newids (mach_port_t me,
      47  		    task_t task,
      48  		    pid_t ppid, pid_t pgrp, int orphaned)
      49  {
      50    int pgrp_changed;
      51  
      52    if (task != __mach_task_self ())
      53      return EPERM;
      54  
      55    __mach_port_deallocate (__mach_task_self (), task);
      56  
      57    pgrp_changed = pgrp != _hurd_pgrp;
      58    _hurd_ppid = ppid;
      59    _hurd_pgrp = pgrp;
      60    _hurd_orphaned = orphaned;
      61  
      62    if (pgrp_changed)
      63      /* Run things that want notification of a pgrp change.  */
      64      RUN_HOOK (_hurd_pgrp_changed_hook, (pgrp));
      65  
      66    /* Notify any waiting user threads that the id change as been completed.  */
      67    ++_hurd_pids_changed_stamp;
      68    lll_wake (_hurd_pids_changed_stamp, GSYNC_BROADCAST);
      69  
      70    return 0;
      71  }