Blame gnulib/lib/glthread/threadlib.c

Packit Service 51e54d
/* Multithreading primitives.
Packit Service 51e54d
   Copyright (C) 2005-2014 Free Software Foundation, Inc.
Packit Service 51e54d
Packit Service 51e54d
   This program is free software; you can redistribute it and/or modify
Packit Service 51e54d
   it under the terms of the GNU General Public License as published by
Packit Service 51e54d
   the Free Software Foundation; either version 3, or (at your option)
Packit Service 51e54d
   any later version.
Packit Service 51e54d
Packit Service 51e54d
   This program is distributed in the hope that it will be useful,
Packit Service 51e54d
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 51e54d
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service 51e54d
   GNU General Public License for more details.
Packit Service 51e54d
Packit Service 51e54d
   You should have received a copy of the GNU General Public License
Packit Service 51e54d
   along with this program; if not, see <http://www.gnu.org/licenses/>.  */
Packit Service 51e54d
Packit Service 51e54d
/* Written by Bruno Haible <bruno@clisp.org>, 2005.  */
Packit Service 51e54d
Packit Service 51e54d
#include <config.h>
Packit Service 51e54d
Packit Service 51e54d
/* ========================================================================= */
Packit Service 51e54d
Packit Service 51e54d
#if USE_POSIX_THREADS
Packit Service 51e54d
Packit Service 51e54d
/* Use the POSIX threads library.  */
Packit Service 51e54d
Packit Service 51e54d
# include <pthread.h>
Packit Service 51e54d
# include <stdlib.h>
Packit Service 51e54d
Packit Service 51e54d
# if PTHREAD_IN_USE_DETECTION_HARD
Packit Service 51e54d
Packit Service 51e54d
/* The function to be executed by a dummy thread.  */
Packit Service 51e54d
static void *
Packit Service 51e54d
dummy_thread_func (void *arg)
Packit Service 51e54d
{
Packit Service 51e54d
  return arg;
Packit Service 51e54d
}
Packit Service 51e54d
Packit Service 51e54d
int
Packit Service 51e54d
glthread_in_use (void)
Packit Service 51e54d
{
Packit Service 51e54d
  static int tested;
Packit Service 51e54d
  static int result; /* 1: linked with -lpthread, 0: only with libc */
Packit Service 51e54d
Packit Service 51e54d
  if (!tested)
Packit Service 51e54d
    {
Packit Service 51e54d
      pthread_t thread;
Packit Service 51e54d
Packit Service 51e54d
      if (pthread_create (&thread, NULL, dummy_thread_func, NULL) != 0)
Packit Service 51e54d
        /* Thread creation failed.  */
Packit Service 51e54d
        result = 0;
Packit Service 51e54d
      else
Packit Service 51e54d
        {
Packit Service 51e54d
          /* Thread creation works.  */
Packit Service 51e54d
          void *retval;
Packit Service 51e54d
          if (pthread_join (thread, &retval) != 0)
Packit Service 51e54d
            abort ();
Packit Service 51e54d
          result = 1;
Packit Service 51e54d
        }
Packit Service 51e54d
      tested = 1;
Packit Service 51e54d
    }
Packit Service 51e54d
  return result;
Packit Service 51e54d
}
Packit Service 51e54d
Packit Service 51e54d
# endif
Packit Service 51e54d
Packit Service 51e54d
#endif
Packit Service 51e54d
Packit Service 51e54d
/* ========================================================================= */
Packit Service 51e54d
Packit Service 51e54d
/* This declaration is solely to ensure that after preprocessing
Packit Service 51e54d
   this file is never empty.  */
Packit Service 51e54d
typedef int dummy;