forked from 0intro/libtask
-
Notifications
You must be signed in to change notification settings - Fork 0
/
task.h
183 lines (156 loc) · 3.08 KB
/
task.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
/* Copyright (c) 2005 Russ Cox, MIT; see COPYRIGHT */
#ifndef _TASK_H_
#define _TASK_H_ 1
#ifdef __cplusplus
extern "C" {
#endif
#include <stdarg.h>
#include <inttypes.h>
/*
* basic procs and threads
*/
typedef struct Task Task;
typedef struct Tasklist Tasklist;
int anyready(void);
int taskcreate(void (*f)(void *arg), void *arg, unsigned int stacksize);
void taskexit(int);
void taskexitall(int);
void taskmain(int argc, char *argv[]);
int taskyield(void);
void** taskdata(void);
void needstack(int);
void taskname(char*, ...);
void taskstate(char*, ...);
char* taskgetname(void);
char* taskgetstate(void);
void tasksystem(void);
unsigned int taskdelay(unsigned int);
unsigned int taskid(void);
struct Tasklist /* used internally */
{
Task *head;
Task *tail;
};
/*
* queuing locks
*/
typedef struct QLock QLock;
struct QLock
{
Task *owner;
Tasklist waiting;
};
void qlock(QLock*);
int canqlock(QLock*);
void qunlock(QLock*);
/*
* reader-writer locks
*/
typedef struct RWLock RWLock;
struct RWLock
{
int readers;
Task *writer;
Tasklist rwaiting;
Tasklist wwaiting;
};
void rlock(RWLock*);
int canrlock(RWLock*);
void runlock(RWLock*);
void wlock(RWLock*);
int canwlock(RWLock*);
void wunlock(RWLock*);
/*
* sleep and wakeup (condition variables)
*/
typedef struct Rendez Rendez;
struct Rendez
{
QLock *l;
Tasklist waiting;
};
void tasksleep(Rendez*);
int taskwakeup(Rendez*);
int taskwakeupall(Rendez*);
/*
* channel communication
*/
typedef struct Alt Alt;
typedef struct Altarray Altarray;
typedef struct Channel Channel;
enum
{
CHANEND,
CHANSND,
CHANRCV,
CHANNOP,
CHANNOBLK,
};
struct Alt
{
Channel *c;
void *v;
unsigned int op;
Task *task;
Alt *xalt;
};
struct Altarray
{
Alt **a;
unsigned int n;
unsigned int m;
};
struct Channel
{
unsigned int bufsize;
unsigned int elemsize;
unsigned char *buf;
unsigned int nbuf;
unsigned int off;
Altarray asend;
Altarray arecv;
char *name;
};
int chanalt(Alt *alts);
Channel* chancreate(int elemsize, int elemcnt);
void chanfree(Channel *c);
int chaninit(Channel *c, int elemsize, int elemcnt);
int channbrecv(Channel *c, void *v);
void* channbrecvp(Channel *c);
unsigned long channbrecvul(Channel *c);
int channbsend(Channel *c, void *v);
int channbsendp(Channel *c, void *v);
int channbsendul(Channel *c, unsigned long v);
int chanrecv(Channel *c, void *v);
void* chanrecvp(Channel *c);
unsigned long chanrecvul(Channel *c);
int chansend(Channel *c, void *v);
int chansendp(Channel *c, void *v);
int chansendul(Channel *c, unsigned long v);
/*
* Threaded I/O.
*/
int fdread(int, void*, int);
int fdread1(int, void*, int); /* always uses fdwait */
int fdreadn(int, void*, int);
int fdwrite(int, void*, int);
void fdwait(int, int);
int fdnoblock(int);
void fdtask(void*);
/*
* Network dialing - sets non-blocking automatically
*/
enum
{
UDP = 0,
TCP = 1,
};
int netannounce(int, char*, int);
int netaccept(int, char*, int*);
int netdial(int, char*, int);
int netlookup(char*, unsigned char*); /* blocks entire program! */
int netdial(int, char*, int);
#ifdef __cplusplus
}
#endif
#endif