Rewrite to remove dependence on rendezvous and its bizarre

data structures.  Makes it easier to use pthreads too.
Still need to add code for non-pthreads systems.

Just a checkpoint to switch work to another machine.
This commit is contained in:
rsc 2004-09-17 00:38:29 +00:00
parent 984e353160
commit 06bb4ed20d
15 changed files with 205 additions and 218 deletions

View file

@ -425,22 +425,49 @@ extern void needstack(int);
/*
* synchronization
*/
typedef
struct Lock {
int val;
} Lock;
extern int _tas(int*);
typedef struct Lock Lock;
struct Lock
{
#ifdef PLAN9_PTHREADS
int init;
pthread_mutex_t mutex;
#else
int val;
#endif
};
extern void lock(Lock*);
extern void unlock(Lock*);
extern int canlock(Lock*);
/*
* Used to implement process sleep and wakeup,
* either in terms of pthreads or our own primitives.
* This will be more portable than writing our own
* per-system implementations, and on some systems
* non-pthreads threading implementations break libc
* (cough, Linux, cough).
*/
typedef struct _Procrend _Procrend;
struct _Procrend
{
int asleep;
Lock *l;
void *arg;
#ifdef PLAN9_PTHREADS
pthread_cond_t cond;
#endif
};
extern void _procsleep(_Procrend*);
extern void _procwakeup(_Procrend*);
typedef struct QLp QLp;
struct QLp
{
int inuse;
Lock inuse;
QLp *next;
_Procrend rend;
char state;
};
@ -456,7 +483,7 @@ struct QLock
extern void qlock(QLock*);
extern void qunlock(QLock*);
extern int canqlock(QLock*);
extern void _qlockinit(ulong (*)(ulong, ulong)); /* called only by the thread library */
extern void _qlockinit(void(*)(_Procrend*), void(*)(_Procrend*)); /* called only by the thread library */
typedef
struct RWLock

View file

@ -55,7 +55,7 @@ struct Alt {
/* the next variables are used internally to alt
* they need not be initialized
*/
Channel **tag; /* pointer to rendez-vous tag */
struct Thread *thread; /* thread waiting on this alt */
int entryno; /* entry number */
};

View file

@ -41,6 +41,8 @@ typedef long p9jmp_buf[sizeof(sigjmp_buf)/sizeof(long)];
# undef _NEEDUSHORT
# undef _NEEDUINT
# undef _NEEDULONG
# include <pthread.h>
# define PLAN9_PTHREADS
# endif
#endif
#if defined(__sun__)
@ -48,6 +50,8 @@ typedef long p9jmp_buf[sizeof(sigjmp_buf)/sizeof(long)];
# undef _NEEDUSHORT
# undef _NEEDUINT
# undef _NEEDULONG
# include <pthread.h>
# define PLAN9_PTHREADS
#endif
#if defined(__FreeBSD__)
# include <sys/types.h>
@ -61,8 +65,11 @@ typedef long p9jmp_buf[sizeof(sigjmp_buf)/sizeof(long)];
# undef _NEEDUSHORT
# undef _NEEDUINT
# define _NEEDLL 1
# include <pthread.h>
# define PLAN9_PTHREADS
#endif
typedef signed char schar;
typedef unsigned int u32int;
typedef int s32int;