#define VIR_FROM_THIS VIR_FROM_LXC
struct _virLXCMonitor {
- int refs;
+ virObject parent;
- virMutex lock; /* also used to protect refs */
+ virMutex lock;
virDomainObjPtr vm;
virLXCMonitorCallbacksPtr cb;
virNetClientProgramPtr program;
};
-static void virLXCMonitorFree(virLXCMonitorPtr mon);
+static virClassPtr virLXCMonitorClass;
+static void virLXCMonitorDispose(void *obj);
+
+static int virLXCMonitorOnceInit(void)
+{
+ if (!(virLXCMonitorClass = virClassNew("virLXCMonitor",
+ sizeof(virLXCMonitor),
+ virLXCMonitorDispose)))
+ return -1;
+
+ return 0;
+}
+
+VIR_ONCE_GLOBAL_INIT(virLXCMonitor)
+
static void
virLXCMonitorHandleEventExit(virNetClientProgramPtr prog,
virNetClientPtr client,
static void virLXCMonitorCloseFreeCallback(void *opaque)
{
virLXCMonitorPtr mon = opaque;
- virLXCMonitorLock(mon);
- if (virLXCMonitorUnref(mon) > 0)
- virLXCMonitorUnlock(mon);
+ virObjectUnref(mon);;
}
virLXCMonitorPtr mon;
char *sockpath = NULL;
- if (VIR_ALLOC(mon) < 0) {
- virReportOOMError();
+ if (virLXCMonitorInitialize() < 0)
return NULL;
- }
- mon->refs = 1;
+ if (!(mon = virObjectNew(virLXCMonitorClass)))
+ return NULL;
if (virMutexInit(&mon->lock) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
mon->vm = vm;
mon->cb = cb;
- virLXCMonitorRef(mon);
+ virObjectRef(mon);
virNetClientSetCloseCallback(mon->client, virLXCMonitorEOFNotify, mon,
virLXCMonitorCloseFreeCallback);
no_memory:
virReportOOMError();
error:
- virLXCMonitorFree(mon);
+ virObjectUnref(mon);
mon = NULL;
goto cleanup;
}
-static void virLXCMonitorFree(virLXCMonitorPtr mon)
+static void virLXCMonitorDispose(void *opaque)
{
- VIR_DEBUG("mon=%p", mon);
- if (mon->client)
- virLXCMonitorClose(mon);
+ virLXCMonitorPtr mon = opaque;
+ VIR_DEBUG("mon=%p", mon);
if (mon->cb && mon->cb->destroy)
(mon->cb->destroy)(mon, mon->vm);
virMutexDestroy(&mon->lock);
virObjectUnref(mon->program);
- VIR_FREE(mon);
-}
-
-
-int virLXCMonitorRef(virLXCMonitorPtr mon)
-{
- mon->refs++;
- return mon->refs;
-}
-
-int virLXCMonitorUnref(virLXCMonitorPtr mon)
-{
- mon->refs--;
-
- if (mon->refs == 0) {
- virLXCMonitorUnlock(mon);
- virLXCMonitorFree(mon);
- return 0;
- }
-
- return mon->refs;
}
#ifndef __LXC_MONITOR_H__
# define __LXC_MONITOR_H__
+# include "virobject.h"
# include "domain_conf.h"
# include "lxc_protocol.h"
void virLXCMonitorLock(virLXCMonitorPtr mon);
void virLXCMonitorUnlock(virLXCMonitorPtr mon);
-int virLXCMonitorRef(virLXCMonitorPtr mon);
-int virLXCMonitorUnref(virLXCMonitorPtr mon);
-
#endif /* __LXC_MONITOR_H__ */
if (priv->monitor) {
virLXCMonitorClose(priv->monitor);
- virLXCMonitorLock(priv->monitor);
- if (virLXCMonitorUnref(priv->monitor) > 0)
- virLXCMonitorUnlock(priv->monitor);
+ virObjectUnref(priv->monitor);
priv->monitor = NULL;
}
if (virSecurityManagerClearSocketLabel(driver->securityManager, vm->def) < 0) {
if (monitor) {
- virLXCMonitorLock(monitor);
- virLXCMonitorUnref(monitor);
+ virObjectUnref(monitor);
monitor = NULL;
}
goto cleanup;
}
if (rc != 0) {
if (priv->monitor) {
- virLXCMonitorLock(priv->monitor);
- if (virLXCMonitorUnref(priv->monitor) > 0)
- virLXCMonitorUnlock(priv->monitor);
+ virObjectUnref(priv->monitor);
priv->monitor = NULL;
}
virDomainConfVMNWFilterTeardown(vm);