#include <lib-sys/evtloop.h>
#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);
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 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 = {
/****************************************************************************/
mx_t const pop_mx_ng = {
- M_POP,
- 0,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
+ .type = M_POP,
};