fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi/*
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi * This file and its contents are supplied under the terms of the
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi * Common Development and Distribution License ("CDDL"), version 1.0.
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi * You may only use this file in accordance with the terms of version
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi * 1.0 of the CDDL.
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi *
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi * A full copy of the text of the CDDL should have accompanied this
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi * source. A copy of the CDDL is also available via the Internet at
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi * http://www.illumos.org/license/CDDL.
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi */
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi/*
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi * Copyright 2016 Joyent, Inc.
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi */
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi#include <pthread.h>
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi#include <thread.h>
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi#include <synch.h>
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi#include <threads.h>
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi#include <errno.h>
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi#include <unistd.h>
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi#include <stdlib.h>
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi/*
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi * ISO/IEC C11 thread support.
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi *
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi * In illumos, the underlying implementation of lock related routines is the
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi * same between pthreads and traditional SunOS routines. The same is true with
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi * the C11 routines. Their types are actually just typedef's to other things.
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi * Thus in the implementation here, we treat this as a wrapper around existing
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi * thread related routines and don't sweet the extra indirection.
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi *
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi * Note that in many places the C standard doesn't allow for errors to be
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi * returned. In those cases, if we have an instance of programmer error
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi * (something resulting in EINVAL), we opt to abort the program as we don't have
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi * much other recourse available.
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi */
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchivoid
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchicall_once(once_flag *flag, void (*func)(void))
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi{
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi if (pthread_once(flag, func) != 0)
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi abort();
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi}
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchiint
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchicnd_broadcast(cnd_t *cnd)
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi{
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi int ret;
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi ret = pthread_cond_broadcast(cnd);
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi if (ret == 0)
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi return (thrd_success);
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi else
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi return (thrd_error);
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi}
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchivoid
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchicnd_destroy(cnd_t *cnd)
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi{
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi if (pthread_cond_destroy(cnd) != 0)
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi abort();
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi}
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchiint
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchicnd_init(cnd_t *cnd)
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi{
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi int ret;
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi ret = pthread_cond_init(cnd, NULL);
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi if (ret == 0)
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi return (thrd_success);
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi return (thrd_error);
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi}
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchiint
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchicnd_signal(cnd_t *cnd)
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi{
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi int ret;
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi ret = pthread_cond_signal(cnd);
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi if (ret == 0)
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi return (thrd_success);
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi else
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi return (thrd_error);
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi}
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi/* ARGSUSED */
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchiint
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchicnd_timedwait(cnd_t *_RESTRICT_KYWD cnd, mtx_t *_RESTRICT_KYWD mtx,
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi const struct timespec *_RESTRICT_KYWD ts)
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi{
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi int ret;
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi ret = pthread_cond_timedwait(cnd, mtx, ts);
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi if (ret == 0)
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi return (thrd_success);
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi if (ret == ETIMEDOUT)
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi return (thrd_timedout);
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi return (thrd_error);
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi}
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi/* ARGSUSED */
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchiint
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchicnd_wait(cnd_t *cnd, mtx_t *mtx)
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi{
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi int ret;
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi ret = pthread_cond_wait(cnd, mtx);
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi if (ret == 0)
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi return (thrd_success);
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi return (thrd_error);
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi}
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchivoid
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchimtx_destroy(mtx_t *mtx)
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi{
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi if (pthread_mutex_destroy(mtx) != 0)
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi abort();
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi}
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchiint
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchimtx_init(mtx_t *mtx, int type)
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi{
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi int mtype;
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi switch (type) {
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi case mtx_plain:
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi case mtx_timed:
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi mtype = USYNC_THREAD;
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi break;
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi case mtx_plain | mtx_recursive:
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi case mtx_timed | mtx_recursive:
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi mtype = USYNC_THREAD | LOCK_RECURSIVE;
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi break;
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi default:
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi return (thrd_error);
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi }
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi /*
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi * Here, we buck the trend and use the traditional SunOS routine. It's
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi * much simpler than fighting with pthread attributes.
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi */
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi if (mutex_init((mutex_t *)mtx, mtype, NULL) == 0)
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi return (thrd_success);
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi return (thrd_error);
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi}
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchiint
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchimtx_lock(mtx_t *mtx)
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi{
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi if (pthread_mutex_lock(mtx) == 0)
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi return (thrd_success);
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi return (thrd_error);
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi}
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchiint
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchimtx_timedlock(mtx_t *_RESTRICT_KYWD mtx,
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi const struct timespec *_RESTRICT_KYWD abstime)
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi{
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi int ret;
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi ret = pthread_mutex_timedlock(mtx, abstime);
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi if (ret == ETIMEDOUT)
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi return (thrd_timedout);
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi else if (ret != 0)
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi return (thrd_error);
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi return (thrd_success);
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi}
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchiint
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchimtx_trylock(mtx_t *mtx)
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi{
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi int ret;
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi ret = pthread_mutex_trylock(mtx);
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi if (ret == 0)
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi return (thrd_success);
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi else if (ret == EBUSY)
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi return (thrd_busy);
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi else
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi return (thrd_error);
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi}
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchiint
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchimtx_unlock(mtx_t *mtx)
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi{
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi if (pthread_mutex_unlock(mtx) == 0)
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi return (thrd_success);
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi return (thrd_error);
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi}
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchiint
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchithrd_create(thrd_t *thr, thrd_start_t func, void *arg)
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi{
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi int ret;
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi ret = pthread_create(thr, NULL, (void *(*)(void *))func, arg);
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi if (ret == 0)
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi return (thrd_success);
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi else if (ret == -1 && errno == EAGAIN)
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi return (thrd_nomem);
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi else
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi return (thrd_error);
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi}
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchithrd_t
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchithrd_current(void)
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi{
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi return (pthread_self());
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi}
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchiint
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchithrd_detach(thrd_t thr)
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi{
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi if (pthread_detach(thr) == 0)
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi return (thrd_success);
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi return (thrd_error);
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi}
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchiint
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchithrd_equal(thrd_t t1, thrd_t t2)
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi{
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi return (!pthread_equal(t1, t2));
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi}
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi_NORETURN_KYWD void
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchithrd_exit(int res)
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi{
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi pthread_exit((void *)(uintptr_t)res);
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi}
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchiint
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchithrd_join(thrd_t thrd, int *res)
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi{
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi void *es;
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi if (pthread_join(thrd, &es) != 0)
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi return (thrd_error);
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi if (res != NULL)
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi *res = (uintptr_t)es;
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi return (thrd_success);
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi}
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi/*
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi * thrd_sleep has somewhat odd standardized return values. It doesn't use the
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi * same returns values as the thrd_* family of functions at all.
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi */
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchiint
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchithrd_sleep(const struct timespec *rqtp, struct timespec *rmtp)
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi{
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi int ret;
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi if ((ret = nanosleep(rqtp, rmtp)) == 0)
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi return (0);
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi if (ret == -1 && errno == EINTR)
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi return (-1);
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi return (-2);
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi}
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchivoid
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchithrd_yield(void)
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi{
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi thr_yield();
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi}
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchiint
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchitss_create(tss_t *key, tss_dtor_t dtor)
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi{
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi if (pthread_key_create(key, dtor) == 0)
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi return (thrd_success);
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi return (thrd_error);
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi}
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchivoid
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchitss_delete(tss_t key)
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi{
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi if (pthread_key_delete(key) != 0)
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi abort();
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi}
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchivoid *
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchitss_get(tss_t key)
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi{
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi return (pthread_getspecific(key));
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi}
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchiint
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchitss_set(tss_t key, void *val)
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi{
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi if (pthread_setspecific(key, val) == 0)
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi return (thrd_success);
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi return (thrd_error);
fc2512cfb727d49529d8ed99164db871f4829b73Robert Mustacchi}