From 2f2b081aa989f12e257af53b9d412ce19735c6a7 Mon Sep 17 00:00:00 2001 From: ggrieco-tob <31542053+ggrieco-tob@users.noreply.github.com> Date: Fri, 2 Feb 2018 15:37:24 -0300 Subject: [PATCH] Added multiprocessing support to generate testcases in finalize (#697) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Added multiprocessing support to generate testcase in finalize * Improve the code using @feliam suggestions * Fixed multiprocessing code. Now it really seems to work!™ --- manticore/ethereum.py | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/manticore/ethereum.py b/manticore/ethereum.py index ddfff14..0da2e9e 100644 --- a/manticore/ethereum.py +++ b/manticore/ethereum.py @@ -7,6 +7,8 @@ from .platforms import evm from .core.state import State import tempfile from subprocess import Popen, PIPE +from multiprocessing import Process, Queue +from Queue import Empty as EmptyQueue import sha3 import json import logging @@ -1238,10 +1240,26 @@ class ManticoreEVM(Manticore): def finalize(self): #move runnign states to final states list # and generate a testcase for each - lst = tuple(self.running_state_ids) - for state_id in lst: - self.terminate_state_id(state_id) + q = Queue() + map(q.put, self.running_state_ids) + def f(q): + try: + while True: + state_id = q.get_nowait() + self.terminate_state_id(state_id) + except EmptyQueue: + pass + ps = [] + + for _ in range(self._config_procs): + p = Process(target=f, args=(q,)) + p.start() + ps.append(p) + + for p in ps: + p.join() + #delete actual streams from storage for state_id in self.all_state_ids: self._executor._workspace.rm_state(state_id)