From a833478d0bab31dd0016520da5049bdf45b29736 Mon Sep 17 00:00:00 2001 From: Pierre Habouzit Date: Sun, 13 Jan 2008 15:08:23 +0100 Subject: [PATCH 1/1] Refcounted type isn't enough, we must have a list of'em Signed-off-by: Pierre Habouzit --- lib-mx/pop-new.c | 49 ++++++++++++++++++++++++++++++++++-------------- 1 file changed, 35 insertions(+), 14 deletions(-) diff --git a/lib-mx/pop-new.c b/lib-mx/pop-new.c index 3936cbb..a7e135d 100644 --- a/lib-mx/pop-new.c +++ b/lib-mx/pop-new.c @@ -21,14 +21,17 @@ #include #include "pop.h" +#include "account.h" 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); -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); @@ -38,6 +41,33 @@ DO_ARRAY_FUNCS(pop_data_t, pop_data, pop_data_delete); 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); @@ -53,11 +83,14 @@ static __fini void pop_shutdown(void) 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) { + pop_data_delete((pop_data_t **)(void *)&w->ptr); } static machine_t const pop_machine = { @@ -71,17 +104,5 @@ static machine_t const pop_machine = { /****************************************************************************/ mx_t const pop_mx_ng = { - M_POP, - 0, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, + .type = M_POP, }; -- 2.20.1