code: def malloc(self, size):
      # return a block of right size (possibly rounded up)
      if size < 0:
          raise ValueError("Size {0:n} out of range".format(size))
      if sys.maxsize <= size:
          raise OverflowError("Size {0:n} too large".format(size))
      if os.getpid() != self._lastpid:
          self.__init__()  # reinitialize after fork
      with self._lock:
          self._n_mallocs += 1
          # allow pending blocks to be marked available
          self._free_pending_blocks()
          size = self._roundup(max(size, 1), self._alignment)
          (arena, start, stop) = self._malloc(size)
          real_stop = start + size
          if real_stop < stop:
              # if the returned block is larger than necessary, mark
              # the remainder available
              self._add_free_block((arena, real_stop, stop))
          self._allocated_blocks[arena].add((start, real_stop))
          return (arena, start, real_stop)
  
imports: import bisect
  from collections import defaultdict
  import mmap
  import os
  import sys
  import tempfile
  import threading
  from .context import reduction, assert_spawning
  from .None import util
label_desc: Use image node_id 11 for calling the Heap obj's underlying member method code with example usage: obj.malloc(size) and returns: arena,  start,  real_stop