/usr/lib/python2.6/multiprocessing
NameSizeModeActions
dummy/-0755rm
connection.py126630644editdlrm
connection.pyc142160644editdlrm
connection.pyo140660644editdlrm
forking.py145380644editdlrm
forking.pyc142480644editdlrm
forking.pyo140840644editdlrm
heap.py57480644editdlrm
heap.pyc64780644editdlrm
heap.pyo60970644editdlrm
managers.py348040644editdlrm
managers.pyc382440644editdlrm
managers.pyo376300644editdlrm
pool.py176990644editdlrm
pool.pyc185310644editdlrm
pool.pyo180720644editdlrm
process.py79040644editdlrm
process.pyc94820644editdlrm
process.pyo87280644editdlrm
queues.py110890644editdlrm
queues.pyc116260644editdlrm
queues.pyo115230644editdlrm
reduction.py51240644editdlrm
reduction.pyc60000644editdlrm
reduction.pyo60000644editdlrm
sharedctypes.py61450644editdlrm
sharedctypes.pyc85010644editdlrm
sharedctypes.pyo84210644editdlrm
synchronize.py89660644editdlrm
synchronize.pyc104360644editdlrm
synchronize.pyo100980644editdlrm
util.py78390644editdlrm
util.pyc96840644editdlrm
util.pyo95890644editdlrm
__init__.py76270644editdlrm
__init__.pyc83170644editdlrm
__init__.pyo83170644editdlrm
Edit: /usr/lib/python2.6/multiprocessing/heap.py (5748B)
# # Module which supports allocation of memory from an mmap # # multiprocessing/heap.py # # Copyright (c) 2007-2008, R Oudkerk --- see COPYING.txt # import bisect import mmap import tempfile import os import sys import threading import itertools import _multiprocessing from multiprocessing.util import Finalize, info from multiprocessing.forking import assert_spawning __all__ = ['BufferWrapper'] # # Inheirtable class which wraps an mmap, and from which blocks can be allocated # if sys.platform == 'win32': from _multiprocessing import win32 class Arena(object): _counter = itertools.count() def __init__(self, size): self.size = size self.name = 'pym-%d-%d' % (os.getpid(), Arena._counter.next()) self.buffer = mmap.mmap(-1, self.size, tagname=self.name) assert win32.GetLastError() == 0, 'tagname already in use' self._state = (self.size, self.name) def __getstate__(self): assert_spawning(self) return self._state def __setstate__(self, state): self.size, self.name = self._state = state self.buffer = mmap.mmap(-1, self.size, tagname=self.name) assert win32.GetLastError() == win32.ERROR_ALREADY_EXISTS else: class Arena(object): def __init__(self, size): self.buffer = mmap.mmap(-1, size) self.size = size self.name = None # # Class allowing allocation of chunks of memory from arenas # class Heap(object): _alignment = 8 def __init__(self, size=mmap.PAGESIZE): self._lastpid = os.getpid() self._lock = threading.Lock() self._size = size self._lengths = [] self._len_to_seq = {} self._start_to_block = {} self._stop_to_block = {} self._allocated_blocks = set() self._arenas = [] @staticmethod def _roundup(n, alignment): # alignment must be a power of 2 mask = alignment - 1 return (n + mask) & ~mask def _malloc(self, size): # returns a large enough block -- it might be much larger i = bisect.bisect_left(self._lengths, size) if i == len(self._lengths): length = self._roundup(max(self._size, size), mmap.PAGESIZE) self._size *= 2 info('allocating a new mmap of length %d', length) arena = Arena(length) self._arenas.append(arena) return (arena, 0, length) else: length = self._lengths[i] seq = self._len_to_seq[length] block = seq.pop() if not seq: del self._len_to_seq[length], self._lengths[i] (arena, start, stop) = block del self._start_to_block[(arena, start)] del self._stop_to_block[(arena, stop)] return block def _free(self, block): # free location and try to merge with neighbours (arena, start, stop) = block try: prev_block = self._stop_to_block[(arena, start)] except KeyError: pass else: start, _ = self._absorb(prev_block) try: next_block = self._start_to_block[(arena, stop)] except KeyError: pass else: _, stop = self._absorb(next_block) block = (arena, start, stop) length = stop - start try: self._len_to_seq[length].append(block) except KeyError: self._len_to_seq[length] = [block] bisect.insort(self._lengths, length) self._start_to_block[(arena, start)] = block self._stop_to_block[(arena, stop)] = block def _absorb(self, block): # deregister this block so it can be merged with a neighbour (arena, start, stop) = block del self._start_to_block[(arena, start)] del self._stop_to_block[(arena, stop)] length = stop - start seq = self._len_to_seq[length] seq.remove(block) if not seq: del self._len_to_seq[length] self._lengths.remove(length) return start, stop def free(self, block): # free a block returned by malloc() assert os.getpid() == self._lastpid self._lock.acquire() try: self._allocated_blocks.remove(block) self._free(block) finally: self._lock.release() def malloc(self, size): # return a block of right size (possibly rounded up) assert 0 <= size < sys.maxint if os.getpid() != self._lastpid: self.__init__() # reinitialize after fork self._lock.acquire() try: size = self._roundup(max(size,1), self._alignment) (arena, start, stop) = self._malloc(size) new_stop = start + size if new_stop < stop: self._free((arena, new_stop, stop)) block = (arena, start, new_stop) self._allocated_blocks.add(block) return block finally: self._lock.release() # # Class representing a chunk of an mmap -- can be inherited # class BufferWrapper(object): _heap = Heap() def __init__(self, size): assert 0 <= size < sys.maxint block = BufferWrapper._heap.malloc(size) self._state = (block, size) Finalize(self, BufferWrapper._heap.free, args=(block,)) def get_address(self): (arena, start, stop), size = self._state address, length = _multiprocessing.address_of_buffer(arena.buffer) assert size <= length return address + start def get_size(self): return self._state[1]