[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] xl: track child processes for the benefit of libxl
Ian Campbell writes ("Re: [PATCH] xl: track child processes for the benefit of libxl"): > On Wed, 2012-05-16 at 21:40 +0100, Ian Jackson wrote: > > +#define CHILD_FORGET(other) \ > > + other.pid = 0; > > +CHILD_LIST(CHILD_FORGET) > > This clears every xlchild in the CHILD_LIST? Why? Oh, because this is > now the child and so those aren't our children any more. A comment would > be nice here, took me a little while to figure out. Right. > Is there some reason to not indent CHILD_LIST? (You've done it more than > once, so I guess so) I thought it bracketed the "contents" of the iteration helpfully, but I'm not wedded to the layout. > > +/* our child processes */ > > +#define CHILD_LIST(_) \ > > + _(child_console) \ > > + _(child_waitdaemon) \ > > + _(migration_child) > > Is using "_" like this valid? (i.e. not reserved by C or POSIX or > something) It's OK. "_" is also used by gettext but in this context its scope is limited so that it won't leak. > > +#define CHILD_DEFINE(ch) \ > > +xlchild ch; > > +CHILD_LIST(CHILD_DEFINE); > > + > > +xlchild child_console; > > +xlchild child_waitdaemon; > > Aren't these redundant with the definition from the preceding > CHILD_LIST? Yes. > This CHILD_LIST thing is clever but it isn't half opaque for the reader. Oh. I thought it was a standard and well-known technique ... > I'd say we'd be better off open coding them. Either we say: > There are only 3 of them, we can put the functions which deal with them > near each other and have a comment saying "update all these". There are four uses of CHILD_LIST so this wouldn't be infeasible. If you think this macro-based approach is opaque then we should do something different. It would be possible to use an array, and an enum, or some #defines. Or a union. Which would you prefer: union xlchildren { struct { xlchild console, waitdaemon, migration; }; xlchild bynum[1]; /* this depends on the architecture ABI spec */ }; extern union xlchildren children; #define NUM_CHILDREN (sizeof(children) / sizeof(xlchild)) xl_waitpid(&children.console, ....); Or: enum { child_console, child_waitdaemon, child_migration, child_max }; extern xlchild children[child_max]; xl_waitpid(&children[child_console]); Or: typedef enum { child_console, child_waitdaemon, child_migration, child_max } xlchildnum; extern xlchild children[child_max]; pid_t xl_waitpid(enum xlchildnum, ....); xl_waitpid(child_console, ....); Or: enum { child_console, child_waitdaemon, child_migration, child_max }; extern xlchild children[child_max]; #define CHILD(x) (&children[child_##x]) xl_waitpid(CHILD(console), ....); Or: #define child_console (children[0]) #define child_waitdaemon (children[1]) #define migration_child (children[2]) #define NUM_CHILDREN 3 extern xlchild children[NUM_CHILDREN]; xl_waitpid(&child_console, ....); Pick one; they all seem plausible to me. My favourite is probably the one where we pass the array index to xl_fork and xl_waitpid. > or we can add a proper list (LIBXL_LIST based?) which we add them to and > manage explicitly from xlfork and reap/xlwaitpid. Urgh. This is definitely overkill. > > - *pid = fork(); > > - if (*pid < 0) { > > + console_child_report(); > > + > > + pid_t pid = xl_fork(&child_console); > > console_child_report doesn't seem to reset child_config.pid and xlfork > has an assert(!foo.pid) in it, so how does this work on the second time? xl_waitpid does it. Perhaps this is worth a comment ? Ian. _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |