Refcounted type isn't enough, we must have a list of'em
authorPierre Habouzit <madcoder@debian.org>
Sun, 13 Jan 2008 14:08:23 +0000 (15:08 +0100)
committerPierre Habouzit <madcoder@debian.org>
Sun, 13 Jan 2008 14:08:23 +0000 (15:08 +0100)
Signed-off-by: Pierre Habouzit <madcoder@debian.org>
lib-mx/pop-new.c

index 3936cbb..a7e135d 100644 (file)
 
 #include <lib-sys/evtloop.h>
 #include "pop.h"
 
 #include <lib-sys/evtloop.h>
 #include "pop.h"
+#include "account.h"
 
 typedef struct pop_data_t {
     int refcnt;
     job_t *w;
 
 typedef struct pop_data_t {
     int refcnt;
     job_t *w;
+
+    ACCOUNT account;
 } pop_data_t;
 DO_INIT(pop_data_t, pop_data);
 DO_WIPE(pop_data_t, pop_data);
 } pop_data_t;
 DO_INIT(pop_data_t, pop_data);
 DO_WIPE(pop_data_t, pop_data);
-DO_REFCNT(pop_data_t, pop_data);
+static void pop_data_delete(pop_data_t **tp);
 DO_ARRAY_TYPE(pop_data_t, pop_data);
 DO_ARRAY_FUNCS(pop_data_t, pop_data, pop_data_delete);
 
 DO_ARRAY_TYPE(pop_data_t, pop_data);
 DO_ARRAY_FUNCS(pop_data_t, pop_data, pop_data_delete);
 
@@ -38,6 +41,33 @@ DO_ARRAY_FUNCS(pop_data_t, pop_data, pop_data_delete);
 
 static pop_data_array conns;
 
 
 static pop_data_array conns;
 
+static inline pop_data_t *pop_data_new(void) {
+    pop_data_t *res = pop_data_init(p_new(pop_data_t, 1));
+    res->refcnt = 1;
+    pop_data_array_append(&conns, res);
+    return res;
+}
+static inline pop_data_t *pop_data_dup(pop_data_t *t) {
+    t->refcnt++;
+    return t;
+}
+static void pop_data_delete(pop_data_t **tp) {
+    if (!*tp)
+        return;
+    if (--(*tp)->refcnt > 0) {
+        *tp = NULL;
+    } else {
+        for (int i = 0; i < conns.len; i++) {
+            if (conns.arr[i] == *tp) {
+                pop_data_array_take(&conns, i);
+                break;
+            }
+        }
+        pop_data_wipe(*tp);
+        p_delete(tp);
+    }
+}
+
 static __init void pop_initialize(void)
 {
     pop_data_array_init(&conns);
 static __init void pop_initialize(void)
 {
     pop_data_array_init(&conns);
@@ -53,11 +83,14 @@ static __fini void pop_shutdown(void)
 
 static int pop_setup(job_t *w, void *cfg)
 {
 
 static int pop_setup(job_t *w, void *cfg)
 {
+    w->ptr = cfg;
+    /* FIXME */ return el_job_release(w, EL_ERROR);
     return 0;
 }
 
 static void pop_finalize(job_t *w, el_status reason)
 {
     return 0;
 }
 
 static void pop_finalize(job_t *w, el_status reason)
 {
+    pop_data_delete((pop_data_t **)(void *)&w->ptr);
 }
 
 static machine_t const pop_machine = {
 }
 
 static machine_t const pop_machine = {
@@ -71,17 +104,5 @@ static machine_t const pop_machine = {
 /****************************************************************************/
 
 mx_t const pop_mx_ng = {
 /****************************************************************************/
 
 mx_t const pop_mx_ng = {
-    M_POP,
-    0,
-    NULL,
-    NULL,
-    NULL,
-    NULL,
-    NULL,
-    NULL,
-    NULL,
-    NULL,
-    NULL,
-    NULL,
-    NULL,
+    .type = M_POP,
 };
 };