librfn
An ad-hoc utility library
fibre.h
Go to the documentation of this file.
1 /*
2  * fibre.h
3  *
4  * Part of librfn (a general utility library from redfelineninja.org.uk)
5  *
6  * Copyright (C) 2013-2014 Daniel Thompson <daniel@redfelineninja.org.uk>
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU Lesser General Public License as published
10  * by the Free Software Foundation; either version 3 of the License, or
11  * (at your option) any later version.
12  */
13 
14 #ifndef RF_FIBRE_H_
15 #define RF_FIBRE_H_
16 
17 #include <stdint.h>
18 
19 #include "list.h"
20 #include "messageq.h"
21 #include "protothreads.h"
22 
34 typedef enum {
39 
41 
45 
56 #define FIBRE_UNBOUNDED_SLEEP ((uint32_t) 0x7fffffff)
57 
58 struct fibre;
59 typedef int fibre_entrypoint_t(struct fibre *);
60 
64 typedef struct fibre {
66  uint16_t state;
67  uint16_t priv;
68  uint32_t duetime;
70 } fibre_t;
71 
75 #define FIBRE_VAR_INIT(fn) { (fn), 0, 0, 0, LIST_NODE_VAR_INIT }
76 
86 typedef struct fibre_eventq {
90 
94 #define FIBRE_EVENTQ_VAR_INIT(fn, basep, base_len, msg_len) \
95  { \
96  .fibre = FIBRE_VAR_INIT(fn), \
97  .eventq = MESSAGEQ_VAR_INIT(basep, base_len, msg_len) \
98  }
99 
103 #define PT_BEGIN_FIBRE(f) PT_BEGIN(&((f)->priv))
104 
108 fibre_t *fibre_self(void);
109 
138 uint32_t fibre_scheduler_next(uint32_t time);
139 
144 
154 void fibre_run(fibre_t *f);
155 
163 bool fibre_run_atomic(fibre_t *f);
164 
168 bool fibre_kill(fibre_t *f);
169 
177 bool fibre_timeout(uint32_t duetime);
178 
183  void *basep, size_t base_len, size_t msg_len);
184 
192 
198 bool fibre_eventq_send(fibre_eventq_t *evtq, void *evtp);
199 
204 
214 
218 void fibre_eventq_release(fibre_eventq_t *evtq, void *evtp);
219 
233 void fibre_scheduler_main_loop(void);
234 
237 #endif // RF_FIBRE_H_
uint32_t duetime
Definition: fibre.h:68
struct fibre_eventq fibre_eventq_t
Fibre and eventq descriptor.
fibre_state_t
Definition: fibre.h:34
void fibre_init(fibre_t *f, fibre_entrypoint_t *fn)
Dynamic initializer for a fibre descriptor.
Definition: fibre.c:164
fibre_t fibre
Definition: fibre.h:87
void * fibre_eventq_claim(fibre_eventq_t *evtq)
Request memory resources to send an event to a fibre.
Definition: fibre.c:226
fibre_entrypoint_t * fn
Definition: fibre.h:65
uint32_t fibre_scheduler_next(uint32_t time)
Schedule the next fibre.
Definition: fibre.c:134
uint16_t state
Definition: fibre.h:66
void fibre_scheduler_main_loop(void)
Definition: fibre_default.c:17
bool fibre_eventq_empty(fibre_eventq_t *evtq)
Return true if the fibre's event queue is empty.
Definition: fibre.c:240
void fibre_eventq_init(fibre_eventq_t *evtq, fibre_entrypoint_t *fn, void *basep, size_t base_len, size_t msg_len)
Dynamic initializer for a fibre and eventq descriptor.
Definition: fibre.c:219
bool fibre_kill(fibre_t *f)
Definition: fibre.c:196
struct fibre fibre_t
Fibre descriptor.
bool fibre_eventq_send(fibre_eventq_t *evtq, void *evtp)
Send an event to a fibre.
Definition: fibre.c:234
int fibre_entrypoint_t(struct fibre *)
Definition: fibre.h:59
list_node_t link
Definition: fibre.h:69
void fibre_eventq_release(fibre_eventq_t *evtq, void *evtp)
Release a message previously received by a fibre.
Definition: fibre.c:250
void * fibre_eventq_receive(fibre_eventq_t *evtq)
Recevied a message previously send to the fibre.
Definition: fibre.c:245
bool fibre_run_atomic(fibre_t *f)
Definition: fibre.c:183
Definition: list.h:34
messageq_t eventq
Definition: fibre.h:88
Fibre and eventq descriptor.
Definition: fibre.h:86
fibre_t * fibre_self(void)
Returns the currently active fibre descriptor.
Definition: fibre.c:129
uint16_t priv
Definition: fibre.h:67
Fibre descriptor.
Definition: fibre.h:64
void fibre_run(fibre_t *f)
Definition: fibre.c:173
bool fibre_timeout(uint32_t duetime)
Definition: fibre.c:208