child.c
00001 #include "klone_conf.h"
00002 #include <u/libu.h>
00003 #include "child.h"
00004
00005 TAILQ_HEAD(child_list_s, child_s);
00006 typedef struct child_list_s child_list_t;
00007
00008 struct children_s
00009 {
00010 child_list_t clist;
00011 size_t nchild;
00012 };
00013
00014 int children_add(children_t *cs, child_t *child)
00015 {
00016 dbg_return_if (cs == NULL, ~0);
00017 dbg_return_if (child == NULL, ~0);
00018
00019 TAILQ_INSERT_TAIL(&cs->clist, child, np);
00020 cs->nchild++;
00021
00022 return 0;
00023 }
00024
00025 int children_del(children_t *cs, child_t *child)
00026 {
00027 dbg_return_if (cs == NULL, ~0);
00028 dbg_return_if (child == NULL, ~0);
00029
00030 TAILQ_REMOVE(&cs->clist, child, np);
00031 cs->nchild--;
00032
00033 return 0;
00034 }
00035
00036 size_t children_count(children_t *cs)
00037 {
00038 dbg_return_if (cs == NULL, 0);
00039
00040 return cs->nchild;
00041 }
00042
00043 int children_clear(children_t *cs)
00044 {
00045 child_t *c;
00046
00047 dbg_err_if (cs == NULL);
00048
00049
00050 while((c = TAILQ_FIRST(&cs->clist)) != NULL)
00051 {
00052 if(!children_del(cs, c))
00053 child_free(c);
00054 }
00055
00056 return 0;
00057 err:
00058 return 0;
00059 }
00060
00061 int children_getn(children_t *cs, size_t i, child_t **pc)
00062 {
00063 child_t *c;
00064
00065 dbg_err_if (cs == NULL);
00066 dbg_err_if (pc == NULL);
00067 dbg_err_if (i >= cs->nchild);
00068
00069 TAILQ_FOREACH(c, &cs->clist, np)
00070 {
00071 if(i-- == 0)
00072 {
00073 *pc = c;
00074 return 0;
00075 }
00076 }
00077
00078 err:
00079 return ~0;
00080 }
00081
00082 int children_get_by_pid(children_t *cs, pid_t pid, child_t **pc)
00083 {
00084 child_t *c;
00085
00086 dbg_goto_if (cs == NULL, notfound);
00087 dbg_goto_if (pc == NULL, notfound);
00088
00089 TAILQ_FOREACH(c, &cs->clist, np)
00090 {
00091 if(c->pid == pid)
00092 {
00093 *pc = c;
00094 return 0;
00095 }
00096 }
00097
00098 notfound:
00099 return ~0;
00100 }
00101
00102 int children_free(children_t *cs)
00103 {
00104 if(cs)
00105 {
00106
00107 dbg_if(children_clear(cs));
00108 U_FREE(cs);
00109 }
00110
00111 return 0;
00112 }
00113
00114 int children_create(children_t **pcs)
00115 {
00116 children_t *cs;
00117
00118 dbg_err_if (pcs == NULL);
00119
00120 cs = u_zalloc(sizeof(children_t));
00121 dbg_err_if(cs == NULL);
00122
00123 TAILQ_INIT(&cs->clist);
00124
00125 *pcs = cs;
00126
00127 return 0;
00128 err:
00129 return ~0;
00130 }
00131
00132 int child_create(pid_t pid, backend_t *be, child_t **pchild)
00133 {
00134 child_t *c;
00135
00136 dbg_err_if (pchild == NULL);
00137
00138 c = u_zalloc(sizeof(child_t));
00139 dbg_err_if(c == NULL);
00140
00141 c->pid = pid;
00142 c->be = be;
00143 c->birth = time(0);
00144
00145 *pchild = c;
00146
00147 return 0;
00148 err:
00149 return ~0;
00150 }
00151
00152 int child_free(child_t *child)
00153 {
00154 U_FREE(child);
00155 return 0;
00156 }
00157