home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2010 November / maximum-cd-2010-11.iso / DiscContents / calibre-0.7.13.msi / file_643 (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2010-08-06  |  5.6 KB  |  190 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. import bisect
  5. import mmap
  6. import tempfile
  7. import os
  8. import sys
  9. import threading
  10. import itertools
  11. import _multiprocessing
  12. from multiprocessing.util import Finalize, info
  13. from multiprocessing.forking import assert_spawning
  14. __all__ = [
  15.     'BufferWrapper']
  16. if sys.platform == 'win32':
  17.     from _multiprocessing import win32
  18.     
  19.     class Arena(object):
  20.         _counter = itertools.count()
  21.         
  22.         def __init__(self, size):
  23.             self.size = size
  24.             self.name = 'pym-%d-%d' % (os.getpid(), Arena._counter.next())
  25.             self.buffer = mmap.mmap(-1, self.size, tagname = self.name)
  26.             self._state = (self.size, self.name)
  27.  
  28.         
  29.         def __getstate__(self):
  30.             assert_spawning(self)
  31.             return self._state
  32.  
  33.         
  34.         def __setstate__(self, state):
  35.             (self.size, self.name) = self._state = state
  36.             self.buffer = mmap.mmap(-1, self.size, tagname = self.name)
  37.  
  38.  
  39. else:
  40.     
  41.     class Arena(object):
  42.         
  43.         def __init__(self, size):
  44.             self.buffer = mmap.mmap(-1, size)
  45.             self.size = size
  46.             self.name = None
  47.  
  48.  
  49.  
  50. class Heap(object):
  51.     _alignment = 8
  52.     
  53.     def __init__(self, size = mmap.PAGESIZE):
  54.         self._lastpid = os.getpid()
  55.         self._lock = threading.Lock()
  56.         self._size = size
  57.         self._lengths = []
  58.         self._len_to_seq = { }
  59.         self._start_to_block = { }
  60.         self._stop_to_block = { }
  61.         self._allocated_blocks = set()
  62.         self._arenas = []
  63.  
  64.     
  65.     def _roundup(n, alignment):
  66.         mask = alignment - 1
  67.         return n + mask & ~mask
  68.  
  69.     _roundup = staticmethod(_roundup)
  70.     
  71.     def _malloc(self, size):
  72.         i = bisect.bisect_left(self._lengths, size)
  73.         if i == len(self._lengths):
  74.             length = self._roundup(max(self._size, size), mmap.PAGESIZE)
  75.             self._size *= 2
  76.             info('allocating a new mmap of length %d', length)
  77.             arena = Arena(length)
  78.             self._arenas.append(arena)
  79.             return (arena, 0, length)
  80.         length = self._lengths[i]
  81.         seq = self._len_to_seq[length]
  82.         block = seq.pop()
  83.         if not seq:
  84.             del self._len_to_seq[length]
  85.             del self._lengths[i]
  86.         
  87.         (arena, start, stop) = block
  88.         del self._start_to_block[(arena, start)]
  89.         del self._stop_to_block[(arena, stop)]
  90.         return block
  91.  
  92.     
  93.     def _free(self, block):
  94.         (arena, start, stop) = block
  95.         
  96.         try:
  97.             prev_block = self._stop_to_block[(arena, start)]
  98.         except KeyError:
  99.             pass
  100.  
  101.         (start, _) = self._absorb(prev_block)
  102.         
  103.         try:
  104.             next_block = self._start_to_block[(arena, stop)]
  105.         except KeyError:
  106.             pass
  107.  
  108.         (_, stop) = self._absorb(next_block)
  109.         block = (arena, start, stop)
  110.         length = stop - start
  111.         
  112.         try:
  113.             self._len_to_seq[length].append(block)
  114.         except KeyError:
  115.             self._len_to_seq[length] = [
  116.                 block]
  117.             bisect.insort(self._lengths, length)
  118.  
  119.         self._start_to_block[(arena, start)] = block
  120.         self._stop_to_block[(arena, stop)] = block
  121.  
  122.     
  123.     def _absorb(self, block):
  124.         (arena, start, stop) = block
  125.         del self._start_to_block[(arena, start)]
  126.         del self._stop_to_block[(arena, stop)]
  127.         length = stop - start
  128.         seq = self._len_to_seq[length]
  129.         seq.remove(block)
  130.         if not seq:
  131.             del self._len_to_seq[length]
  132.             self._lengths.remove(length)
  133.         
  134.         return (start, stop)
  135.  
  136.     
  137.     def free(self, block):
  138.         self._lock.acquire()
  139.         
  140.         try:
  141.             self._allocated_blocks.remove(block)
  142.             self._free(block)
  143.         finally:
  144.             self._lock.release()
  145.  
  146.  
  147.     
  148.     def malloc(self, size):
  149.         if os.getpid() != self._lastpid:
  150.             self.__init__()
  151.         
  152.         self._lock.acquire()
  153.         
  154.         try:
  155.             size = self._roundup(max(size, 1), self._alignment)
  156.             (arena, start, stop) = self._malloc(size)
  157.             new_stop = start + size
  158.             if new_stop < stop:
  159.                 self._free((arena, new_stop, stop))
  160.             
  161.             block = (arena, start, new_stop)
  162.             self._allocated_blocks.add(block)
  163.             return block
  164.         finally:
  165.             self._lock.release()
  166.  
  167.  
  168.  
  169.  
  170. class BufferWrapper(object):
  171.     _heap = Heap()
  172.     
  173.     def __init__(self, size):
  174.         block = BufferWrapper._heap.malloc(size)
  175.         self._state = (block, size)
  176.         Finalize(self, BufferWrapper._heap.free, args = (block,))
  177.  
  178.     
  179.     def get_address(self):
  180.         (arena, start, stop) = ()
  181.         size = self._state
  182.         (address, length) = _multiprocessing.address_of_buffer(arena.buffer)
  183.         return address + start
  184.  
  185.     
  186.     def get_size(self):
  187.         return self._state[1]
  188.  
  189.  
  190.