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
4//4//
5// Created by Heather Anderson on 12/5/21.5// Created by Heather Anderson on 12/5/21.
6// Copyright 2021 Vircadia contributors.6// Copyright 2021 Vircadia contributors.
7// Copyright 2022 Overte e.V.
7//8//
8// Distributed under the Apache License, Version 2.0.9// Distributed under the Apache License, Version 2.0.
9// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html10// 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
588 QVariant argValue(methodArgTypeId, arguments[arg+1]);589 QVariant argValue(methodArgTypeId, arguments[arg+1]);
589 args.append(_engine->castVariantToValue(argValue));590 args.append(_engine->castVariantToValue(argValue));
590 }591 }
591 592
592 for (ConnectionList::iterator iter = _connections.begin(); iter != _connections.end(); ++iter) {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) {
593 Connection& conn = *iter;601 Connection& conn = *iter;
594 conn.callback.call(conn.thisValue, args);602 conn.callback.call(conn.thisValue, args);
595 }603 }
596 604
597 return -1;605 return -1;
598}606}
599 607
@@ -602,15 +610,17 @@ int ScriptSignalQtProxy::discoverMetaCallIdx() { · 2 unmodified lines
602 return ourMeta->methodCount();610 return ourMeta->methodCount();
603}611}
604 612
605ScriptSignalQtProxy::ConnectionList::iterator ScriptSignalQtProxy::findConnection(QScriptValue thisObject,613ScriptSignalQtProxy::ConnectionList::iterator ScriptSignalQtProxy::findConnection(QScriptValue thisObject, QScriptValue callback) {
606 QScriptValue callback) {614 ConnectionList::iterator iter;
607 for (ConnectionList::iterator iter = _connections.begin(); iter != _connections.end(); ++iter) {615 withReadLock([&]{
608 Connection& conn = *iter;616 for (iter = _connections.begin(); iter != _connections.end(); ++iter) {
609 if (conn.callback.strictlyEquals(callback) && conn.thisValue.strictlyEquals(thisObject)) {617 Connection& conn = *iter;
610 return iter;618 if (conn.callback.strictlyEquals(callback) && conn.thisValue.strictlyEquals(thisObject)) {
619 break;
620 }
611 }621 }
612 }622 });
613 return _connections.end();623 return iter;
614}624}
615 625
616 626
@@ -660,7 +670,10 @@ void ScriptSignalQtProxy::connect(QScriptValue arg0, QScriptValue arg1) { · 43 unmodified lines
660 Connection newConn;670 Connection newConn;
661 newConn.callback = callback;671 newConn.callback = callback;
662 newConn.thisValue = callbackThis;672 newConn.thisValue = callbackThis;
663 _connections.append(newConn);673
674 withWriteLock([&]{
675 _connections.append(newConn);
676 });
664 677
665 // inform Qt that we're connecting to this signal678 // inform Qt that we're connecting to this signal
666 if (!_isConnected) {679 if (!_isConnected) {
@@ -700,7 +713,9 @@ void ScriptSignalQtProxy::disconnect(QScriptValue arg0, QScriptValue arg1) { · 33 unmodified lines
700 }713 }
701 714
702 // remove it from our internal list of connections715 // remove it from our internal list of connections
703 _connections.erase(lookup);716 withReadLock([&]{
717 _connections.erase(lookup);
718 });
704 719
705 // remove a reference to ourselves from the destination callback720 // remove a reference to ourselves from the destination callback
706 QScriptValue destData = callback.data();721 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