summaryrefslogtreecommitdiff
diff options
authorMarco Trevisan (Treviño) <mail@3v1n0.net>2017-07-12 19:45:57 +0200
committerMarco Trevisan (Treviño) <mail@3v1n0.net>2017-07-12 19:45:57 +0200
commit1bc51823be590e56e6a3efeff626506640e7b508 (patch)
treefa0e76c0dca3a1bdfa6978abf1a8f76c994d76ea
parent5af1db7e331deb01e7dbb0a8f24eed302af5bb64 (diff)
GLibSignal: allow to block/unblock all signals for a signal manager
(bzr r4245.2.8)
-rw-r--r--UnityCore/GLibSignal.cpp5
-rw-r--r--UnityCore/GLibSignal.h5
-rw-r--r--tests/test_glib_signals.cpp28
3 files changed, 33 insertions, 5 deletions
diff --git a/UnityCore/GLibSignal.cpp b/UnityCore/GLibSignal.cpp
index 0a155aede..d577c2f2e 100644
--- a/UnityCore/GLibSignal.cpp
+++ b/UnityCore/GLibSignal.cpp
@@ -122,13 +122,14 @@ SignalBase::Ptr SignalManager::Add(SignalBase::Ptr const& signal)
bool SignalManager::ForeachMatchedSignal(void* object, std::string const& signal_name, std::function<void(SignalBase::Ptr const&)> action, bool erase_after)
{
bool action_performed = false;
- bool all_signals = signal_name.empty();
+ bool all_objects = (object == reinterpret_cast<void*>(std::numeric_limits<uintptr_t>::max()));
+ bool all_signals = all_objects || signal_name.empty();
for (auto it = connections_.begin(); it != connections_.end();)
{
auto const& signal = *it;
- if (signal->object() == object && (all_signals || signal->name() == signal_name))
+ if ((all_objects || signal->object() == object) && (all_signals || signal->name() == signal_name))
{
if (action)
{
diff --git a/UnityCore/GLibSignal.h b/UnityCore/GLibSignal.h
index d60ebc249..6dc536111 100644
--- a/UnityCore/GLibSignal.h
+++ b/UnityCore/GLibSignal.h
@@ -21,6 +21,7 @@
#ifndef UNITY_GLIB_SIGNAL_H
#define UNITY_GLIB_SIGNAL_H
+#include <limits>
#include <string>
#include <vector>
#include <memory>
@@ -94,8 +95,8 @@ public:
template <typename R, typename G, typename... Ts>
SignalBase::Ptr Add(G object, std::string const& signal_name, typename Signal<R, G, Ts...>::SignalCallback const&);
- bool Block(void* object, std::string const& signal_name = "");
- bool Unblock(void* object, std::string const& signal_name = "");
+ bool Block(void* object = (void*) std::numeric_limits<uintptr_t>::max(), std::string const& signal_name = "");
+ bool Unblock(void* object = (void*) std::numeric_limits<uintptr_t>::max(), std::string const& signal_name = "");
bool Disconnect(void* object, std::string const& signal_name = "");
diff --git a/tests/test_glib_signals.cpp b/tests/test_glib_signals.cpp
index 100b1bca9..724e18fec 100644
--- a/tests/test_glib_signals.cpp
+++ b/tests/test_glib_signals.cpp
@@ -34,7 +34,8 @@ public:
virtual ~TestGLibSignals()
{
- g_object_unref(test_signals_);
+ if (test_signals_)
+ g_object_unref(test_signals_);
}
void Signal0Callback(TestSignals* signals)
@@ -511,6 +512,31 @@ TEST_F(TestGLibSignals, TestManagerBlockAll)
EXPECT_TRUE(signal1_received_);
}
+TEST_F(TestGLibSignals, TestManagerBlockAllObjects)
+{
+ SignalManager manager;
+
+ manager.Add<void, TestSignals*>(test_signals_,
+ "signal0",
+ sigc::mem_fun(this, &TestGLibSignals::Signal0Callback));
+ manager.Add<void, TestSignals*, const char*>(test_signals_,
+ "signal1",
+ sigc::mem_fun(this, &TestGLibSignals::Signal1Callback));
+ EXPECT_TRUE(manager.Block());
+
+ g_signal_emit_by_name(test_signals_, "signal0");
+ g_signal_emit_by_name(test_signals_, "signal1", "blocked");
+ EXPECT_FALSE(signal0_received_);
+ EXPECT_FALSE(signal1_received_);
+
+ EXPECT_TRUE(manager.Unblock());
+
+ g_signal_emit_by_name(test_signals_, "signal0");
+ EXPECT_TRUE(signal0_received_);
+ g_signal_emit_by_name(test_signals_, "signal1", "unblocked");
+ EXPECT_TRUE(signal1_received_);
+}
+
TEST_F(TestGLibSignals, TestManagerObjectDisconnection)
{
SignalManager manager;