[PATCH v2] lib: Use struct portevent internally

  • From: Dimitri Staessens <dimitri@ouroboros.rocks>
  • To: ouroboros@xxxxxxxxxxxxx
  • Date: Tue, 29 Mar 2022 20:43:20 +0200

The fqueues were relying on the fact that the portevent were two
integers. This cleans that up a bit.

Signed-off-by: Dimitri Staessens <dimitri@ouroboros.rocks>
---
 include/ouroboros/shm_flow_set.h |  7 ++++++-
 src/lib/dev.c                    | 27 +++++++++++++++------------
 src/lib/shm_flow_set.c           | 21 +++++++++++----------
 3 files changed, 32 insertions(+), 23 deletions(-)

diff --git a/include/ouroboros/shm_flow_set.h b/include/ouroboros/shm_flow_set.h
index ba085aef..62bf24e9 100644
--- a/include/ouroboros/shm_flow_set.h
+++ b/include/ouroboros/shm_flow_set.h
@@ -27,6 +27,11 @@
 
 #include <sys/time.h>
 
+struct portevent {
+        int flow_id;
+        int event;
+};
+
 struct shm_flow_set;
 
 struct shm_flow_set * shm_flow_set_create(pid_t pid);
@@ -58,7 +63,7 @@ void                  shm_flow_set_notify(struct shm_flow_set 
* set,
 
 ssize_t               shm_flow_set_wait(const struct shm_flow_set * shm_set,
                                         size_t                      idx,
-                                        int *                       fqueue,
+                                        struct portevent *          fqueue,
                                         const struct timespec *     abstime);
 
 #endif /* OUROBOROS_SHM_FLOW_SET_H */
diff --git a/src/lib/dev.c b/src/lib/dev.c
index 7ee0a84f..b935ef86 100644
--- a/src/lib/dev.c
+++ b/src/lib/dev.c
@@ -122,9 +122,9 @@ struct flow_set {
 };
 
 struct fqueue {
-        int    fqueue[2 * SHM_BUFFER_SIZE]; /* Safe copy from shm. */
-        size_t fqsize;
-        size_t next;
+        struct portevent fqueue[SHM_BUFFER_SIZE]; /* Safe copy from shm. */
+        size_t           fqsize;
+        size_t           next;
 };
 
 struct {
@@ -1507,7 +1507,7 @@ struct fqueue * fqueue_create()
         if (fq == NULL)
                 return NULL;
 
-        memset(fq->fqueue, -1, (SHM_BUFFER_SIZE) * sizeof(*fq->fqueue));
+        memset(fq->fqueue, -1, SHM_BUFFER_SIZE * sizeof(*fq->fqueue));
         fq->fqsize = 0;
         fq->next   = 0;
 
@@ -1616,12 +1616,12 @@ static int fqueue_filter(struct fqueue * fq)
         struct frcti *       frcti;
 
         while (fq->next < fq->fqsize) {
-                if (fq->fqueue[fq->next + 1] != FLOW_PKT)
+                if (fq->fqueue[fq->next].event != FLOW_PKT)
                         return 1;
 
                 pthread_rwlock_rdlock(&ai.lock);
 
-                fd = ai.ports[fq->fqueue[fq->next]].fd;
+                fd = ai.ports[fq->fqueue[fq->next].flow_id].fd;
                 frcti = ai.flows[fd].frcti;
                 if (frcti == NULL) {
                         pthread_rwlock_unlock(&ai.lock);
@@ -1652,7 +1652,7 @@ static int fqueue_filter(struct fqueue * fq)
 
                 pthread_rwlock_unlock(&ai.lock);
 
-                fq->next += 2;
+                ++fq->next;
         }
 
         return fq->next < fq->fqsize;
@@ -1660,7 +1660,8 @@ static int fqueue_filter(struct fqueue * fq)
 
 int fqueue_next(struct fqueue * fq)
 {
-        int fd;
+        int                fd;
+        struct portevent * e;
 
         if (fq == NULL)
                 return -EINVAL;
@@ -1673,9 +1674,11 @@ int fqueue_next(struct fqueue * fq)
 
         pthread_rwlock_rdlock(&ai.lock);
 
-        fd = ai.ports[fq->fqueue[fq->next]].fd;
+        e = fq->fqueue + fq->next;
 
-        fq->next += 2;
+        fd = ai.ports[e->flow_id].fd;
+
+        ++fq->next;
 
         pthread_rwlock_unlock(&ai.lock);
 
@@ -1690,7 +1693,7 @@ enum fqtype fqueue_type(struct fqueue * fq)
         if (fq->fqsize == 0 || fq->next == 0)
                 return -EPERM;
 
-        return fq->fqueue[fq->next - 1];
+        return fq->fqueue[(fq->next - 1)].event;
 }
 
 ssize_t fevent(struct flow_set *       set,
@@ -1719,7 +1722,7 @@ ssize_t fevent(struct flow_set *       set,
                 if (ret == -ETIMEDOUT)
                         return -ETIMEDOUT;
 
-                fq->fqsize = ret << 1;
+                fq->fqsize = ret;
                 fq->next   = 0;
 
                 ret = fqueue_filter(fq);
diff --git a/src/lib/shm_flow_set.c b/src/lib/shm_flow_set.c
index d325a253..25e7e32b 100644
--- a/src/lib/shm_flow_set.c
+++ b/src/lib/shm_flow_set.c
@@ -63,11 +63,6 @@
 
 #define fqueue_ptr(fs, idx) (fs->fqueues + (SHM_BUFFER_SIZE) * idx)
 
-struct portevent {
-        int flow_id;
-        int event;
-};
-
 struct shm_flow_set {
         ssize_t *          mtable;
         size_t *           heads;
@@ -307,6 +302,8 @@ void shm_flow_set_notify(struct shm_flow_set * set,
                          int                   flow_id,
                          int                   event)
 {
+        struct portevent * e;
+
         assert(set);
         assert(!(flow_id < 0) && flow_id < SYS_MAX_FLOWS);
 
@@ -317,10 +314,14 @@ void shm_flow_set_notify(struct shm_flow_set * set,
                 return;
         }
 
-        (fqueue_ptr(set, set->mtable[flow_id]) +
-         (set->heads[set->mtable[flow_id]]))->flow_id = flow_id;
-        (fqueue_ptr(set, set->mtable[flow_id]) +
-         (set->heads[set->mtable[flow_id]])++)->event = event;
+
+        e = fqueue_ptr(set, set->mtable[flow_id]) +
+                set->heads[set->mtable[flow_id]];
+
+        e->flow_id = flow_id;
+        e->event = event;
+
+        ++set->heads[set->mtable[flow_id]];
 
         pthread_cond_signal(&set->conds[set->mtable[flow_id]]);
 
@@ -330,7 +331,7 @@ void shm_flow_set_notify(struct shm_flow_set * set,
 
 ssize_t shm_flow_set_wait(const struct shm_flow_set * set,
                           size_t                      idx,
-                          int *                       fqueue,
+                          struct portevent *          fqueue,
                           const struct timespec *     abstime)
 {
         ssize_t ret = 0;
-- 
2.35.1


Other related posts: