docs: def ensure(self, name, preparefunc, restart=False):
          """ returns (PID, logfile) from a newly started or already
              running process.
  
          @param name: name of the external process, used for caching info
                       across test runs.
  
          @param preparefunc:
                  A subclass of ProcessStarter.
  
          @param restart: force restarting the process if it is running.
  
          @return: (PID, logfile) logfile will be seeked to the end if the
                   server was running, otherwise seeked to the line after
                   where the waitpattern matched.
          """
          from subprocess import Popen, STDOUT
          info = self.getinfo(name)
          if not restart and not info.isrunning():
              restart = True
  
          if restart:
              if info.pid is not None:
                  info.terminate()
              controldir = info.controldir.ensure(dir=1)
              #controldir.remove()
              preparefunc = CompatStarter.wrap(preparefunc)
              starter = preparefunc(controldir, self)
              args = [str(x) for x in starter.args]
              self.log.debug("%s$ %s", controldir, " ".join(args))
              stdout = open(str(info.logpath), "wb", 0)
              kwargs = {'env': starter.env}
              if sys.platform == "win32":
                  kwargs["startupinfo"] = sinfo = std.subprocess.STARTUPINFO()
                  if sys.version_info >= (2,7):
                      sinfo.dwFlags |= std.subprocess.STARTF_USESHOWWINDOW
                      sinfo.wShowWindow |= std.subprocess.SW_HIDE
              else:
                  kwargs["close_fds"] = True
                  kwargs["preexec_fn"] = os.setpgrp  # no CONTROL-C
              popen = Popen(args, cwd=str(controldir),
                            stdout=stdout, stderr=STDOUT,
                            **kwargs)
              info.pid = pid = popen.pid
              info.pidpath.write(str(pid))
              self.log.debug("process %r started pid=%s", name, pid)
              stdout.close()
          f = info.logpath.open()
          if not restart:
              f.seek(0, 2)
          else:
              if not starter.wait(f):
                  raise RuntimeError("Could not start process %s" % name)
              self.log.debug("%s process startup detected", name)
          logfiles = self.config.__dict__.setdefault("_extlogfiles", {})
          logfiles[name] = f
          self.getinfo(name)
          return info.pid, info.logpath