History

Fixed list item removal during access bug

ksuprynowicz committed 4 years ago

Commit ece2b801 parent 4d61d4f2 files · +33 −15Browse files

Showing the changes to libraries/script-engine/src/qtscript/ScriptObjectQtProxy.cpp (1 of 2 files). Show all

Unified · Split

libraries/script-engine/src/qtscript/ScriptObjectQtProxy.cpp+29−14
@@ -4,6 +4,7 @@ · 3 unmodified lines
44 //
55 // Created by Heather Anderson on 12/5/21.
66 // Copyright 2021 Vircadia contributors.
7+// Copyright 2022 Overte e.V.
78 //
89 // Distributed under the Apache License, Version 2.0.
910 // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
@@ -588,12 +589,19 @@ int ScriptSignalQtProxy::qt_metacall(QMetaObject::Call call, int id, void** argu · 578 unmodified lines
588589 QVariant argValue(methodArgTypeId, arguments[arg+1]);
589590 args.append(_engine->castVariantToValue(argValue));
590591 }
591−
592− for (ConnectionList::iterator iter = _connections.begin(); iter != _connections.end(); ++iter) {
592+
593+ QList<Connection> connections;
594+ withReadLock([&]{
595+ for (ConnectionList::iterator iter = _connections.begin(); iter != _connections.end(); ++iter) {
596+ connections.push_back(*iter);
597+ }
598+ });
599+
600+ for (ConnectionList::iterator iter = connections.begin(); iter != connections.end(); ++iter) {
593601 Connection& conn = *iter;
594− conn.callback.call(conn.thisValue, args);
602+ conn.callback.call(conn.thisValue, args);
595603 }
596−
604+
597605 return -1;
598606 }
599607
@@ -602,15 +610,17 @@ int ScriptSignalQtProxy::discoverMetaCallIdx() { · 2 unmodified lines
602610 return ourMeta->methodCount();
603611 }
604612
605−ScriptSignalQtProxy::ConnectionList::iterator ScriptSignalQtProxy::findConnection(QScriptValue thisObject,
606− QScriptValue callback) {
607− for (ConnectionList::iterator iter = _connections.begin(); iter != _connections.end(); ++iter) {
608− Connection& conn = *iter;
609− if (conn.callback.strictlyEquals(callback) && conn.thisValue.strictlyEquals(thisObject)) {
610− return iter;
613+ScriptSignalQtProxy::ConnectionList::iterator ScriptSignalQtProxy::findConnection(QScriptValue thisObject, QScriptValue callback) {
614+ ConnectionList::iterator iter;
615+ withReadLock([&]{
616+ for (iter = _connections.begin(); iter != _connections.end(); ++iter) {
617+ Connection& conn = *iter;
618+ if (conn.callback.strictlyEquals(callback) && conn.thisValue.strictlyEquals(thisObject)) {
619+ break;
620+ }
611621 }
612− }
613− return _connections.end();
622+ });
623+ return iter;
614624 }
615625
616626
@@ -660,7 +670,10 @@ void ScriptSignalQtProxy::connect(QScriptValue arg0, QScriptValue arg1) { · 43 unmodified lines
660670 Connection newConn;
661671 newConn.callback = callback;
662672 newConn.thisValue = callbackThis;
663− _connections.append(newConn);
673+
674+ withWriteLock([&]{
675+ _connections.append(newConn);
676+ });
664677
665678 // inform Qt that we're connecting to this signal
666679 if (!_isConnected) {
@@ -700,7 +713,9 @@ void ScriptSignalQtProxy::disconnect(QScriptValue arg0, QScriptValue arg1) { · 33 unmodified lines
700713 }
701714
702715 // remove it from our internal list of connections
703− _connections.erase(lookup);
716+ withReadLock([&]{
717+ _connections.erase(lookup);
718+ });
704719
705720 // remove a reference to ourselves from the destination callback
706721 QScriptValue destData = callback.data();

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t