Skip to content

Commit 474fd9f

Browse files
authored
Set mIsBeingDeleted before emitting isBeingDestroyed in WbNode (cyberbotics#6857)
* set mIsBeingDeleted before emitting isBeingDestroyed * update changelog * disable debug symbols in release builds (revert unnecessary changes) * fix casts
1 parent 8e7d814 commit 474fd9f

9 files changed

Lines changed: 11 additions & 9 deletions

File tree

docs/reference/changelog-r2025.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
- Fixed a bug preventing the `webots-controller` executable from running on arm-based mac devices ([#6806](https://github.com/cyberbotics/webots/pull/6806)).
66
- Fixed a bug causing Webots to crash when multiple sounds were used with a [Speaker](speaker.md) node ([#6843](https://github.com/cyberbotics/webots/pull/6843)).
77
- Fixed a bug causing the "Reload/Reset" buttons in the controller recompilation popup to not work on Windows ([#6844](https://github.com/cyberbotics/webots/pull/6844)).
8+
- Fixed a bug causing Webots to occasionally crash when unloading a world ([#6857](https://github.com/cyberbotics/webots/pull/6857)).
89

910
## Webots R2025a
1011
Released on January 31st, 2025.

src/webots/app/WbSelection.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ void WbSelection::selectNode(WbBaseNode *n, bool handlesDisabled) {
7272

7373
if (mSelectedAbstractPose && poseChanged) {
7474
mSelectedAbstractPose->detachTranslateRotateManipulator();
75-
disconnect(mSelectedAbstractPose->baseNode(), &WbBaseNode::isBeingDestroyed, this, &WbSelection::clear);
75+
disconnect(mSelectedAbstractPose->baseNode(), &WbNode::isBeingDestroyed, this, &WbSelection::clear);
7676
}
7777
}
7878
}
@@ -88,7 +88,7 @@ void WbSelection::selectNode(WbBaseNode *n, bool handlesDisabled) {
8888
updateMatterSelection(true);
8989

9090
if (mSelectedAbstractPose && poseChanged) {
91-
connect(mSelectedNode, &WbBaseNode::isBeingDestroyed, this, &WbSelection::clear, Qt::UniqueConnection);
91+
connect(mSelectedNode, &WbNode::isBeingDestroyed, this, &WbSelection::clear, Qt::UniqueConnection);
9292
if (!handlesDisabled && !mSelectedNode->isUseNode() &&
9393
!WbNodeUtilities::isNodeOrAncestorLocked(mSelectedAbstractPose->baseNode()))
9494
mSelectedAbstractPose->attachTranslateRotateManipulator();

src/webots/gui/WbMainWindow.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2181,7 +2181,7 @@ void WbMainWindow::showHtmlRobotWindow(WbRobot *robot, bool manualTrigger) {
21812181
currentRobotWindow = new WbRobotWindow(robot);
21822182
mRobotWindows << currentRobotWindow;
21832183
connect(mTcpServer, &WbTcpServer::sendRobotWindowClientID, currentRobotWindow, &WbRobotWindow::setClientID);
2184-
connect(robot, &WbBaseNode::isBeingDestroyed, this, [this, robot]() { deleteRobotWindow(robot); });
2184+
connect(robot, &WbNode::isBeingDestroyed, this, [this, robot]() { deleteRobotWindow(robot); });
21852185
connect(robot, &WbMatter::matterNameChanged, this, [this, robot]() { showHtmlRobotWindow(robot, false); });
21862186
connect(robot, &WbRobot::controllerChanged, this, [this, robot]() { showHtmlRobotWindow(robot, false); });
21872187
connect(robot, &WbRobot::externControllerChanged, this, [this, robot]() { showHtmlRobotWindow(robot, false); });

src/webots/gui/WbRenderingDeviceWindowFactory.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ WbRenderingDeviceWindow *WbRenderingDeviceWindowFactory::getWindowForDevice(WbRe
116116
return NULL;
117117

118118
WbRenderingDeviceWindow *window = new WbRenderingDeviceWindow(device);
119-
connect(device, &WbRenderingDevice::isBeingDestroyed, this, &WbRenderingDeviceWindowFactory::deleteWindow);
119+
connect(device, &WbNode::isBeingDestroyed, this, &WbRenderingDeviceWindowFactory::deleteWindow);
120120
mWindowsList.append(window);
121121
return window;
122122
}
@@ -140,7 +140,7 @@ void WbRenderingDeviceWindowFactory::setWindowsEnabled(bool enabled) {
140140
}
141141

142142
void WbRenderingDeviceWindowFactory::deleteWindow() {
143-
WbBaseNode *node = dynamic_cast<WbBaseNode *>(sender());
143+
WbNode *node = dynamic_cast<WbNode *>(sender());
144144
assert(node);
145145
for (int i = 0; i < mWindowsList.size(); ++i) {
146146
if (mWindowsList[i]->deviceId() == node->uniqueId()) {

src/webots/nodes/WbBaseNode.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,6 @@ WbBaseNode::WbBaseNode(const QString &modelName) : WbNode(modelName) {
7272
}
7373

7474
WbBaseNode::~WbBaseNode() {
75-
emit isBeingDestroyed(this);
7675
if (mPostFinalizeCalled && !defName().isEmpty() && !WbWorld::instance()->isCleaning() && !WbTemplateManager::isRegenerating())
7776
WbDictionary::instance()->removeNodeFromDictionary(this);
7877
}

src/webots/nodes/WbBaseNode.hpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,6 @@ class WbBaseNode : public WbNode {
129129
QString documentationUrl() const;
130130

131131
signals:
132-
void isBeingDestroyed(WbBaseNode *node);
133132
void visibleHandlesChanged(bool resizeHandlesEnabled);
134133
void finalizationCompleted(WbBaseNode *node);
135134

src/webots/nodes/WbRobot.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -284,7 +284,7 @@ void WbRobot::addDevices(WbNode *node) {
284284

285285
WbRenderingDevice *renderingDevice = dynamic_cast<WbRenderingDevice *>(node);
286286
if (renderingDevice) {
287-
connect(renderingDevice, &WbBaseNode::isBeingDestroyed, this, &WbRobot::removeRenderingDevice, Qt::UniqueConnection);
287+
connect(renderingDevice, &WbNode::isBeingDestroyed, this, &WbRobot::removeRenderingDevice, Qt::UniqueConnection);
288288
mRenderingDevices.append(renderingDevice);
289289
WbAbstractCamera *camera = dynamic_cast<WbAbstractCamera *>(renderingDevice);
290290
if (camera) {
@@ -632,7 +632,7 @@ void WbRobot::updateBattery(bool itemInserted) {
632632
}
633633

634634
void WbRobot::removeRenderingDevice() {
635-
mRenderingDevices.removeOne(static_cast<WbRenderingDevice *>(sender()));
635+
mRenderingDevices.removeOne(dynamic_cast<WbRenderingDevice *>(sender()));
636636
}
637637

638638
void WbRobot::assignDeviceTags(bool reset) {

src/webots/vrml/WbNode.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,7 @@ WbNode::WbNode(const WbNode &other) :
250250

251251
WbNode::~WbNode() {
252252
mIsBeingDeleted = true;
253+
emit isBeingDestroyed(this);
253254

254255
// Delete fields backwards to always delete USE nodes before DEF nodes
255256
int n = mFields.size() - 1;

src/webots/vrml/WbNode.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,8 @@ class WbNode : public QObject {
281281
virtual const bool isRobot() const { return false; };
282282

283283
signals:
284+
void isBeingDestroyed(WbNode *node);
285+
284286
// emitted when any value has changed
285287
void fieldChanged(WbField *field);
286288
void parameterChanged(WbField *field);

0 commit comments

Comments
 (0)