[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 3/9] libxl_internal: Split out userdata lock function
Anthony PERARD writes ("[PATCH 3/9] libxl_internal: Split out userdata lock function"): > We are going to create a new lock and want to reuse the same machinery. > Also, hide the detail of struct libxl__domain_userdata_lock as this is > only useful as a pointer by the rest of libxl. > > No functional changes. > > Signed-off-by: Anthony PERARD <anthony.perard@xxxxxxxxxx> > --- > tools/libxl/libxl_internal.c | 50 +++++++++++++++++++++++++++++------- > tools/libxl/libxl_internal.h | 5 +--- > 2 files changed, 42 insertions(+), 13 deletions(-) > > diff --git a/tools/libxl/libxl_internal.c b/tools/libxl/libxl_internal.c > index f492dae5ff..fa0bbc3960 100644 > --- a/tools/libxl/libxl_internal.c > +++ b/tools/libxl/libxl_internal.c > @@ -397,21 +397,26 @@ int libxl__device_model_version_running(libxl__gc *gc, > uint32_t domid) > return value; > } > > +typedef struct { > + libxl__carefd *carefd; > + char *path; /* path of the lock file itself */ > +} libxl__generic_lock; > +static void libxl__unlock_generic(libxl__generic_lock * const lock); ^ Spurious space. (Many later occurrences, too.) > +static int libxl__lock_generic(libxl__gc *gc, libxl_domid domid, > + libxl__generic_lock * const lock, > + const char *lock_name) > { ... > - if (lock) libxl__unlock_domain_userdata(lock); > - return NULL; > + if (lock) libxl__unlock_generic(lock); I think the interface to libxl__lock_generic implies !!lock, so there is no need to test it here. I find the legal states of a libxl__generic_lock a bit confusing. It's only an internal struct here, but I think we need either more forgiving rules, or explicit commentary. As it is, the implementation of libxl__lock_generic assumes that on entry lock->carefd and lock->path are both NULL, and there is no function to create such a situation. We're relying on the callers' memsets. > -void libxl__unlock_domain_userdata(libxl__domain_userdata_lock *lock) > +static void libxl__unlock_generic(libxl__generic_lock * const lock) > { > /* It's important to unlink the file before closing fd to avoid > * the following race (if close before unlink): > @@ -490,6 +495,33 @@ void > libxl__unlock_domain_userdata(libxl__domain_userdata_lock *lock) > if (lock->path) unlink(lock->path); > if (lock->carefd) libxl__carefd_close(lock->carefd); And this leaves lock->path and lock->carefd containing invalid values. Hazardous! How about using formal state annotations ? (I think, having looked at the one call site, that with the current callers all follow the unwritten rules.) Ian. _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |