Blame gl/glthread/threadlib.c

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