]>
git.ipfire.org Git - thirdparty/squid.git/blob - src/CpuAffinitySet.cc
2 * Copyright (C) 1996-2014 The Squid Software Foundation and contributors
4 * Squid software is distributed under GPLv2+ license and includes
5 * contributions from numerous individuals and organizations.
6 * Please see the COPYING and CONTRIBUTORS files for details.
9 /* DEBUG: section 54 Interprocess Communication */
12 #include "base/TextException.h"
13 #include "CpuAffinitySet.h"
20 CpuAffinitySet::CpuAffinitySet()
23 CPU_ZERO(&theOrigCpuSet
);
27 CpuAffinitySet::apply()
29 Must(CPU_COUNT(&theCpuSet
) > 0); // CPU affinity mask set
33 if (sched_getaffinity(0, sizeof(theOrigCpuSet
), &theOrigCpuSet
)) {
34 debugs(54, DBG_IMPORTANT
, "ERROR: failed to get CPU affinity for "
35 "process PID " << getpid() << ", ignoring CPU affinity for "
36 "this process: " << xstrerror());
39 memcpy(&cpuSet
, &theCpuSet
, sizeof(cpuSet
));
40 (void) CPU_AND(&cpuSet
, &cpuSet
, &theOrigCpuSet
);
41 if (CPU_COUNT(&cpuSet
) <= 0) {
42 debugs(54, DBG_IMPORTANT
, "ERROR: invalid CPU affinity for process "
43 "PID " << getpid() << ", may be caused by an invalid core in "
44 "'cpu_affinity_map' or by external affinity restrictions");
45 } else if (sched_setaffinity(0, sizeof(cpuSet
), &cpuSet
)) {
46 debugs(54, DBG_IMPORTANT
, "ERROR: failed to set CPU affinity for "
47 "process PID " << getpid() << ": " << xstrerror());
52 CPU_ZERO(&theOrigCpuSet
);
56 CpuAffinitySet::undo()
59 if (sched_setaffinity(0, sizeof(theOrigCpuSet
), &theOrigCpuSet
)) {
60 debugs(54, DBG_IMPORTANT
, "ERROR: failed to restore original CPU "
61 "affinity for process PID " << getpid() << ": " <<
64 CPU_ZERO(&theOrigCpuSet
);
69 CpuAffinitySet::applied()
71 // NOTE: cannot be const.
72 // According to CPU_SET(3) and, apparently, on some systems (e.g.,
73 // OpenSuSE 10.3) CPU_COUNT macro expects a non-const argument.
74 return (CPU_COUNT(&theOrigCpuSet
) > 0);
78 CpuAffinitySet::set(const cpu_set_t
&aCpuSet
)
80 memcpy(&theCpuSet
, &aCpuSet
, sizeof(theCpuSet
));