From: Martin Willi Date: Thu, 2 May 2013 12:40:23 +0000 (+0200) Subject: xpc: terminate daemon when last XPC connection to App gone X-Git-Tag: 5.1.0rc1~25^2~10 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a0c125eacb612ecb0e30b1f8335dc6ab3e378c0c;p=thirdparty%2Fstrongswan.git xpc: terminate daemon when last XPC connection to App gone --- diff --git a/src/frontends/osx/charon-xpc/xpc_dispatch.c b/src/frontends/osx/charon-xpc/xpc_dispatch.c index 1f636bc431..1ef77bfa16 100644 --- a/src/frontends/osx/charon-xpc/xpc_dispatch.c +++ b/src/frontends/osx/charon-xpc/xpc_dispatch.c @@ -17,6 +17,8 @@ #include "xpc_channels.h" #include +#include +#include #include #include @@ -47,6 +49,16 @@ struct private_xpc_dispatch_t { * GCD queue for XPC events */ dispatch_queue_t queue; + + /** + * Number of active App connections + */ + refcount_t refcount; + + /** + * PID of main thread + */ + pid_t pid; }; /** @@ -257,6 +269,18 @@ static void handle(private_xpc_dispatch_t *this, xpc_object_t request) } } +/** + * Finalizer for client connections + */ +static void cleanup_connection(private_xpc_dispatch_t *this) +{ + if (ref_put(&this->refcount)) + { + DBG1(DBG_CFG, "no XPC connections, raising SIGTERM"); + kill(this->pid, SIGTERM); + } +} + /** * Set up GCD handler for XPC events */ @@ -271,6 +295,9 @@ static void set_handler(private_xpc_dispatch_t *this) handle(this, event); } }); + ref_get(&this->refcount); + xpc_connection_set_context(conn, this); + xpc_connection_set_finalizer_f(conn, (void*)cleanup_connection); xpc_connection_resume(conn); }); xpc_connection_resume(this->service); @@ -303,6 +330,7 @@ xpc_dispatch_t *xpc_dispatch_create() .channels = xpc_channels_create(), .queue = dispatch_queue_create("org.strongswan.charon-xpc.q", DISPATCH_QUEUE_CONCURRENT), + .pid = getpid(), ); charon->bus->add_listener(charon->bus, &this->channels->listener);