Blame htl/pt-detach.c

Packit Service 82fcde
/* Detach a thread.
Packit Service 82fcde
   Copyright (C) 2000-2018 Free Software Foundation, Inc.
Packit Service 82fcde
   This file is part of the GNU C Library.
Packit Service 82fcde
Packit Service 82fcde
   The GNU C Library is free software; you can redistribute it and/or
Packit Service 82fcde
   modify it under the terms of the GNU Lesser General Public
Packit Service 82fcde
   License as published by the Free Software Foundation; either
Packit Service 82fcde
   version 2.1 of the License, or (at your option) any later version.
Packit Service 82fcde
Packit Service 82fcde
   The GNU C Library is distributed in the hope that it will be useful,
Packit Service 82fcde
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 82fcde
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service 82fcde
   Lesser General Public License for more details.
Packit Service 82fcde
Packit Service 82fcde
   You should have received a copy of the GNU Lesser General Public
Packit Service 82fcde
   License along with the GNU C Library;  if not, see
Packit Service 82fcde
   <http://www.gnu.org/licenses/>.  */
Packit Service 82fcde
Packit Service 82fcde
#include <errno.h>
Packit Service 82fcde
#include <pthread.h>
Packit Service 82fcde
#include <stddef.h>
Packit Service 82fcde
Packit Service 82fcde
#include <pt-internal.h>
Packit Service 82fcde
Packit Service 82fcde
/* Indicate that the storage for THREAD can be reclaimed when it
Packit Service 82fcde
   terminates.  */
Packit Service 82fcde
int
Packit Service 82fcde
__pthread_detach (pthread_t thread)
Packit Service 82fcde
{
Packit Service 82fcde
  struct __pthread *pthread;
Packit Service 82fcde
  int err = 0;
Packit Service 82fcde
Packit Service 82fcde
  /* Lookup the thread structure for THREAD.  */
Packit Service 82fcde
  pthread = __pthread_getid (thread);
Packit Service 82fcde
  if (pthread == NULL)
Packit Service 82fcde
    return ESRCH;
Packit Service 82fcde
Packit Service 82fcde
  __pthread_mutex_lock (&pthread->state_lock);
Packit Service 82fcde
Packit Service 82fcde
  switch (pthread->state)
Packit Service 82fcde
    {
Packit Service 82fcde
    case PTHREAD_JOINABLE:
Packit Service 82fcde
      /* THREAD still running.  Mark it as detached such that its
Packit Service 82fcde
         resources can be reclaimed as soon as the thread exits.  */
Packit Service 82fcde
      pthread->state = PTHREAD_DETACHED;
Packit Service 82fcde
Packit Service 82fcde
      /* Broadcast the condition.  This will make threads that are
Packit Service 82fcde
         waiting to join THREAD continue with hopefully disastrous
Packit Service 82fcde
         consequences instead of blocking indefinitely.  */
Packit Service 82fcde
      __pthread_cond_broadcast (&pthread->state_cond);
Packit Service 82fcde
      __pthread_mutex_unlock (&pthread->state_lock);
Packit Service 82fcde
Packit Service 82fcde
      __pthread_dealloc (pthread);
Packit Service 82fcde
      break;
Packit Service 82fcde
Packit Service 82fcde
    case PTHREAD_EXITED:
Packit Service 82fcde
      __pthread_mutex_unlock (&pthread->state_lock);
Packit Service 82fcde
Packit Service 82fcde
      /* THREAD has already exited.  PTHREAD remained after the thread
Packit Service 82fcde
         exited in order to provide the exit status, but it turns out
Packit Service 82fcde
         it won't be needed.  */
Packit Service 82fcde
      __pthread_dealloc (pthread);
Packit Service 82fcde
      break;
Packit Service 82fcde
Packit Service 82fcde
    case PTHREAD_TERMINATED:
Packit Service 82fcde
      /* Pretend THREAD wasn't there in the first place.  */
Packit Service 82fcde
      __pthread_mutex_unlock (&pthread->state_lock);
Packit Service 82fcde
      err = ESRCH;
Packit Service 82fcde
      break;
Packit Service 82fcde
Packit Service 82fcde
    default:
Packit Service 82fcde
      /* Thou shalt not detach non-joinable threads!  */
Packit Service 82fcde
      __pthread_mutex_unlock (&pthread->state_lock);
Packit Service 82fcde
      err = EINVAL;
Packit Service 82fcde
      break;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  return err;
Packit Service 82fcde
}
Packit Service 82fcde
strong_alias (__pthread_detach, pthread_detach)