Subversion Repositories HelenOS

Rev

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);