def teardown(self):
        if self.loadingServices is None:
            logging.error("Tried to tear down an InMemoryCumulusSimulation twice")
            return

        self.stopServices()

        self.workersVdmsAndEventHandlers = None
        self.clientsAndVdms = None
        self.loadingServices = None
        self.listener = None

        for gate in self.workerTeardownGates + self.clientTeardownGates:
            if not gate.wait(30):
                import ufora.util.StackTraceLoop as StackTraceLoop
                StackTraceLoop.writeStackTraceSummary(sys.stderr)

                import ufora.native.Tests as TestsNative
                TestsNative.forceStackdump()
                raise UserWarning("Failed to tear down a simulation")

        if not self.useInMemoryCache:
            shutil.rmtree(self.diskCacheStorageDir)