* Returns 0 if the pidfile was successfully cleaned up, -1 otherwise.
*/
int
-virPidFileForceCleanupPath(const char *path)
+virPidFileForceCleanupPathFull(const char *path, bool group)
{
pid_t pid = 0;
int fd = -1;
if (fd < 0) {
virResetLastError();
+ if (pid > 1 && group)
+ pid = virProcessGroupGet(pid);
+
/* Only kill the process if the pid is valid one. 0 means
* there is somebody else doing the same pidfile cleanup
* machinery. */
- if (pid)
+ if (group)
+ virProcessKillPainfullyDelay(pid, true, 0, true);
+ else if (pid)
virProcessKillPainfully(pid, true);
if (virPidFileDeletePath(path) < 0)
return 0;
}
+
+int
+virPidFileForceCleanupPath(const char *path)
+{
+ return virPidFileForceCleanupPathFull(path, false);
+}
* wait longer than the default.
*/
int
-virProcessKillPainfullyDelay(pid_t pid, bool force, unsigned int extradelay)
+virProcessKillPainfullyDelay(pid_t pid, bool force, unsigned int extradelay, bool group)
{
size_t i;
/* This is in 1/5th seconds since polling is on a 0.2s interval */
unsigned int polldelay = (force ? 200 : 75) + (extradelay*5);
const char *signame = "TERM";
- VIR_DEBUG("vpid=%lld force=%d extradelay=%u",
- (long long)pid, force, extradelay);
+ VIR_DEBUG("vpid=%lld force=%d extradelay=%u group=%d",
+ (long long)pid, force, extradelay, group);
/* This loop sends SIGTERM, then waits a few iterations (10 seconds)
* to see if it dies. If the process still hasn't exited, and
*/
for (i = 0; i < polldelay; i++) {
int signum;
+ int rc;
+
if (i == 0) {
signum = SIGTERM; /* kindly suggest it should exit */
} else if (i == 50 && force) {
signum = 0; /* Just check for existence */
}
- if (virProcessKill(pid, signum) < 0) {
+ if (group)
+ rc = virProcessGroupKill(pid, signum);
+ else
+ rc = virProcessKill(pid, signum);
+
+ if (rc < 0) {
if (errno != ESRCH) {
virReportSystemError(errno,
_("Failed to terminate process %lld with SIG%s"),
int virProcessKillPainfully(pid_t pid, bool force)
{
- return virProcessKillPainfullyDelay(pid, force, 0);
+ return virProcessKillPainfullyDelay(pid, force, 0, false);
}
#if WITH_SCHED_GETAFFINITY
int virProcessKillPainfully(pid_t pid, bool force);
int virProcessKillPainfullyDelay(pid_t pid,
bool force,
- unsigned int extradelay);
+ unsigned int extradelay,
+ bool group);
int virProcessSetAffinity(pid_t pid, virBitmap *map, bool quiet);