aboutsummaryrefslogtreecommitdiff
path: root/src/common.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/common.c')
-rw-r--r--src/common.c45
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);
+}