issue #557: support correct cpu_set_t size

This commit is contained in:
David Wilson 2019-03-06 17:53:51 +00:00
parent 408a96f284
commit 3ff6123483
2 changed files with 24 additions and 1 deletions

View File

@ -79,6 +79,7 @@ import multiprocessing
import os
import struct
import mitogen.core
import mitogen.parent
@ -246,8 +247,19 @@ class FixedPolicy(Policy):
class LinuxPolicy(FixedPolicy):
def _mask_to_bytes(self, mask):
"""
Convert the (type long) mask to a cpu_set_t.
"""
chunks = []
shiftmask = (2 ** 64) - 1
for x in range(16):
chunks.append(struct.pack('<Q', mask & shiftmask))
mask >>= 64
return mitogen.core.b('').join(chunks)
def _set_cpu_mask(self, mask):
s = struct.pack('L', mask)
s = self._mask_to_bytes(mask)
_sched_setaffinity(os.getpid(), len(s), s)

View File

@ -211,5 +211,16 @@ class LinuxPolicyTest(testlib.TestCase):
tf.close()
class MockLinuxPolicyTest(testlib.TestCase):
klass = ansible_mitogen.affinity.LinuxPolicy
# Test struct.pack() in _set_cpu_mask().
def test_high_cpus(self):
policy = self.klass(cpu_count=4096)
for x in range(1, 4096, 32):
policy.assign_subprocess()
if __name__ == '__main__':
unittest2.main()