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     /* free all variables */
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); /* out of bounds */
00068 
00069     TAILQ_FOREACH(c, &cs->clist, np)
00070     {
00071         if(i-- == 0)
00072         {
00073             *pc = c;
00074             return 0; /* found */
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; /* found */
00095         }
00096     }
00097 
00098 notfound:
00099     return ~0; /* not found */
00100 }
00101 
00102 int children_free(children_t *cs)
00103 {
00104     if(cs)
00105     {
00106         /* del and free all child_t objects */
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 

←Products
Copyright © 2005-2012 - KoanLogic S.r.l. - All rights reserved