Skip to content

Commit 617b9a3

Browse files
QuakeStringclaude
andcommitted
Fix simulation actions not updating during server runtime
Sim actions (enable/disable/delete/add/modify) now take effect immediately without restarting the server. The runtime task listens to project signals and rebuilds its action list dynamically, with mutex-protected thread safety. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 31ce4bd commit 617b9a3

File tree

3 files changed

+75
-20
lines changed

3 files changed

+75
-20
lines changed

src/server/runtime/server_runsimactiontask.cpp

Lines changed: 52 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -26,20 +26,35 @@
2626

2727
#include "server_runsimaction.h"
2828

29+
#include <project/server_project.h>
2930
#include <project/server_simaction.h>
3031

31-
mbServerRunSimActionTask::mbServerRunSimActionTask(QObject *parent) : mbCoreTask(parent)
32+
mbServerRunSimActionTask::mbServerRunSimActionTask(mbServerProject *project, QObject *parent) : mbCoreTask(parent)
3233
{
34+
m_project = project;
35+
m_dirty = false;
36+
37+
connect(m_project, &mbServerProject::simActionAdded, this, &mbServerRunSimActionTask::rebuildActions);
38+
connect(m_project, &mbServerProject::simActionRemoved, this, &mbServerRunSimActionTask::rebuildActions);
39+
connect(m_project, &mbServerProject::simActionChanged, this, &mbServerRunSimActionTask::rebuildActions);
3340
}
3441

3542
mbServerRunSimActionTask::~mbServerRunSimActionTask()
3643
{
37-
qDeleteAll(m_actions);
44+
clearActions();
45+
}
46+
47+
void mbServerRunSimActionTask::rebuildActions()
48+
{
49+
QMutexLocker locker(&m_mutex);
50+
m_dirty = true;
3851
}
3952

40-
void mbServerRunSimActionTask::setActions(const QList<mbServerSimAction *> &actions)
53+
void mbServerRunSimActionTask::buildActions()
4154
{
42-
Q_FOREACH(mbServerSimAction *i, actions)
55+
clearActions();
56+
const QList<mbServerSimAction*> &actions = m_project->simActions();
57+
for (mbServerSimAction *i : actions)
4358
{
4459
if (!i->device())
4560
continue;
@@ -62,30 +77,55 @@ void mbServerRunSimActionTask::setActions(const QList<mbServerSimAction *> &acti
6277
break;
6378
}
6479
if (item)
65-
m_actions.append(item);
80+
{
81+
ActionEntry entry;
82+
entry.source = i;
83+
entry.runtime = item;
84+
m_actions.append(entry);
85+
}
6686
}
87+
// Initialize newly built actions
88+
qint64 time = QDateTime::currentMSecsSinceEpoch();
89+
for (const ActionEntry &e : m_actions)
90+
e.runtime->init(time);
91+
}
92+
93+
void mbServerRunSimActionTask::clearActions()
94+
{
95+
for (const ActionEntry &e : m_actions)
96+
delete e.runtime;
97+
m_actions.clear();
6798
}
6899

69100
int mbServerRunSimActionTask::init()
70101
{
71-
qint64 time = QDateTime::currentMSecsSinceEpoch();
72-
Q_FOREACH(mbServerRunSimAction *i, m_actions)
73-
i->init(time);
102+
QMutexLocker locker(&m_mutex);
103+
buildActions();
74104
return 0;
75105
}
76106

77107
int mbServerRunSimActionTask::loop()
78108
{
109+
QMutexLocker locker(&m_mutex);
110+
if (m_dirty)
111+
{
112+
buildActions();
113+
m_dirty = false;
114+
}
79115
qint64 time = QDateTime::currentMSecsSinceEpoch();
80-
Q_FOREACH(mbServerRunSimAction *i, m_actions)
81-
i->exec(time);
116+
for (const ActionEntry &e : m_actions)
117+
{
118+
if (e.source->isEnabled())
119+
e.runtime->exec(time);
120+
}
82121
return 0;
83122
}
84123

85124
int mbServerRunSimActionTask::final()
86125
{
126+
QMutexLocker locker(&m_mutex);
87127
qint64 time = QDateTime::currentMSecsSinceEpoch();
88-
Q_FOREACH(mbServerRunSimAction *i, m_actions)
89-
i->final(time);
128+
for (const ActionEntry &e : m_actions)
129+
e.runtime->final(time);
90130
return 0;
91131
}

src/server/runtime/server_runsimactiontask.h

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,29 +23,45 @@
2323
#ifndef SERVER_RUNSIMACTIONTASK_H
2424
#define SERVER_RUNSIMACTIONTASK_H
2525

26+
#include <QMutex>
27+
2628
#include <mbcore_task.h>
2729

30+
class mbServerProject;
2831
class mbServerSimAction;
2932
class mbServerRunSimAction;
3033

3134
class mbServerRunSimActionTask : public mbCoreTask
3235
{
33-
public:
34-
explicit mbServerRunSimActionTask(QObject *parent = nullptr);
35-
~mbServerRunSimActionTask();
36+
Q_OBJECT
3637

3738
public:
38-
void setActions(const QList<mbServerSimAction*> &actions);
39+
explicit mbServerRunSimActionTask(mbServerProject *project, QObject *parent = nullptr);
40+
~mbServerRunSimActionTask();
3941

4042
public: // task interface
4143
virtual int init() override;
4244
virtual int loop() override;
4345
virtual int final() override;
4446

47+
private Q_SLOTS:
48+
void rebuildActions();
49+
50+
private:
51+
void buildActions();
52+
void clearActions();
53+
4554
private:
46-
typedef QList<mbServerRunSimAction*> Actions_t;
55+
struct ActionEntry
56+
{
57+
mbServerSimAction *source; // project-level (for enabled check)
58+
mbServerRunSimAction *runtime; // execution object
59+
};
4760

48-
Actions_t m_actions;
61+
mbServerProject *m_project;
62+
QMutex m_mutex;
63+
QList<ActionEntry> m_actions;
64+
bool m_dirty;
4965
};
5066

5167
#endif // SERVER_RUNSIMACTIONTASK_H

src/server/runtime/server_runtime.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,7 @@ void mbServerRuntime::createComponents()
5454
{
5555
mbCoreRuntime::createComponents();
5656

57-
mbServerRunSimActionTask *simActionTask = new mbServerRunSimActionTask;
58-
simActionTask->setActions(project()->simActions());
57+
mbServerRunSimActionTask *simActionTask = new mbServerRunSimActionTask(project());
5958
mbCoreRunTaskThread *simActionThread = new mbCoreRunTaskThread(simActionTask);
6059
m_taskThreads.append(simActionThread);
6160

0 commit comments

Comments
 (0)