/* Support functionality for using threads.
   Copyright (C) 2016-2018 Free Software Foundation, Inc.
   This file is part of the GNU C Library.

   The GNU C Library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   version 2.1 of the License, or (at your option) any later version.

   The GNU C Library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser General Public
   License along with the GNU C Library; if not, see
   <http://www.gnu.org/licenses/>.  */

#ifndef SUPPORT_THREAD_H
#define SUPPORT_THREAD_H

#include <pthread.h>
#include <sys/cdefs.h>

__BEGIN_DECLS

/* Terminate the process (with exit status 0) after SECONDS have
   elapsed, from a helper thread.  The process is terminated with the
   exit function, so atexit handlers are executed.  */
void delayed_exit (int seconds);

/* Terminate the process (with exit status 1) if VALUE is not zero.
   In that case, print a failure message to standard output mentioning
   FUNCTION.  The process is terminated with the exit function, so
   atexit handlers are executed.  */
void xpthread_check_return (const char *function, int value);

/* The following functions call the corresponding libpthread functions
   and terminate the process on error.  */

void xpthread_barrier_init (pthread_barrier_t *barrier,
                            pthread_barrierattr_t *attr, unsigned int count);
void xpthread_barrier_destroy (pthread_barrier_t *barrier);
void xpthread_mutexattr_destroy (pthread_mutexattr_t *);
void xpthread_mutexattr_init (pthread_mutexattr_t *);
void xpthread_mutexattr_setprotocol (pthread_mutexattr_t *, int);
void xpthread_mutexattr_setpshared (pthread_mutexattr_t *, int);
void xpthread_mutexattr_setrobust (pthread_mutexattr_t *, int);
void xpthread_mutexattr_settype (pthread_mutexattr_t *, int);
void xpthread_mutex_init (pthread_mutex_t *, const pthread_mutexattr_t *);
void xpthread_mutex_destroy (pthread_mutex_t *);
void xpthread_mutex_lock (pthread_mutex_t *mutex);
void xpthread_mutex_unlock (pthread_mutex_t *mutex);
void xpthread_mutex_consistent (pthread_mutex_t *);
void xpthread_spin_lock (pthread_spinlock_t *lock);
void xpthread_spin_unlock (pthread_spinlock_t *lock);
void xpthread_cond_wait (pthread_cond_t * cond, pthread_mutex_t * mutex);
pthread_t xpthread_create (pthread_attr_t *attr,
                           void *(*thread_func) (void *), void *closure);
void xpthread_detach (pthread_t thr);
void xpthread_cancel (pthread_t thr);
void *xpthread_join (pthread_t thr);
void xpthread_once (pthread_once_t *guard, void (*func) (void));
void xpthread_attr_destroy (pthread_attr_t *attr);
void xpthread_attr_init (pthread_attr_t *attr);
void xpthread_attr_setdetachstate (pthread_attr_t *attr,
				   int detachstate);
void xpthread_attr_setstacksize (pthread_attr_t *attr,
				 size_t stacksize);
void xpthread_attr_setguardsize (pthread_attr_t *attr,
				 size_t guardsize);

/* This function returns non-zero if pthread_barrier_wait returned
   PTHREAD_BARRIER_SERIAL_THREAD.  */
int xpthread_barrier_wait (pthread_barrier_t *barrier);

void xpthread_rwlock_init (pthread_rwlock_t *rwlock,
			  const pthread_rwlockattr_t *attr);
void xpthread_rwlockattr_init (pthread_rwlockattr_t *attr);
void xpthread_rwlockattr_setkind_np (pthread_rwlockattr_t *attr, int pref);
void xpthread_rwlock_wrlock (pthread_rwlock_t *rwlock);
void xpthread_rwlock_rdlock (pthread_rwlock_t *rwlock);
void xpthread_rwlock_unlock (pthread_rwlock_t *rwlock);

__END_DECLS

#endif /* SUPPORT_THREAD_H */
