Showing the changes to libraries/script-engine/src/qtscript/ScriptObjectQtProxy.cpp (1 of 2 files). Show all
Unified · Split
| @@ -4,6 +4,7 @@ · 3 unmodified lines | ||
| 4 | 4 | // |
| 5 | 5 | // Created by Heather Anderson on 12/5/21. |
| 6 | 6 | // Copyright 2021 Vircadia contributors. |
| 7 | +// Copyright 2022 Overte e.V. | |
| 7 | 8 | // |
| 8 | 9 | // Distributed under the Apache License, Version 2.0. |
| 9 | 10 | // 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 | 589 | QVariant argValue(methodArgTypeId, arguments[arg+1]); |
| 589 | 590 | args.append(_engine->castVariantToValue(argValue)); |
| 590 | 591 | } |
| 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) { | |
| 593 | 601 | Connection& conn = *iter; |
| 594 | − conn.callback.call(conn.thisValue, args); | |
| 602 | + conn.callback.call(conn.thisValue, args); | |
| 595 | 603 | } |
| 596 | − | |
| 604 | + | |
| 597 | 605 | return -1; |
| 598 | 606 | } |
| 599 | 607 | |
| @@ -602,15 +610,17 @@ int ScriptSignalQtProxy::discoverMetaCallIdx() { · 2 unmodified lines | ||
| 602 | 610 | return ourMeta->methodCount(); |
| 603 | 611 | } |
| 604 | 612 | |
| 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 | + } | |
| 611 | 621 | } |
| 612 | − } | |
| 613 | − return _connections.end(); | |
| 622 | + }); | |
| 623 | + return iter; | |
| 614 | 624 | } |
| 615 | 625 | |
| 616 | 626 | |
| @@ -660,7 +670,10 @@ void ScriptSignalQtProxy::connect(QScriptValue arg0, QScriptValue arg1) { · 43 unmodified lines | ||
| 660 | 670 | Connection newConn; |
| 661 | 671 | newConn.callback = callback; |
| 662 | 672 | newConn.thisValue = callbackThis; |
| 663 | − _connections.append(newConn); | |
| 673 | + | |
| 674 | + withWriteLock([&]{ | |
| 675 | + _connections.append(newConn); | |
| 676 | + }); | |
| 664 | 677 | |
| 665 | 678 | // inform Qt that we're connecting to this signal |
| 666 | 679 | if (!_isConnected) { |
| @@ -700,7 +713,9 @@ void ScriptSignalQtProxy::disconnect(QScriptValue arg0, QScriptValue arg1) { · 33 unmodified lines | ||
| 700 | 713 | } |
| 701 | 714 | |
| 702 | 715 | // remove it from our internal list of connections |
| 703 | − _connections.erase(lookup); | |
| 716 | + withReadLock([&]{ | |
| 717 | + _connections.erase(lookup); | |
| 718 | + }); | |
| 704 | 719 | |
| 705 | 720 | // remove a reference to ourselves from the destination callback |
| 706 | 721 | QScriptValue destData = callback.data(); |