xpc: terminate daemon when last XPC connection to App gone
This commit is contained in:
@@ -17,6 +17,8 @@
|
|||||||
#include "xpc_channels.h"
|
#include "xpc_channels.h"
|
||||||
|
|
||||||
#include <xpc/xpc.h>
|
#include <xpc/xpc.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
#include <daemon.h>
|
#include <daemon.h>
|
||||||
#include <processing/jobs/callback_job.h>
|
#include <processing/jobs/callback_job.h>
|
||||||
@@ -47,6 +49,16 @@ struct private_xpc_dispatch_t {
|
|||||||
* GCD queue for XPC events
|
* GCD queue for XPC events
|
||||||
*/
|
*/
|
||||||
dispatch_queue_t queue;
|
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
|
* Set up GCD handler for XPC events
|
||||||
*/
|
*/
|
||||||
@@ -271,6 +295,9 @@ static void set_handler(private_xpc_dispatch_t *this)
|
|||||||
handle(this, event);
|
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(conn);
|
||||||
});
|
});
|
||||||
xpc_connection_resume(this->service);
|
xpc_connection_resume(this->service);
|
||||||
@@ -303,6 +330,7 @@ xpc_dispatch_t *xpc_dispatch_create()
|
|||||||
.channels = xpc_channels_create(),
|
.channels = xpc_channels_create(),
|
||||||
.queue = dispatch_queue_create("org.strongswan.charon-xpc.q",
|
.queue = dispatch_queue_create("org.strongswan.charon-xpc.q",
|
||||||
DISPATCH_QUEUE_CONCURRENT),
|
DISPATCH_QUEUE_CONCURRENT),
|
||||||
|
.pid = getpid(),
|
||||||
);
|
);
|
||||||
charon->bus->add_listener(charon->bus, &this->channels->listener);
|
charon->bus->add_listener(charon->bus, &this->channels->listener);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user