#define SIGNAL_HELPER
/*
- * Copyright (c) 2020 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2021 Samsung Electronics Co., Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
signal.Connect(this, &TestEmitDuringCallback::DeleteSignalDuringEmit);
}
+ void DeleteDuringEmitConnect(TestSignals::FloatRet0ParamSignal& signal)
+ {
+ mFloatRet0ParamSignal = &signal;
+ signal.Connect(this, &TestEmitDuringCallback::DeleteRetSignalDuringEmit);
+ }
+
void VoidSlotVoid()
{
// Emitting during Emit is very bad!
delete mVoidSignalVoid;
}
+ float DeleteRetSignalDuringEmit()
+ {
+ // deleting the signal during the emit
+ delete mFloatRet0ParamSignal;
+ return 0.0f;
+ }
+
float FloatRet0Param()
{
// Emitting during Emit is very bad!
TestApplication application; // Create core for debug logging
- TestSignals::VoidRetNoParamSignal* signal = new TestSignals::VoidRetNoParamSignal;
+ {
+ TestSignals::VoidRetNoParamSignal* signal = new TestSignals::VoidRetNoParamSignal;
- TestEmitDuringCallback handler1;
- handler1.DeleteDuringEmitConnect(*signal);
+ TestEmitDuringCallback handler1;
+ handler1.DeleteDuringEmitConnect(*signal);
- // should just log an error
- signal->Emit();
+ // should just log an error
+ signal->Emit();
+ }
+
+ {
+ TestSignals::FloatRet0ParamSignal* signal = new TestSignals::FloatRet0ParamSignal;
+
+ TestEmitDuringCallback handler1;
+ handler1.DeleteDuringEmitConnect(*signal);
+
+ // should just log an error
+ signal->Emit();
+ }
tet_result(TET_PASS);
return returnVal;
}
+ // Guards against calling CleanupConnections if the signal is deleted during emission
+ bool signalDeleted{false};
+ mSignalDeleted = &signalDeleted;
+
// If more connections are added by callbacks, these are ignore until the next Emit()
// Note that count cannot be reduced while iterating
const std::size_t initialCount(mSignalConnections.size());
}
}
- // Cleanup NULL values from Connection container
- CleanupConnections();
+ if(!signalDeleted)
+ {
+ // Cleanup NULL values from Connection container
+ CleanupConnections();
+ mSignalDeleted = nullptr;
+ }
return returnVal;
}
return;
}
+ // Guards against calling CleanupConnections if the signal is deleted during emission
+ bool signalDeleted{false};
+ mSignalDeleted = &signalDeleted;
+
// If more connections are added by callbacks, these are ignore until the next Emit()
// Note that count cannot be reduced while iterating
const std::size_t initialCount(mSignalConnections.size());
}
}
- // Cleanup NULL values from Connection container
- CleanupConnections();
+ if(!signalDeleted)
+ {
+ // Cleanup NULL values from Connection container
+ CleanupConnections();
+ mSignalDeleted = nullptr;
+ }
}
// Connect / Disconnect function for use by Signal implementations
BaseSignal& operator=(BaseSignal&&) = delete; ///< Deleted move assignment operator. @SINCE_1_9.25
private:
- std::vector<SignalConnection> mSignalConnections; ///< Array of connections
- uint32_t mNullConnections{0}; ///< Empty Connections in the array.
- bool mEmittingFlag{false}; ///< Used to guard against nested Emit() calls
+ std::vector<SignalConnection> mSignalConnections; ///< Array of connections
+ uint32_t mNullConnections{0}; ///< Empty Connections in the array.
+ bool mEmittingFlag{false}; ///< Used to guard against nested Emit() calls.
+ bool* mSignalDeleted{nullptr}; ///< Used to guard against deletion during Emit() calls.
};
/**