|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 09/15] libxl: datacopier: provide "prefix data" facilit
Ian Campbell writes ("Re: [Xen-devel] [PATCH 09/15] libxl: datacopier: provide
"prefix data" facilit"):
> In the subject: "facility"
Oops, fixed.
> On Wed, 2012-05-30 at 17:16 +0100, Ian Jackson wrote:
> > @@ -1812,6 +1812,12 @@ _hidden void
> > libxl__datacopier_init(libxl__datacopier_state *dc);
> > _hidden void libxl__datacopier_kill(libxl__datacopier_state *dc);
> > _hidden int libxl__datacopier_start(libxl__datacopier_state *dc);
> >
> > +/* Inserts literal data into the output stream.
> > + * May safely be used only immediately after libxl__datacopier_start.
>
> After datacopier_start the fds are registered, is there not a race
> between those events firing (perhaps in another thread which has called
> into libxl) and this thread?
No, because we have the ctx mutex held all of the time.
And there isn't a reentrancy hazard either. As the comments in
libxl_internal.h have it:
* int libxl__ev_KIND_register(libxl__gc *gc, libxl__ev_KIND *GEN,
* libxl__ev_KIND_callback *FUNC,
* DETAILS);
* [...]. FUNC will
* not be called from within the call to _register. [...]
I think given your question this warrants a comment:
@@ -78,6 +78,13 @@ void libxl__datacopier_prefixdata(libxl__egc *egc,
libxl__datacopier_state *dc,
const void *data, size_t len)
{
libxl__datacopier_buf *buf;
+ /*
+ * It is safe for this to be called immediately after _start, as
+ * is documented in the public comment. _start's caller must have
+ * the mutex locked, so other threads don't get to mess with the
+ * contents, and the fd events cannot happen reentrantly. So we
+ * are guaranteed to beat the first data from the read fd.
+ */
> Is the safe place not between datacopier_init and the rest of
> datacopier_start?
No, because _start calls _init (just like all the
libxl__*_make_events_happen functions do).
Ian.
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |