Signed-off-by: Rafael Fonseca <r4f4rfs@xxxxxxxxx> --- src/lxc/lxc_controller.c | 6 +-- src/rpc/virnetserver.c | 4 +- src/rpc/virnetserverprogram.h | 7 ++- src/rpc/virnetserverservice.c | 87 +++++++++++++++-------------------- tests/virnetdaemontest.c | 4 +- 5 files changed, 48 insertions(+), 60 deletions(-) diff --git a/src/lxc/lxc_controller.c b/src/lxc/lxc_controller.c index 4c038c6228..ea03f5a452 100644 --- a/src/lxc/lxc_controller.c +++ b/src/lxc/lxc_controller.c @@ -992,8 +992,7 @@ static int virLXCControllerSetupServer(virLXCControllerPtr ctrl) if (virNetServerAddService(srv, svc) < 0) goto error; - virObjectUnref(svc); - svc = NULL; + g_clear_object(&svc); ctrl->prog = virNetServerProgramNew(VIR_LXC_MONITOR_PROGRAM, VIR_LXC_MONITOR_PROGRAM_VERSION, @@ -1015,7 +1014,8 @@ static int virLXCControllerSetupServer(virLXCControllerPtr ctrl) virObjectUnref(srv); virObjectUnref(ctrl->daemon); ctrl->daemon = NULL; - virObjectUnref(svc); + if (svc) + g_object_unref(svc); return -1; } diff --git a/src/rpc/virnetserver.c b/src/rpc/virnetserver.c index 5e9124c7ee..f5a59b11af 100644 --- a/src/rpc/virnetserver.c +++ b/src/rpc/virnetserver.c @@ -660,7 +660,7 @@ int virNetServerAddService(virNetServerPtr srv, if (VIR_EXPAND_N(srv->services, srv->nservices, 1) < 0) goto error; - srv->services[srv->nservices-1] = virObjectRef(svc); + srv->services[srv->nservices-1] = g_object_ref(svc); virNetServerServiceSetDispatcher(svc, virNetServerDispatchNewClient, @@ -916,7 +916,7 @@ void virNetServerDispose(void *obj) virThreadPoolFree(srv->workers); for (i = 0; i < srv->nservices; i++) - virObjectUnref(srv->services[i]); + g_object_unref(srv->services[i]); VIR_FREE(srv->services); for (i = 0; i < srv->nprograms; i++) diff --git a/src/rpc/virnetserverprogram.h b/src/rpc/virnetserverprogram.h index bcc10809d4..72dff3b9cb 100644 --- a/src/rpc/virnetserverprogram.h +++ b/src/rpc/virnetserverprogram.h @@ -29,7 +29,12 @@ typedef struct _virNetDaemon virNetDaemon; typedef virNetDaemon *virNetDaemonPtr; -typedef struct _virNetServerService virNetServerService; +#define VIR_TYPE_NET_SERVER_SERVICE vir_net_server_service_get_type() +G_DECLARE_FINAL_TYPE(virNetServerService, + vir_net_server_service, + VIR, + NET_SERVER_SERVICE, + GObject); typedef virNetServerService *virNetServerServicePtr; #define VIR_TYPE_NET_SERVER_PROGRAM vir_net_server_program_get_type() diff --git a/src/rpc/virnetserverservice.c b/src/rpc/virnetserverservice.c index 9d5df456a8..781e414461 100644 --- a/src/rpc/virnetserverservice.c +++ b/src/rpc/virnetserverservice.c @@ -35,7 +35,7 @@ VIR_LOG_INIT("rpc.netserverservice"); struct _virNetServerService { - virObject parent; + GObject parent; size_t nsocks; virNetSocketPtr *socks; @@ -51,19 +51,19 @@ struct _virNetServerService { }; -static virClassPtr virNetServerServiceClass; -static void virNetServerServiceDispose(void *obj); +G_DEFINE_TYPE(virNetServerService, vir_net_server_service, G_TYPE_OBJECT); +static void virNetServerServiceFinalize(GObject *obj); -static int virNetServerServiceOnceInit(void) +static void vir_net_server_service_init(virNetServerService *svc G_GNUC_UNUSED) { - if (!VIR_CLASS_NEW(virNetServerService, virClassForObject())) - return -1; - - return 0; } -VIR_ONCE_GLOBAL_INIT(virNetServerService); +static void vir_net_server_service_class_init(virNetServerServiceClass *klass) +{ + GObjectClass *obj = G_OBJECT_CLASS(klass); + obj->finalize = virNetServerServiceFinalize; +} static void virNetServerServiceAccept(virNetSocketPtr sock, int events G_GNUC_UNUSED, @@ -97,17 +97,13 @@ virNetServerServiceNewSocket(virNetSocketPtr *socks, size_t max_queued_clients, size_t nrequests_client_max) { - virNetServerServicePtr svc; + g_autoptr(virNetServerService) svc = NULL; size_t i; - if (virNetServerServiceInitialize() < 0) - return NULL; - - if (!(svc = virObjectNew(virNetServerServiceClass))) - return NULL; + svc = VIR_NET_SERVER_SERVICE(g_object_new(VIR_TYPE_NET_SERVER_SERVICE, NULL)); if (VIR_ALLOC_N(svc->socks, nsocks) < 0) - goto error; + return NULL; svc->nsocks = nsocks; for (i = 0; i < svc->nsocks; i++) { svc->socks[i] = socks[i]; @@ -120,27 +116,22 @@ virNetServerServiceNewSocket(virNetSocketPtr *socks, for (i = 0; i < svc->nsocks; i++) { if (virNetSocketListen(svc->socks[i], max_queued_clients) < 0) - goto error; + return NULL; /* IO callback is initially disabled, until we're ready * to deal with incoming clients */ - virObjectRef(svc); + g_object_ref(svc); if (virNetSocketAddIOCallback(svc->socks[i], 0, virNetServerServiceAccept, svc, - virObjectFreeCallback) < 0) { - virObjectUnref(svc); - goto error; + g_object_unref) < 0) { + g_object_unref(svc); + return NULL; } } - - return svc; - - error: - virObjectUnref(svc); - return NULL; + return g_steal_pointer(&svc); } @@ -258,51 +249,47 @@ virNetServerServicePtr virNetServerServiceNewFDs(int *fds, virNetServerServicePtr virNetServerServiceNewPostExecRestart(virJSONValuePtr object) { - virNetServerServicePtr svc; + g_autoptr(virNetServerService) svc = NULL; virJSONValuePtr socks; size_t i; size_t n; unsigned int max; - if (virNetServerServiceInitialize() < 0) - return NULL; - - if (!(svc = virObjectNew(virNetServerServiceClass))) - return NULL; + svc = VIR_NET_SERVER_SERVICE(g_object_new(VIR_TYPE_NET_SERVER_SERVICE, NULL)); if (virJSONValueObjectGetNumberInt(object, "auth", &svc->auth) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Missing auth field in JSON state document")); - goto error; + return NULL; } if (virJSONValueObjectGetBoolean(object, "readonly", &svc->readonly) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Missing readonly field in JSON state document")); - goto error; + return NULL; } if (virJSONValueObjectGetNumberUint(object, "nrequests_client_max", &max) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Missing nrequests_client_max field in JSON state document")); - goto error; + return NULL; } svc->nrequests_client_max = max; if (!(socks = virJSONValueObjectGet(object, "socks"))) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Missing socks field in JSON state document")); - goto error; + return NULL; } if (!virJSONValueIsArray(socks)) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Malformed socks array")); - goto error; + return NULL; } n = virJSONValueArraySize(socks); if (VIR_ALLOC_N(svc->socks, n) < 0) - goto error; + return NULL; svc->nsocks = n; for (i = 0; i < svc->nsocks; i++) { @@ -311,29 +298,25 @@ virNetServerServicePtr virNetServerServiceNewPostExecRestart(virJSONValuePtr obj if (!(sock = virNetSocketNewPostExecRestart(child))) { virObjectUnref(sock); - goto error; + return NULL; } svc->socks[i] = sock; /* IO callback is initially disabled, until we're ready * to deal with incoming clients */ - virObjectRef(svc); + g_object_ref(svc); if (virNetSocketAddIOCallback(sock, 0, virNetServerServiceAccept, svc, - virObjectFreeCallback) < 0) { - virObjectUnref(svc); - goto error; + g_object_unref) < 0) { + g_object_unref(svc); + return NULL; } } - return svc; - - error: - virObjectUnref(svc); - return NULL; + return g_steal_pointer(&svc); } @@ -415,9 +398,9 @@ void virNetServerServiceSetDispatcher(virNetServerServicePtr svc, } -void virNetServerServiceDispose(void *obj) +void virNetServerServiceFinalize(GObject *obj) { - virNetServerServicePtr svc = obj; + virNetServerServicePtr svc = VIR_NET_SERVER_SERVICE(obj); size_t i; for (i = 0; i < svc->nsocks; i++) @@ -425,6 +408,8 @@ void virNetServerServiceDispose(void *obj) VIR_FREE(svc->socks); virObjectUnref(svc->tls); + + G_OBJECT_CLASS(vir_net_server_service_parent_class)->finalize(obj); } void virNetServerServiceToggle(virNetServerServicePtr svc, diff --git a/tests/virnetdaemontest.c b/tests/virnetdaemontest.c index 09d268627c..3107fb6747 100644 --- a/tests/virnetdaemontest.c +++ b/tests/virnetdaemontest.c @@ -85,7 +85,7 @@ static virNetServerPtr testCreateServer(const char *server_name, const char *host, int family) { virNetServerPtr srv = NULL; - virNetServerServicePtr svc1 = NULL, svc2 = NULL; + g_autoptr(virNetServerService) svc1 = NULL, svc2 = NULL; virNetServerClientPtr cln1 = NULL, cln2 = NULL; virNetSocketPtr sk1 = NULL, sk2 = NULL; int fdclient[2]; @@ -170,8 +170,6 @@ testCreateServer(const char *server_name, const char *host, int family) virDispatchError(NULL); virObjectUnref(cln1); virObjectUnref(cln2); - virObjectUnref(svc1); - virObjectUnref(svc2); virObjectUnref(sk1); virObjectUnref(sk2); return srv; -- 2.25.1