1N/A/***********************************************************************
1N/A* *
1N/A* This software is part of the ast package *
1N/A* Copyright (c) 1985-2011 AT&T Intellectual Property *
1N/A* and is licensed under the *
1N/A* Common Public License, Version 1.0 *
1N/A* by AT&T Intellectual Property *
1N/A* *
1N/A* A copy of the License is available at *
1N/A* http://www.opensource.org/licenses/cpl1.0.txt *
1N/A* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
1N/A* *
1N/A* Information and Software Systems Research *
1N/A* AT&T Research *
1N/A* Florham Park NJ *
1N/A* *
1N/A* Glenn Fowler <gsf@research.att.com> *
1N/A* David Korn <dgk@research.att.com> *
1N/A* Phong Vo <kpv@research.att.com> *
1N/A* *
1N/A***********************************************************************/
1N/A#ifndef _VTHREAD_H
1N/A#define _VTHREAD_H 1
1N/A
1N/A#define VTHREAD_VERSION 20001201L
1N/A
1N/A/* Header for the Vthread library.
1N/A** Note that the macro vt_threaded may be defined
1N/A** outside of vthread.h to suppress threading.
1N/A**
1N/A** Written by Kiem-Phong Vo, kpv@research.att.com
1N/A*/
1N/A
1N/A#include <ast_common.h>
1N/A#include <errno.h>
1N/A
1N/A/* ast doesn't do threads yet */
1N/A#if _PACKAGE_ast && !defined(vt_threaded)
1N/A#define vt_threaded 0
1N/A#endif
1N/A
1N/A#if !defined(vt_threaded) || (defined(vt_threaded) && vt_threaded == 1)
1N/A#define _may_use_threads 1
1N/A#else
1N/A#define _may_use_threads 0
1N/A#endif
1N/A#undef vt_threaded
1N/A
1N/A#if _may_use_threads && !defined(vt_threaded) && _hdr_pthread
1N/A#define vt_threaded 1
1N/A#include <pthread.h>
1N/Atypedef pthread_mutex_t _vtmtx_t;
1N/Atypedef pthread_once_t _vtonce_t;
1N/Atypedef pthread_t _vtself_t;
1N/Atypedef pthread_t _vtid_t;
1N/Atypedef pthread_attr_t _vtattr_t;
1N/A
1N/A#if !defined(PTHREAD_ONCE_INIT) && defined(pthread_once_init)
1N/A#define PTHREAD_ONCE_INIT pthread_once_init
1N/A#endif
1N/A
1N/A#endif
1N/A
1N/A#if _may_use_threads && !defined(vt_threaded) && _WIN32
1N/A#define vt_threaded 1
1N/A#include <windows.h>
1N/Atypedef CRITICAL_SECTION _vtmtx_t;
1N/Atypedef int _vtonce_t;
1N/Atypedef HANDLE _vtself_t;
1N/Atypedef DWORD _vtid_t;
1N/Atypedef SECURITY_ATTRIBUTES _vtattr_t;
1N/A#endif
1N/A
1N/A#ifndef vt_threaded
1N/A#define vt_threaded 0
1N/A#endif
1N/A
1N/A/* common attributes for various structures */
1N/A#define VT_RUNNING 000000001 /* thread is running */
1N/A#define VT_SUSPENDED 000000002 /* thread is suspended */
1N/A#define VT_WAITED 000000004 /* thread has been waited */
1N/A#define VT_FREE 000010000 /* object can be freed */
1N/A#define VT_INIT 000020000 /* object was initialized */
1N/A#define VT_BITS 000030007 /* bits that we care about */
1N/A
1N/A/* directives for vtset() */
1N/A#define VT_STACK 1 /* set stack size */
1N/A
1N/Atypedef struct _vtmutex_s Vtmutex_t;
1N/Atypedef struct _vtonce_s Vtonce_t;
1N/Atypedef struct _vthread_s Vthread_t;
1N/A
1N/A#ifndef EINVAL
1N/A#define EINVAL 22
1N/A#endif
1N/A#ifndef EBUSY
1N/A#define EBUSY 16
1N/A#endif
1N/A#ifndef EDEADLK
1N/A#define EDEADLK 45
1N/A#endif
1N/A#ifndef EPERM
1N/A#define EPERM 1
1N/A#endif
1N/A
1N/A_BEGIN_EXTERNS_
1N/A
1N/Aextern Vthread_t* vtopen _ARG_((Vthread_t*, int));
1N/Aextern int vtclose _ARG_((Vthread_t*));
1N/Aextern int vtset _ARG_((Vthread_t*, int, Void_t*));
1N/Aextern int vtrun _ARG_((Vthread_t*, void*(*)(void*), void*));
1N/Aextern int vtkill _ARG_((Vthread_t*));
1N/Aextern int vtwait _ARG_((Vthread_t*));
1N/A
1N/Aextern int vtonce _ARG_((Vtonce_t*, void(*)() ));
1N/A
1N/Aextern Vtmutex_t* vtmtxopen _ARG_((Vtmutex_t*, int));
1N/Aextern int vtmtxclose _ARG_((Vtmutex_t*));
1N/Aextern int vtmtxlock _ARG_((Vtmutex_t*));
1N/Aextern int vtmtxtrylock _ARG_((Vtmutex_t*));
1N/Aextern int vtmtxunlock _ARG_((Vtmutex_t*));
1N/Aextern int vtmtxclrlock _ARG_((Vtmutex_t*));
1N/A
1N/Aextern Void_t* vtstatus _ARG_((Vthread_t*));
1N/Aextern int vterror _ARG_((Vthread_t*));
1N/Aextern int vtmtxerror _ARG_((Vtmutex_t*));
1N/Aextern int vtonceerror _ARG_((Vtonce_t*));
1N/A
1N/A_END_EXTERNS_
1N/A
1N/A#if vt_threaded
1N/A
1N/A/* mutex structure */
1N/Astruct _vtmutex_s
1N/A{ _vtmtx_t lock;
1N/A int count;
1N/A _vtid_t owner;
1N/A int state;
1N/A int error;
1N/A};
1N/A
1N/A/* structure for states of thread */
1N/Astruct _vthread_s
1N/A{ _vtself_t self; /* self-handle */
1N/A _vtid_t id; /* thread id */
1N/A _vtattr_t attrs; /* attributes */
1N/A size_t stack; /* stack size */
1N/A int state; /* execution state */
1N/A int error; /* error status */
1N/A Void_t* exit; /* exit value */
1N/A};
1N/A
1N/A/* structure for exactly once execution */
1N/Astruct _vtonce_s
1N/A{ int done;
1N/A _vtonce_t once;
1N/A int error;
1N/A};
1N/A
1N/A#if _WIN32
1N/A#define VTONCE_INITDATA {0, 0}
1N/A#else
1N/A#define VTONCE_INITDATA {0, PTHREAD_ONCE_INIT }
1N/A#endif
1N/A
1N/A#define vtstatus(vt) ((vt)->exit)
1N/A#define vterror(vt) ((vt)->error)
1N/A#define vtmtxerror(mtx) ((mtx)->error)
1N/A#define vtonceerror(once) ((once)->error)
1N/A
1N/A#endif /*vt_threaded*/
1N/A
1N/A/* fake structures and functions */
1N/A#if !vt_threaded
1N/Astruct _vtmutex_s
1N/A{ int error;
1N/A};
1N/Astruct _vtattr_s
1N/A{ int error;
1N/A};
1N/Astruct _vthread_s
1N/A{ int error;
1N/A};
1N/Astruct _vtonce_s
1N/A{ int error;
1N/A};
1N/A
1N/Atypedef int _vtmtx_t;
1N/Atypedef int _vtonce_t;
1N/Atypedef int _vtself_t;
1N/Atypedef int _vtid_t;
1N/Atypedef int _vtattr_t;
1N/A
1N/A#define VTONCE_INITDATA {0}
1N/A
1N/A#define vtopen(vt,flgs) ((Vthread_t*)0)
1N/A#define vtclose(vt) (-1)
1N/A#define vtkill(vt) (-1)
1N/A#define vtwait(vt) (-1)
1N/A#define vtrun(vt,fn,arg) (-1)
1N/A
1N/A#define vtset(vt,t,v) (-1)
1N/A#define vtonce(on,fu) (-1)
1N/A
1N/A#define vtmtxopen(mtx,flgs) ((Vtmutex_t*)0)
1N/A#define vtmtxclose(mtx) (-1)
1N/A#define vtmtxlock(mtx) (-1)
1N/A#define vtmtxtrylock(mtx) (-1)
1N/A#define vtmtxunlock(mtx) (-1)
1N/A#define vtmtxclrlock(mtx) (-1)
1N/A
1N/A#define vtstatus(vt) ((Void_t*)0)
1N/A#define vterror(vt) (0)
1N/A#define vtmtxerror(mtx) (0)
1N/A#define vtonceerror(once) (0)
1N/A
1N/A#endif /*!vt_threaded*/
1N/A
1N/A#endif /*_VTHREAD_H*/