52 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			52 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* EXTERN should be extern, except for the allocate file */
 | 
						|
#ifdef ALLOCATE
 | 
						|
#undef EXTERN
 | 
						|
#define EXTERN
 | 
						|
#endif
 | 
						|
 | 
						|
#include <assert.h>
 | 
						|
#include <sys/types.h>
 | 
						|
#include <sys/signal.h>
 | 
						|
 | 
						|
#define MTHREAD_RND_SCHED	0	/* Enable/disable random scheduling */
 | 
						|
#define NO_THREADS 4 
 | 
						|
#define MAX_THREAD_POOL 1024
 | 
						|
#define STACKSZ 4096
 | 
						|
#define MAIN_THREAD (-1)
 | 
						|
#define NO_THREAD (-2)
 | 
						|
#define isokthreadid(i)	(i == MAIN_THREAD || (i >= 0 && i < no_threads))
 | 
						|
#define MTHREAD_INIT_MAGIC 0xca11ab1e
 | 
						|
#define MTHREAD_NOT_INUSE  0xdefec7
 | 
						|
 | 
						|
typedef enum {
 | 
						|
  MS_CONDITION, MS_DEAD, MS_EXITING, MS_MUTEX, MS_RUNNABLE, MS_NEEDRESET
 | 
						|
} mthread_state_t;
 | 
						|
 | 
						|
struct __mthread_tcb {
 | 
						|
  mthread_thread_t m_tid;		/* My own ID */
 | 
						|
  mthread_state_t m_state;		/* Thread state */
 | 
						|
  struct __mthread_attr m_attr;		/* Thread attributes */
 | 
						|
  struct __mthread_cond *m_cond;	/* Condition variable that this thread
 | 
						|
  					 * might be blocking on */
 | 
						|
  void *(*m_proc)(void *);		/* Procedure to run */
 | 
						|
  void *m_arg;				/* Argument passed to procedure */
 | 
						|
  void *m_result;			/* Result after procedure returns */
 | 
						|
  mthread_cond_t m_exited;		/* Condition variable signaling this
 | 
						|
  					 * thread has ended */
 | 
						|
  mthread_mutex_t m_exitm;		/* Mutex to accompany exit condition */
 | 
						|
  ucontext_t m_context;			/* Thread machine context */
 | 
						|
  struct __mthread_tcb *m_next;		/* Next thread in linked list */
 | 
						|
};
 | 
						|
typedef struct __mthread_tcb mthread_tcb_t;
 | 
						|
 | 
						|
EXTERN mthread_thread_t current_thread;
 | 
						|
EXTERN mthread_queue_t free_threads;
 | 
						|
EXTERN mthread_queue_t run_queue;		/* FIFO of runnable threads */
 | 
						|
EXTERN mthread_tcb_t **threads;
 | 
						|
EXTERN mthread_tcb_t mainthread;
 | 
						|
EXTERN int no_threads;
 | 
						|
EXTERN int used_threads;
 | 
						|
EXTERN int need_reset;
 | 
						|
EXTERN int running_main_thread;
 | 
						|
 |