/* System includes for Solaris threads. */
#include <thread.h>
#include <synch.h>

/* Constants and types for POSIX thread interface. */
#define _POSIX_THREADS
#define _POSIX_THREAD_ATTR_STACKSIZE
#define _POSIX_THREAD_ATTR_STACKADDR
#define PTHREAD_STACK_MIN thr_min_stack()
#define PTHREAD_CREATE_DETACHED THR_DETACHED
#define PTHREAD_CREATE_JOINABLE 0
typedef struct { int size; void *base; int flags; } pthread_attr_t;
typedef thread_t pthread_t;
typedef mutex_t pthread_mutex_t;
typedef cond_t pthread_cond_t;

/* Translations for attribute initialization and thread creation. */
#define pthread_attr_init(a)        ((a)->base = 0, (a)->size = (a)->flags = 0)
#define pthread_attr_destroy(a)
#define pthread_attr_setstacksize(a, b)   ((a)->size = (b))
#define pthread_attr_getstacksize(a)      ((a)->size)
#define pthread_attr_setstackaddr(a, b)   ((a)->base = (b))
#define pthread_attr_getstackaddr(a)      ((a)->base)
#define pthread_attr_setdetachstate(a, b) ((a)->flags = (b))
#define pthread_attr_getdetachstate(a)    ((a)->flags)
#define pthread_create(a, b, c, d) \
	thr_create((b)->base, (b)->size, c, d, (b)->flags, a)

/* Straightforward translations for mutexes and conditions. */
#define pthread_mutex_init(a, b)          mutex_init(a, USYNC_THREAD, 0)
#define pthread_mutex_destroy	          mutex_destroy
#define pthread_mutex_lock	          mutex_lock
#define pthread_mutex_unlock	          mutex_unlock
#define pthread_mutex_trylock	          mutex_trylock
#define pthread_cond_init(a, b)	          cond_init(a, USYNC_THREAD, 0)
#define pthread_cond_destroy              cond_destroy
#define pthread_cond_wait                 cond_wait
#define pthread_cond_signal               cond_signal
#define pthread_cond_broadcast            cond_broadcast

