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 | // 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.html | 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 | 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 | ||
| 605 | ScriptSignalQtProxy::ConnectionList::iterator ScriptSignalQtProxy::findConnection(QScriptValue thisObject, | 613 | ScriptSignalQtProxy::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 signal | 678 | // 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 connections | 715 | // 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 callback | 720 | // remove a reference to ourselves from the destination callback |
| 706 | QScriptValue destData = callback.data(); | 721 | QScriptValue destData = callback.data(); |