From 7eb419154b1c16165fce77b78509055a92896929 Mon Sep 17 00:00:00 2001 From: Fabian Dill Date: Wed, 12 Aug 2020 08:48:29 +0200 Subject: [PATCH] Make Enemizer Check a bit more multithreading resilient. --- Rom.py | 54 +++++++++++++++++++++++++++++------------------------- 1 file changed, 29 insertions(+), 25 deletions(-) diff --git a/Rom.py b/Rom.py index 43bef956..2d474bfa 100644 --- a/Rom.py +++ b/Rom.py @@ -10,6 +10,7 @@ import random import struct import sys import subprocess +import threading from BaseClasses import CollectionState, ShopType, Region, Location from Dungeons import dungeon_music_addresses @@ -146,32 +147,35 @@ def read_rom(stream) -> bytearray: return buffer -def check_enemizer(enemizercli): - if getattr(check_enemizer, "done", None): - return - if not os.path.exists(enemizercli) and not os.path.exists(enemizercli + ".exe"): - raise Exception(f"Enemizer not found at {enemizercli}, please install it." - f"Such as https://github.com/Ijwu/Enemizer/releases") - if sys.platform == "win32": - try: - import pythoncom - from win32com.client import Dispatch - except ImportError: - logging.info("Could not check Enemizer Version info as pywin32 bindings are missing.") - else: - # version info is saved on the lib, for some reason - library = os.path.join(os.path.dirname(enemizercli), "EnemizerLibrary.dll") - pythoncom.CoInitialize() - ver_parser = Dispatch('Scripting.FileSystemObject') - info = ver_parser.GetFileVersion(library) +check_lock = threading.Lock() - if info == 'No Version Information Available': - info = None - version = tuple(int(part) for part in info.split(".")) - if version < (6, 1, 0, 222): - raise Exception( - f"Enemizer found at {enemizercli} is outdated ({info}), please update your Enemizer. " - f"Such as https://github.com/Ijwu/Enemizer/releases") + +def check_enemizer(enemizercli): + with check_lock: + if getattr(check_enemizer, "done", None): + return + if not os.path.exists(enemizercli) and not os.path.exists(enemizercli + ".exe"): + raise Exception(f"Enemizer not found at {enemizercli}, please install it." + f"Such as https://github.com/Ijwu/Enemizer/releases") + if sys.platform == "win32": + try: + import pythoncom + from win32com.client import Dispatch + pythoncom.CoInitialize() + except ImportError: + logging.info("Could not check Enemizer Version info as pywin32 bindings are missing.") + else: + # version info is saved on the lib, for some reason + library = os.path.join(os.path.dirname(enemizercli), "EnemizerLibrary.dll") + ver_parser = Dispatch('Scripting.FileSystemObject') + info = ver_parser.GetFileVersion(library) + + if info != 'No Version Information Available': + version = tuple(int(part) for part in info.split(".")) + if version < (6, 1, 0, 222): + raise Exception( + f"Enemizer found at {enemizercli} is outdated ({info}), please update your Enemizer. " + f"Such as https://github.com/Ijwu/Enemizer/releases") check_enemizer.done = True