Skip to content

Commit

Permalink
Revert change object impl change that causes crash
Browse files Browse the repository at this point in the history
  • Loading branch information
timothyschoen committed Dec 1, 2024
1 parent ebc0fbd commit 9e16049
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 32 deletions.
57 changes: 26 additions & 31 deletions Source/Objects/ImplementationBase.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -128,57 +128,52 @@ ObjectImplementationManager::ObjectImplementationManager(pd::Instance* processor

void ObjectImplementationManager::handleAsyncUpdate()
{

objectImplementationLock.enter();
SmallArray<std::pair<t_canvas*, t_canvas*>> allCanvases;
SmallArray<std::pair<t_canvas*, t_gobj*>> allImplementations;
UnorderedSet<t_gobj*> allObjects;

pd->setThis();

pd->lockAudioThread();
for (auto* topLevelCnv = pd_getcanvaslist(); topLevelCnv; topLevelCnv = topLevelCnv->gl_next) {
allCanvases.add({ topLevelCnv, topLevelCnv });
getSubCanvases(topLevelCnv, topLevelCnv, allCanvases);
}

for (auto& [top, glist] : allCanvases) {
for (t_gobj* y = glist->gl_list; y; y = y->g_next) {
auto const* name = pd::Interface::getObjectClassName(&y->g_pd);
if (ImplementationBase::hasImplementation(name)) {
allImplementations.add({ top, y });
allObjects.insert(y);
}
}
}
pd->unlockAudioThread();

for (auto it = objectImplementations.cbegin(); it != objectImplementations.cend();) {
auto& [ptr, implementation] = *it;

if (targetObjects.contains(ptr)) {
if (allObjects.contains(ptr)) {
it = objectImplementations.erase(it); // Erase and move iterator forward.
} else {
++it;
}
}

for (auto& [cnv, obj] : targetImplementations) {
for (auto& [cnv, obj] : allImplementations) {
if (!objectImplementations.count(obj)) {
auto const name = String::fromUTF8(pd::Interface::getObjectClassName(&obj->g_pd));
objectImplementations[obj] = std::unique_ptr<ImplementationBase>(ImplementationBase::createImplementation(name, obj, cnv, pd));
}

objectImplementations[obj]->update();
}
objectImplementationLock.exit();
}

void ObjectImplementationManager::updateObjectImplementations()
{
pd->enqueueFunctionAsync([this](){
SmallArray<std::pair<t_canvas*, t_canvas*>> allCanvases;
SmallArray<std::pair<t_canvas*, t_gobj*>> allImplementations;
UnorderedSet<t_gobj*> allObjects;

for (auto* topLevelCnv = pd_getcanvaslist(); topLevelCnv; topLevelCnv = topLevelCnv->gl_next) {
allCanvases.add({ topLevelCnv, topLevelCnv });
getSubCanvases(topLevelCnv, topLevelCnv, allCanvases);
}

for (auto& [top, glist] : allCanvases) {
for (t_gobj* y = glist->gl_list; y; y = y->g_next) {
auto const* name = pd::Interface::getObjectClassName(&y->g_pd);
if (ImplementationBase::hasImplementation(name)) {
allImplementations.add({ top, y });
allObjects.insert(y);
}
}
}

objectImplementationLock.enter();
targetImplementations = allImplementations;
targetObjects = allObjects;
objectImplementationLock.exit();
triggerAsyncUpdate();
});
triggerAsyncUpdate();
}

void ObjectImplementationManager::getSubCanvases(t_canvas* top, t_canvas* canvas, SmallArray<std::pair<t_canvas*, t_canvas*>>& allCanvases)
Expand Down
2 changes: 1 addition & 1 deletion Tests/Tests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ void runTests(PluginEditor* editor)
HelpFileFuzzTest helpfileFuzzer(editor);

UnitTestRunner runner;
//runner.runTests({&objectFuzzer, &helpfileFuzzer}, 1);
runner.runTests({&objectFuzzer, &helpfileFuzzer}, 1);
});
testRunnerThread.detach();
}

0 comments on commit 9e16049

Please sign in to comment.