Rev 2927 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2927 | Rev 4691 | ||
---|---|---|---|
Line 34... | Line 34... | ||
34 | 34 | ||
35 | #ifndef LIBC_FIBRIL_H_ |
35 | #ifndef LIBC_FIBRIL_H_ |
36 | #define LIBC_FIBRIL_H_ |
36 | #define LIBC_FIBRIL_H_ |
37 | 37 | ||
38 | #include <libarch/fibril.h> |
38 | #include <libarch/fibril.h> |
39 | #include <libadt/list.h> |
39 | #include <adt/list.h> |
40 | #include <libarch/tls.h> |
40 | #include <libarch/tls.h> |
41 | 41 | ||
42 | #ifndef context_set |
42 | #ifndef context_set |
43 | #define context_set(c, _pc, stack, size, ptls) \ |
43 | #define context_set(c, _pc, stack, size, ptls) \ |
44 | (c)->pc = (sysarg_t) (_pc); \ |
44 | (c)->pc = (sysarg_t) (_pc); \ |
45 | (c)->sp = ((sysarg_t) (stack)) + (size) - SP_DELTA; \ |
45 | (c)->sp = ((sysarg_t) (stack)) + (size) - SP_DELTA; \ |
46 | (c)->tls = (sysarg_t) (ptls); |
46 | (c)->tls = (sysarg_t) (ptls); |
47 | #endif /* context_set */ |
47 | #endif /* context_set */ |
48 | 48 | ||
49 | #define FIBRIL_SERIALIZED 1 |
49 | #define FIBRIL_SERIALIZED 1 |
- | 50 | #define FIBRIL_WRITER 2 |
|
50 | 51 | ||
51 | typedef enum { |
52 | typedef enum { |
52 | FIBRIL_PREEMPT, |
53 | FIBRIL_PREEMPT, |
53 | FIBRIL_TO_MANAGER, |
54 | FIBRIL_TO_MANAGER, |
54 | FIBRIL_FROM_MANAGER, |
55 | FIBRIL_FROM_MANAGER, |
Line 69... | Line 70... | ||
69 | int retval; |
70 | int retval; |
70 | int flags; |
71 | int flags; |
71 | }; |
72 | }; |
72 | typedef struct fibril fibril_t; |
73 | typedef struct fibril fibril_t; |
73 | 74 | ||
- | 75 | /** Fibril-local variable specifier */ |
|
- | 76 | #define fibril_local __thread |
|
- | 77 | ||
74 | extern int context_save(context_t *c); |
78 | extern int context_save(context_t *c) __attribute__ ((returns_twice)); |
75 | extern void context_restore(context_t *c) __attribute__ ((noreturn)); |
79 | extern void context_restore(context_t *c) __attribute__ ((noreturn)); |
76 | 80 | ||
77 | extern fid_t fibril_create(int (*func)(void *), void *arg); |
81 | extern fid_t fibril_create(int (*func)(void *), void *arg); |
78 | extern fibril_t *fibril_setup(void); |
82 | extern fibril_t *fibril_setup(void); |
79 | extern void fibril_teardown(fibril_t *f); |
83 | extern void fibril_teardown(fibril_t *f); |