diff options
Diffstat (limited to 'src/common.c')
| -rw-r--r-- | src/common.c | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/src/common.c b/src/common.c new file mode 100644 index 0000000..41bd145 --- /dev/null +++ b/src/common.c @@ -0,0 +1,45 @@ +#include <gran/common.h> + +stat place_reg(struct reg *r, struct packet pkt) +{ + if (r->busy) + return EBUSY; + + r->pkt = pkt; + r->busy = true; + return OK; +} + +stat copy_reg(struct reg *r, struct reg *s) +{ + assert(s->busy); + if (r->busy) + return EBUSY; + + r->pkt = s->pkt; + r->busy = true; + s->busy = false; + return OK; +} + +void propagate(struct reg *out, + size_t count, struct reg *in[static count], + bool (*sel)(struct reg *r, void *data), void *data) +{ + struct reg *r = NULL; + for (size_t i = 0; i < count; ++i) { + if (!in[i] || !in[i]->busy) + continue; + + if (!sel(in[i], data)) + continue; + + if (!r || r->pkt.timestamp > in[i]->pkt.timestamp) + r = in[i]; + } + + if (!r) + return; + + copy_reg(out, r); +} |
