Fix some edge case where core can freeze upon loading content
[pcsx_rearmed.git] / frontend / libretro.c
index 2a175cc..783f9cd 100644 (file)
@@ -1227,6 +1227,7 @@ static void set_retro_memmap(void)
     environ_cb(RETRO_ENVIRONMENT_SET_MEMORY_MAPS, &retromap);
 }
 
+static void update_variables(bool in_flight);
 bool retro_load_game(const struct retro_game_info *info)
 {
        size_t i;
@@ -1422,6 +1423,8 @@ bool retro_load_game(const struct retro_game_info *info)
                return false;
        }
 
+       update_variables(false);
+
        if (plugins_opened) {
                ClosePlugins();
                plugins_opened = 0;
@@ -1772,14 +1775,19 @@ static void update_variables(bool in_flight)
 
    if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) || var.value)
    {
-      R3000Acpu *prev_cpu = psxCpu;
+         R3000Acpu *prev_cpu = psxCpu;
+#if defined(LIGHTREC)
+      bool can_use_dynarec = found_bios;
+#else
+      bool can_use_dynarec = 1;
+#endif
 
 #ifdef _3DS
       if(!__ctr_svchax)
          Config.Cpu = CPU_INTERPRETER;
       else
 #endif
-      if (strcmp(var.value, "disabled") == 0 || !found_bios)
+      if (strcmp(var.value, "disabled") == 0 || !can_use_dynarec)
          Config.Cpu = CPU_INTERPRETER;
       else if (strcmp(var.value, "enabled") == 0)
          Config.Cpu = CPU_DYNAREC;
@@ -2757,13 +2765,15 @@ void retro_init(void)
    if (environ_cb(RETRO_ENVIRONMENT_GET_INPUT_BITMASKS, NULL))
       libretro_supports_bitmasks = true;
 
-       update_variables(false);
        check_system_specs();
 }
 
 void retro_deinit(void)
 {
-       ClosePlugins();
+       if (plugins_opened) {
+               ClosePlugins();
+               plugins_opened = 0;
+       }
        SysClose();
 #ifdef _3DS
    linearFree(vout_buf);