[libvirt] [PATCH 04/10] Add a 'nop' lock driver implementation.
Daniel Veillard
veillard at redhat.com
Fri May 27 08:43:11 UTC 2011
On Thu, May 19, 2011 at 07:24:19AM -0400, Daniel P. Berrange wrote:
> To allow hypervisor drivers to assume that a lock driver impl
> will be guaranteed to exist, provide a 'nop' impl that is
> compiled into the library
Also has to good property of being usable as a template for new
ones...
> * src/Makefile.am: Add nop driver
> * src/locking/lock_driver_nop.c, src/locking/lock_driver_nop.h:
> Nop lock driver implementation
> * src/locking/lock_manager.c: Enable direct access of 'nop'
> driver, instead of dlopen()ing it.
> ---
> src/Makefile.am | 4 +-
> src/locking/lock_driver_nop.c | 115 +++++++++++++++++++++++++++++++++++++++++
> src/locking/lock_driver_nop.h | 30 +++++++++++
> src/locking/lock_manager.c | 53 ++++++++++---------
> 4 files changed, 177 insertions(+), 25 deletions(-)
> create mode 100644 src/locking/lock_driver_nop.c
> create mode 100644 src/locking/lock_driver_nop.h
>
> diff --git a/src/Makefile.am b/src/Makefile.am
> index a27838b..96e2edf 100644
> --- a/src/Makefile.am
> +++ b/src/Makefile.am
> @@ -94,7 +94,9 @@ DRIVER_SOURCES = \
> fdstream.c fdstream.h \
> $(NODE_INFO_SOURCES) \
> libvirt.c libvirt_internal.h \
> - locking/lock_manager.c locking/lock_manager.h
> + locking/lock_manager.c locking/lock_manager.h \
> + locking/lock_driver.h \
> + locking/lock_driver_nop.h locking/lock_driver_nop.c
>
>
> # XML configuration format handling sources
> diff --git a/src/locking/lock_driver_nop.c b/src/locking/lock_driver_nop.c
> new file mode 100644
> index 0000000..5ebbd8d
> --- /dev/null
> +++ b/src/locking/lock_driver_nop.c
> @@ -0,0 +1,115 @@
> +/*
> + * lock_driver_nop.c: A lock driver which locks nothing
> + *
> + * Copyright (C) 2010-2011 Red Hat, Inc.
> + *
> + * This library is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU Lesser General Public
> + * License as published by the Free Software Foundation; either
> + * version 2.1 of the License, or (at your option) any later version.
> + *
> + * This library is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> + * Lesser General Public License for more details.
> + *
> + * You should have received a copy of the GNU Lesser General Public
> + * License along with this library; if not, write to the Free Software
> + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
> + *
* Author: Daniel P. Berrange <berrange at redhat.com>
> + */
> +
> +#include <config.h>
> +
> +#include "lock_driver_nop.h"
> +#include "memory.h"
> +#include "logging.h"
> +#include "uuid.h"
> +
> +
> +static int virLockManagerNopInit(unsigned int version,
> + unsigned int flags)
> +{
> + VIR_DEBUG("version=%u flags=%u", version, flags);
> +
> + return 0;
> +}
> +
> +static int virLockManagerNopDeinit(void)
> +{
> + VIR_DEBUG(" ");
> +
> + return 0;
> +}
> +
> +
> +static int virLockManagerNopNew(virLockManagerPtr lock ATTRIBUTE_UNUSED,
> + unsigned int type ATTRIBUTE_UNUSED,
> + size_t nparams ATTRIBUTE_UNUSED,
> + virLockManagerParamPtr params ATTRIBUTE_UNUSED,
> + unsigned int flags ATTRIBUTE_UNUSED)
> +{
> + return 0;
> +}
> +
> +static int virLockManagerNopAddResource(virLockManagerPtr lock ATTRIBUTE_UNUSED,
> + unsigned int type ATTRIBUTE_UNUSED,
> + const char *name ATTRIBUTE_UNUSED,
> + size_t nparams ATTRIBUTE_UNUSED,
> + virLockManagerParamPtr params ATTRIBUTE_UNUSED,
> + unsigned int flags ATTRIBUTE_UNUSED)
> +{
> +
> + return 0;
> +}
> +
> +
> +static int virLockManagerNopAcquire(virLockManagerPtr lock ATTRIBUTE_UNUSED,
> + const char *state ATTRIBUTE_UNUSED,
> + unsigned int flags ATTRIBUTE_UNUSED)
> +{
> +
> + return 0;
> +}
> +
> +static int virLockManagerNopRelease(virLockManagerPtr lock ATTRIBUTE_UNUSED,
> + char **state,
> + unsigned int flags ATTRIBUTE_UNUSED)
> +{
> + *state = NULL;
> +
> + return 0;
> +}
> +
> +static int virLockManagerNopInquire(virLockManagerPtr lock ATTRIBUTE_UNUSED,
> + char **state,
> + unsigned int flags ATTRIBUTE_UNUSED)
> +{
> +
> + *state = NULL;
> +
> + return 0;
> +}
> +
> +static void virLockManagerNopFree(virLockManagerPtr lock ATTRIBUTE_UNUSED)
> +{
> +}
> +
> +virLockDriver virLockDriverNop =
> +{
> + .version = VIR_LOCK_MANAGER_VERSION,
> + .flags = 0,
> +
> + .drvInit = virLockManagerNopInit,
> + .drvDeinit = virLockManagerNopDeinit,
> +
> + .drvNew = virLockManagerNopNew,
> + .drvFree = virLockManagerNopFree,
> +
> + .drvAddResource = virLockManagerNopAddResource,
> +
> + .drvAcquire = virLockManagerNopAcquire,
> + .drvRelease = virLockManagerNopRelease,
> +
> + .drvInquire = virLockManagerNopInquire,
> +};
> diff --git a/src/locking/lock_driver_nop.h b/src/locking/lock_driver_nop.h
> new file mode 100644
> index 0000000..4be5377
> --- /dev/null
> +++ b/src/locking/lock_driver_nop.h
> @@ -0,0 +1,30 @@
> +/*
> + * lock_driver_nop.h: A lock driver which locks nothing
> + *
> + * Copyright (C) 2010-2011 Red Hat, Inc.
> + *
> + * This library is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU Lesser General Public
> + * License as published by the Free Software Foundation; either
> + * version 2.1 of the License, or (at your option) any later version.
> + *
> + * This library is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> + * Lesser General Public License for more details.
> + *
> + * You should have received a copy of the GNU Lesser General Public
> + * License along with this library; if not, write to the Free Software
> + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
> + *
> + */
> +
> +#ifndef __VIR_LOCK_DRIVER_NOP_H__
> +# define __VIR_LOCK_DRIVER_NOP_H__
> +
> +# include "lock_driver.h"
> +
> +extern virLockDriver virLockDriverNop;
> +
> +
> +#endif /* __VIR_LOCK_DRIVER_NOP_H__ */
> diff --git a/src/locking/lock_manager.c b/src/locking/lock_manager.c
> index cb96091..6197fd4 100644
> --- a/src/locking/lock_manager.c
> +++ b/src/locking/lock_manager.c
> @@ -22,6 +22,7 @@
> #include <config.h>
>
> #include "lock_manager.h"
> +#include "lock_driver_nop.h"
> #include "virterror_internal.h"
> #include "logging.h"
> #include "util.h"
> @@ -123,35 +124,39 @@ virLockManagerPluginPtr virLockManagerPluginNew(const char *name,
> const char *moddir = getenv("LIBVIRT_LOCK_MANAGER_PLUGIN_DIR");
> char *modfile = NULL;
>
> - if (moddir == NULL)
> - moddir = DEFAULT_LOCK_MANAGER_PLUGIN_DIR;
> + if (STREQ(name, "nop")) {
> + driver = &virLockDriverNop;
> + } else {
> + if (moddir == NULL)
> + moddir = DEFAULT_LOCK_MANAGER_PLUGIN_DIR;
>
> - VIR_DEBUG("Module load %s from %s", name, moddir);
> + VIR_DEBUG("Module load %s from %s", name, moddir);
>
> - if (virAsprintf(&modfile, "%s/%s.so", moddir, name) < 0) {
> - virReportOOMError();
> - return NULL;
> - }
> + if (virAsprintf(&modfile, "%s/%s.so", moddir, name) < 0) {
> + virReportOOMError();
> + return NULL;
> + }
>
> - if (access(modfile, R_OK) < 0) {
> - virReportSystemError(errno,
> - _("Plugin %s not accessible"),
> - modfile);
> - goto cleanup;
> - }
> + if (access(modfile, R_OK) < 0) {
> + virReportSystemError(errno,
> + _("Plugin %s not accessible"),
> + modfile);
> + goto cleanup;
> + }
>
> - handle = dlopen(modfile, RTLD_NOW | RTLD_LOCAL);
> - if (!handle) {
> - virLockError(VIR_ERR_SYSTEM_ERROR,
> - _("Failed to load plugin %s: %s"),
> - modfile, dlerror());
> - goto cleanup;
> - }
> + handle = dlopen(modfile, RTLD_NOW | RTLD_LOCAL);
> + if (!handle) {
> + virLockError(VIR_ERR_SYSTEM_ERROR,
> + _("Failed to load plugin %s: %s"),
> + modfile, dlerror());
> + goto cleanup;
> + }
>
> - if (!(driver = dlsym(handle, "virLockDriverImpl"))) {
> - virLockError(VIR_ERR_INTERNAL_ERROR, "%s",
> - _("Missing plugin initialization symbol 'virLockDriverImpl'"));
> - goto cleanup;
> + if (!(driver = dlsym(handle, "virLockDriverImpl"))) {
> + virLockError(VIR_ERR_INTERNAL_ERROR, "%s",
> + _("Missing plugin initialization symbol 'virLockDriverImpl'"));
> + goto cleanup;
> + }
> }
>
> if (driver->drvInit(VIR_LOCK_MANAGER_VERSION, flags) < 0) {
ACK,
Daniel
--
Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/
daniel at veillard.com | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library http://libvirt.org/
More information about the libvir-list
mailing list