From b49890de8290c62ef0405f4951115a27abdf2356 Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Wed, 11 Jul 2012 14:35:42 +0100 Subject: [PATCH] Remove manual one-shot global initializers Remove the use of a manually run virLogStartup and virNodeSuspendInitialize methods. Instead make sure they are automatically run using VIR_ONCE_GLOBAL_INIT Signed-off-by: Daniel P. Berrange --- daemon/libvirtd.c | 1 - src/libvirt.c | 4 +-- src/libvirt_private.syms | 3 --- src/util/logging.c | 54 +++++++++++---------------------------- src/util/logging.h | 2 -- src/util/virnodesuspend.c | 25 +++++++++--------- src/util/virnodesuspend.h | 1 - 7 files changed, 29 insertions(+), 61 deletions(-) diff --git a/daemon/libvirtd.c b/daemon/libvirtd.c index ffbe067b18..ba0cc1f290 100644 --- a/daemon/libvirtd.c +++ b/daemon/libvirtd.c @@ -1349,7 +1349,6 @@ cleanup: VIR_FREE(run_dir); daemonConfigFree(config); - virLogShutdown(); return ret; } diff --git a/src/libvirt.c b/src/libvirt.c index 3704633102..3c4bf8ca0c 100644 --- a/src/libvirt.c +++ b/src/libvirt.c @@ -53,7 +53,6 @@ #include "conf.h" #include "rpc/virnettlscontext.h" #include "command.h" -#include "virnodesuspend.h" #include "virrandom.h" #include "viruri.h" @@ -410,8 +409,7 @@ virInitialize(void) if (virThreadInitialize() < 0 || virErrorInitialize() < 0 || - virRandomInitialize(time(NULL) ^ getpid()) || - virNodeSuspendInit() < 0) + virRandomInitialize(time(NULL) ^ getpid())) return -1; gcry_control(GCRYCTL_SET_THREAD_CBS, &virTLSThreadImpl); diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index bb8849b4d5..0b026b811e 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -762,8 +762,6 @@ virLogReset; virLogSetBufferSize; virLogSetDefaultPriority; virLogSetFromEnv; -virLogShutdown; -virLogStartup; virLogUnlock; @@ -1609,7 +1607,6 @@ virNetTLSSessionWrite; # virnodesuspend.h nodeSuspendForDuration; -virNodeSuspendInit; virNodeSuspendGetTargetMask; diff --git a/src/util/logging.c b/src/util/logging.c index 73e7eb6cd4..a7f6b653ae 100644 --- a/src/util/logging.c +++ b/src/util/logging.c @@ -147,25 +147,14 @@ static const char *virLogPriorityString(virLogPriority lvl) { return "unknown"; } -static int virLogInitialized = 0; -/** - * virLogStartup: - * - * Initialize the logging module - * - * Returns 0 if successful, and -1 in case or error - */ -int virLogStartup(void) { +static int virLogOnceInit(void) +{ const char *pbm = NULL; - if (virLogInitialized) - return -1; - if (virMutexInit(&virLogMutex) < 0) return -1; - virLogInitialized = 1; virLogLock(); if (VIR_ALLOC_N(virLogBuffer, virLogSize + 1) < 0) { /* @@ -191,6 +180,8 @@ int virLogStartup(void) { return 0; } +VIR_ONCE_GLOBAL_INIT(virLog) + /** * virLogSetBufferSize: * @size: size of the buffer in kilobytes or <= 0 to deactivate @@ -211,7 +202,10 @@ virLogSetBufferSize(int size) { if (size < 0) size = 0; - if ((virLogInitialized == 0) || (size * 1024 == virLogSize)) + if (virLogInitialize() < 0) + return -1; + + if (size * 1024 == virLogSize) return ret; virLogLock(); @@ -253,8 +247,8 @@ error: * Returns 0 if successful, and -1 in case or error */ int virLogReset(void) { - if (!virLogInitialized) - return virLogStartup(); + if (virLogInitialize() < 0) + return -1; virLogLock(); virLogResetFilters(); @@ -266,25 +260,6 @@ int virLogReset(void) { virLogUnlock(); return 0; } -/** - * virLogShutdown: - * - * Shutdown the logging module - */ -void virLogShutdown(void) { - if (!virLogInitialized) - return; - virLogLock(); - virLogResetFilters(); - virLogResetOutputs(); - virLogLen = 0; - virLogStart = 0; - virLogEnd = 0; - VIR_FREE(virLogBuffer); - virLogUnlock(); - virMutexDestroy(&virLogMutex); - virLogInitialized = 0; -} /* * Store a string in the ring buffer @@ -450,8 +425,9 @@ int virLogSetDefaultPriority(int priority) { VIR_WARN("Ignoring invalid log level setting."); return -1; } - if (!virLogInitialized) - virLogStartup(); + if (virLogInitialize() < 0) + return -1; + virLogDefaultPriority = priority; return 0; } @@ -723,8 +699,8 @@ void virLogVMessage(const char *category, int priority, const char *funcname, int emit = 1; unsigned int filterflags = 0; - if (!virLogInitialized) - virLogStartup(); + if (virLogInitialize() < 0) + return; if (fmt == NULL) goto cleanup; diff --git a/src/util/logging.h b/src/util/logging.h index d2bedcf85f..137bad2b56 100644 --- a/src/util/logging.h +++ b/src/util/logging.h @@ -135,9 +135,7 @@ extern int virLogDefineOutput(virLogOutputFunc f, virLogCloseFunc c, void *data, extern void virLogLock(void); extern void virLogUnlock(void); -extern int virLogStartup(void); extern int virLogReset(void); -extern void virLogShutdown(void); extern int virLogParseDefaultPriority(const char *priority); extern int virLogParseFilters(const char *filters); extern int virLogParseOutputs(const char *output); diff --git a/src/util/virnodesuspend.c b/src/util/virnodesuspend.c index 91dfdf6355..914ce56af0 100644 --- a/src/util/virnodesuspend.c +++ b/src/util/virnodesuspend.c @@ -59,24 +59,19 @@ static void virNodeSuspendUnlock(void) } -/** - * virNodeSuspendInit: - * - * Get the system-wide sleep states supported by the host, such as - * Suspend-to-RAM, Suspend-to-Disk, or Hybrid-Suspend, so that a request - * to suspend/hibernate the host can be handled appropriately based on - * this information. - * - * Returns 0 if successful, and -1 in case of error. - */ -int virNodeSuspendInit(void) +static int virNodeSuspendOnceInit(void) { - if (virMutexInit(&virNodeSuspendMutex) < 0) + if (virMutexInit(&virNodeSuspendMutex) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("Unable to initialize mutex")); return -1; + } return 0; } +VIR_ONCE_GLOBAL_INIT(virNodeSuspend) + /** * virNodeSuspendSetNodeWakeup: @@ -182,6 +177,9 @@ int nodeSuspendForDuration(virConnectPtr conn ATTRIBUTE_UNUSED, virCheckFlags(0, -1); + if (virNodeSuspendInitialize() < 0) + return -1; + if (virNodeSuspendGetTargetMask(&supported) < 0) return -1; @@ -268,6 +266,9 @@ virNodeSuspendSupportsTarget(unsigned int target, bool *supported) int status; int ret = -1; + if (virNodeSuspendInitialize() < 0) + return -1; + *supported = false; switch (target) { diff --git a/src/util/virnodesuspend.h b/src/util/virnodesuspend.h index a6927acf13..76497d8e69 100644 --- a/src/util/virnodesuspend.h +++ b/src/util/virnodesuspend.h @@ -30,7 +30,6 @@ int nodeSuspendForDuration(virConnectPtr conn, unsigned long long duration, unsigned int flags); -int virNodeSuspendInit(void); int virNodeSuspendGetTargetMask(unsigned int *bitmask); #endif /* __VIR_NODE_SUSPEND_H__ */