summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apt-pkg/deb/dpkgpm.cc30
-rw-r--r--debian/changelog3
2 files changed, 32 insertions, 1 deletions
diff --git a/apt-pkg/deb/dpkgpm.cc b/apt-pkg/deb/dpkgpm.cc
index 1d45e70e9..462f4a739 100644
--- a/apt-pkg/deb/dpkgpm.cc
+++ b/apt-pkg/deb/dpkgpm.cc
@@ -74,6 +74,31 @@ namespace
};
}
+/* helper function to ionice the given PID
+
+ there is no C header for ionice yet - just the syscall interface
+ so we use the binary from util-linux
+*/
+static bool
+ionice(int PID)
+{
+ if (!FileExists("/usr/bin/ionice"))
+ return false;
+ pid_t Process = ExecFork();
+ if (Process == 0)
+ {
+ char buf[32];
+ snprintf(buf, sizeof(buf), "-p%d", PID);
+ const char *Args[4];
+ Args[0] = "/usr/bin/ionice";
+ Args[1] = "-c3";
+ Args[2] = buf;
+ Args[3] = 0;
+ execv(Args[0], (char **)Args);
+ }
+ return ExecWait(Process, "ionice");
+}
+
// DPkgPM::pkgDPkgPM - Constructor /*{{{*/
// ---------------------------------------------------------------------
/* */
@@ -850,7 +875,6 @@ bool pkgDPkgPM::Go(int OutStatusFd)
_exit(100);
}
-
/* No Job Control Stop Env is a magic dpkg var that prevents it
from using sigstop */
putenv((char *)"DPKG_NO_TSTP=yes");
@@ -859,6 +883,10 @@ bool pkgDPkgPM::Go(int OutStatusFd)
_exit(100);
}
+ // apply ionice
+ if (_config->FindB("DPkg::UseIoNice", false) == true)
+ ionice(Child);
+
// clear the Keep-Fd again
_config->Clear("APT::Keep-Fds",fd[1]);
diff --git a/debian/changelog b/debian/changelog
index 30e7b7591..a22f78401 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -13,6 +13,9 @@ apt (0.7.21) UNRELEASED; urgency=low
* apt-pkg/acquire.cc:
- make the max pipeline depth of the acquire queue configurable
via Acquire::Max-Pipeline-Depth
+ * apt-pkg/deb/dpkgpm.cc:
+ - add Dpkg::UseIoNice boolean option to run dpkg with ionice -c3
+ (off by default)
-- Michael Vogt <michael.vogt@ubuntu.com> Thu, 28 May 2009 17:51:42 +0200