#ifndef __THREAD_H
#define __THREAD_H
#ifdef __cplusplus
extern "C"
{
#endif
#include <kernel/proc.h>
#define THREAD_RUNNING 0
#define THREAD_DELETED 1
#define THREAD_WAIT_TIMEOUT 2
#define THREAD_WAIT_HANDLE 3
#define THREAD_WAIT_OBJECT 4
struct context_t;
typedef bool (CDECL *V86HANDLER)(struct context_t*);
typedef struct thread_t thread_t;
struct thread_t
{
struct process_t *process;
dword kernel_esp; // must be thread_t+4
dword id;
thread_t *prev, *next, *prev_queue, *next_queue;
unsigned priority;
dword *kernel_stack, *user_stack;
dword suspend;
byte state;
union
{
dword time;
struct
{
void** handles;
unsigned num_handles;
bool wait_all;
} handle;
} wait;
thread_info_t* info;
V86HANDLER v86handler;
};
typedef struct thread_queue_t thread_queue_t;
struct thread_queue_t
{
thread_t *first, *last, *current;
};
//CASSERT(offsetof(thread_t, process) == 0);
//CASSERT(offsetof(thread_t, kernel_esp) == 4);
thread_t* thrCreate(int level, process_t* proc, const void* entry_point,
unsigned priority);
thread_t* thrCreate86(process_t* proc, const byte* code, size_t code_size,
V86HANDLER handler, unsigned priority);
void thrDelete(thread_t* thr);
void thrSchedule();
context_t* thrContext(thread_t* thr);
void thrSleep(thread_t* thr, dword ms);
bool thrWaitFinished(void** hnd, unsigned num_handles, bool wait_all);
void thrWaitHandle(thread_t* thr, void** hnd, unsigned num_handles,
bool wait_all);
void thrCall(thread_t* thr, void* addr, void* params,
size_t sizeof_params);
thread_t* thrCurrent();
bool thrDequeue(thread_t* thr, thread_queue_t* queue);
void thrEnqueue(thread_t* thr, thread_queue_t* queue);
void thrRun(thread_t* thr);
void thrSuspend(thread_t* thr, bool suspend);
extern thread_t DLLIMPORT *thr_first, *thr_last, *current;
#ifdef __cplusplus
}
#endif
#endif