Skip to content

Deadlock when loading states via scripts #123

@malleoz

Description

@malleoz

The following sample script will generate freezes when running the script

from dolphin import savestate
from Modules import mkw_utils

@event.on_frameadvance
def frame():
    frameCount = mkw_utils.frame_of_input()

    if (frameCount % 10 == 0):
        savestate.load_from_slot(0)

This is the blocking callstack:

1      [External Code] 
2      DolphinD.exe!PyScripting::PyEvent<std::tuple<bool,unsigned int> const (__cdecl*)(API::Events::SaveStateLoad const &),&PyScripting::PySaveStateLoad>::GetListener::__l2::<lambda_1>::operator()(const API::Events::SaveStateLoad & event) 
3      DolphinD.exe!std::invoke<`PyScripting::PyEvent<std::tuple<bool,unsigned int> const (__cdecl*)(API::Events::SaveStateLoad const &),&PyScripting::PySaveStateLoad>::GetListener'::`2'::<lambda_1> &,API::Events::SaveStateLoad const &>(PyScripting::PyEvent<std::tuple<bool,unsigned int> const (__cdecl*)(API::Events::SaveStateLoad const &),&PyScripting::PySaveStateLoad>::GetListener::__l2::<lambda_1> & _Obj, const API::Events::SaveStateLoad & _Arg1) 
4      DolphinD.exe!std::_Func_impl_no_alloc<`PyScripting::PyEvent<std::tuple<bool,unsigned int> const (__cdecl*)(API::Events::SaveStateLoad const &),&PyScripting::PySaveStateLoad>::GetListener'::`2'::<lambda_1>,void,API::Events::SaveStateLoad const &>::_Do_call(const API::Events::SaveStateLoad & <_Args_0>) 
5      DolphinD.exe!std::_Func_class<void,API::Events::SaveStateLoad const &>::operator()(const API::Events::SaveStateLoad & <_Args_0>) 
6      DolphinD.exe!API::EventContainer<API::Events::SaveStateLoad>::EmitEvent(API::Events::SaveStateLoad evt) 
7      DolphinD.exe!API::GenericEventHub<API::Events::FrameAdvance,API::Events::FrameDrawn,API::Events::MemoryBreakpoint,API::Events::CodeBreakpoint,API::Events::SetInterrupt,API::Events::ClearInterrupt,API::Events::SaveStateSave,API::Events::SaveStateLoad>::EmitEvent<API::Events::SaveStateLoad>(API::Events::SaveStateLoad evt) 
8      DolphinD.exe!State::Load(int slot) 
9      DolphinD.exe!PyScripting::LoadFromSlot(_object * self, _object * args) 
10     [External Code] 
11     DolphinD.exe!Py::CallFunction<>(const Py::Object & callable_object) 
12     DolphinD.exe!`PyScripting::PyEvent<std::tuple<> const (__cdecl*)(API::Events::FrameAdvance const &),&PyScripting::PyFrameAdvance>::Listener'::`2'::<lambda_1>::operator()<>() 
13     DolphinD.exe!std::invoke<`PyScripting::PyEvent<std::tuple<> const (__cdecl*)(API::Events::FrameAdvance const &),&PyScripting::PyFrameAdvance>::Listener'::`2'::<lambda_1>>(PyScripting::PyEvent<std::tuple<> const (__cdecl*)(API::Events::FrameAdvance const &),&PyScripting::PyFrameAdvance>::Listener::__l2::<lambda_1> && _Obj) 
14     DolphinD.exe!std::_Apply_impl<`PyScripting::PyEvent<std::tuple<> const (__cdecl*)(API::Events::FrameAdvance const &),&PyScripting::PyFrameAdvance>::Listener'::`2'::<lambda_1>,std::tuple<> const &>(PyScripting::PyEvent<std::tuple<> const (__cdecl*)(API::Events::FrameAdvance const &),&PyScripting::PyFrameAdvance>::Listener::__l2::<lambda_1> && _Obj, const std::tuple<> & _Tpl, std::integer_sequence<unsigned __int64> __formal) 
15     DolphinD.exe!std::apply<`PyScripting::PyEvent<std::tuple<> const (__cdecl*)(API::Events::FrameAdvance const &),&PyScripting::PyFrameAdvance>::Listener'::`2'::<lambda_1>,std::tuple<> const &>(PyScripting::PyEvent<std::tuple<> const (__cdecl*)(API::Events::FrameAdvance const &),&PyScripting::PyFrameAdvance>::Listener::__l2::<lambda_1> && _Obj, const std::tuple<> & _Tpl) 
16     DolphinD.exe!PyScripting::PyEvent<std::tuple<> const (__cdecl*)(API::Events::FrameAdvance const &),&PyScripting::PyFrameAdvance>::Listener(const Py::Object module, const API::Events::FrameAdvance & event) 
17     DolphinD.exe!PyScripting::PyEvent<std::tuple<> const (__cdecl*)(API::Events::FrameAdvance const &),&PyScripting::PyFrameAdvance>::GetListener::__l2::<lambda_1>::operator()(const API::Events::FrameAdvance & event) 
18     DolphinD.exe!std::invoke<`PyScripting::PyEvent<std::tuple<> const (__cdecl*)(API::Events::FrameAdvance const &),&PyScripting::PyFrameAdvance>::GetListener'::`2'::<lambda_1> &,API::Events::FrameAdvance const &>(PyScripting::PyEvent<std::tuple<> const (__cdecl*)(API::Events::FrameAdvance const &),&PyScripting::PyFrameAdvance>::GetListener::__l2::<lambda_1> & _Obj, const API::Events::FrameAdvance & _Arg1) 
19     DolphinD.exe!std::_Func_impl_no_alloc<`PyScripting::PyEvent<std::tuple<> const (__cdecl*)(API::Events::FrameAdvance const &),&PyScripting::PyFrameAdvance>::GetListener'::`2'::<lambda_1>,void,API::Events::FrameAdvance const &>::_Do_call(const API::Events::FrameAdvance & <_Args_0>) 
20     DolphinD.exe!std::_Func_class<void,API::Events::FrameAdvance const &>::operator()(const API::Events::FrameAdvance & <_Args_0>) 
21     DolphinD.exe!API::EventContainer<API::Events::FrameAdvance>::EmitEvent(API::Events::FrameAdvance evt) 
22     DolphinD.exe!API::GenericEventHub<API::Events::FrameAdvance,API::Events::FrameDrawn,API::Events::MemoryBreakpoint,API::Events::CodeBreakpoint,API::Events::SetInterrupt,API::Events::ClearInterrupt,API::Events::SaveStateSave,API::Events::SaveStateLoad>::EmitEvent<API::Events::FrameAdvance>(API::Events::FrameAdvance evt) 
23     DolphinD.exe!PatchEngine::ApplyFramePatches() 
24     DolphinD.exe!SystemTimers::`anonymous namespace'::PatchEngineCallback(Core::System & system, unsigned __int64 userdata, __int64 cycles_late) 
25     DolphinD.exe!CoreTiming::CoreTimingManager::Advance() 
26     DolphinD.exe!CoreTiming::GlobalAdvance() 
27     [External Code] 
28     DolphinD.exe!BitField<4,1,unsigned int,unsigned int>::Value(std::integral_constant<bool,0> __formal) 

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions