Merge lp:~pete-woods/unity-api/add-signal-managers into lp:unity-api

Proposed by Pete Woods
Status: Merged
Approved by: Pete Woods
Approved revision: 299
Merged at revision: 282
Proposed branch: lp:~pete-woods/unity-api/add-signal-managers
Merge into: lp:unity-api
Prerequisite: lp:~pete-woods/unity-api/add-glib-assigner-class
Diff against target: 491 lines (+325/-0)
11 files modified
debian/control (+1/-0)
include/unity/util/GObjectMemory.h (+33/-0)
include/unity/util/GioMemory.h (+72/-0)
include/unity/util/GlibMemory.h (+28/-0)
include/unity/util/ResourcePtr.h (+10/-0)
test/gtest/unity/util/CMakeLists.txt (+1/-0)
test/gtest/unity/util/GObjectMemory/GObjectMemory_test.cpp (+34/-0)
test/gtest/unity/util/GioMemory/CMakeLists.txt (+30/-0)
test/gtest/unity/util/GioMemory/GioMemory_test.cpp (+114/-0)
test/headers/CMakeLists.txt (+1/-0)
test/headers/includechecker.py (+1/-0)
To merge this branch: bzr merge lp:~pete-woods/unity-api/add-signal-managers
Reviewer Review Type Date Requested Status
Unity8 CI Bot continuous-integration Needs Fixing
Michi Henning (community) Approve
Review via email: mp+320961@code.launchpad.net

Commit message

unity::util - Add glib signal managers

Description of the change

unity::util - Add glib signal managers

To post a comment you must log in.
Revision history for this message
Unity8 CI Bot (unity8-ci-bot) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
Unity8 CI Bot (unity8-ci-bot) wrote :

PASSED: Continuous integration, rev:295
https://unity8-jenkins.ubuntu.com/job/lp-unity-api-ci/165/
Executed test runs:
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build/4698
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-0-fetch/4726
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=amd64,release=xenial+overlay/4549
        deb: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=amd64,release=xenial+overlay/4549/artifact/output/*zip*/output.zip
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=amd64,release=zesty/4549
        deb: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=amd64,release=zesty/4549/artifact/output/*zip*/output.zip
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=armhf,release=xenial+overlay/4549
        deb: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=armhf,release=xenial+overlay/4549/artifact/output/*zip*/output.zip
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=armhf,release=zesty/4549
        deb: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=armhf,release=zesty/4549/artifact/output/*zip*/output.zip
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=i386,release=xenial+overlay/4549
        deb: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=i386,release=xenial+overlay/4549/artifact/output/*zip*/output.zip
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=i386,release=zesty/4549
        deb: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=i386,release=zesty/4549/artifact/output/*zip*/output.zip

Click here to trigger a rebuild:
https://unity8-jenkins.ubuntu.com/job/lp-unity-api-ci/165/rebuild

review: Approve (continuous-integration)
Revision history for this message
Michi Henning (michihenning) wrote :

This looks sensible to me. I'd prefer if someone with more glib mojo than me could top-approve though.

review: Approve
294. By Pete Woods

Fix null assignment behaviour in assigner classes

295. By Pete Woods

Tweak docs

Revision history for this message
Unity8 CI Bot (unity8-ci-bot) wrote :
review: Needs Fixing (continuous-integration)
296. By Pete Woods

Fix whitespace error

298. By Pete Woods

Fix up tests, use libqtdbustest for temporary test bus

299. By Pete Woods

Add docs

Revision history for this message
Unity8 CI Bot (unity8-ci-bot) wrote :
review: Needs Fixing (continuous-integration)

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'debian/control'
--- debian/control 2016-12-23 09:14:43 +0000
+++ debian/control 2017-04-04 09:34:42 +0000
@@ -14,6 +14,7 @@
14 graphviz,14 graphviz,
15 libglib2.0-dev,15 libglib2.0-dev,
16 libgtest-dev,16 libgtest-dev,
17 libqtdbustest1-dev,
17 pkg-config,18 pkg-config,
18 python3:any,19 python3:any,
19 qt5-default,20 qt5-default,
2021
=== modified file 'include/unity/util/GObjectMemory.h'
--- include/unity/util/GObjectMemory.h 2017-04-04 09:34:42 +0000
+++ include/unity/util/GObjectMemory.h 2017-04-04 09:34:42 +0000
@@ -24,6 +24,8 @@
24#include <stdexcept>24#include <stdexcept>
25#include <glib-object.h>25#include <glib-object.h>
2626
27#include <unity/util/ResourcePtr.h>
28
27namespace unity29namespace unity
28{30{
2931
@@ -109,6 +111,20 @@
109 SP& smart_ptr_;111 SP& smart_ptr_;
110};112};
111113
114template <typename T>
115struct GObjectSignalUnsubscriber
116{
117 void operator()(gulong handle) noexcept
118 {
119 if (handle != 0 && G_IS_OBJECT(obj_.get()))
120 {
121 g_signal_handler_disconnect(obj_.get(), handle);
122 }
123 }
124
125 GObjectSPtr<T> obj_;
126};
127
112}128}
113129
114/**130/**
@@ -187,6 +203,23 @@
187 return internal::GObjectAssigner<SP>(smart_ptr);203 return internal::GObjectAssigner<SP>(smart_ptr);
188}204}
189205
206template<typename T>
207using GObjectSignalConnection = ResourcePtr<gulong, internal::GObjectSignalUnsubscriber<T>>;
208
209/**
210 \brief Simple wrapper to manage the lifecycle of GObject signal connections.
211
212 When 'nameConnection_' goes out of scope or is dealloc'ed, the source will be removed:
213 \code{.cpp}
214 GObjectSignalConnection<FooBar> nameConnection_;
215 nameConnection_ = gobject_signal_connection(g_signal_connect(o.get(), "notify::name", G_CALLBACK(on_notify_name), this), o);
216 \endcode
217 */
218template <typename T>
219inline GObjectSignalConnection<T> gobject_signal_connection(gulong id, const GObjectSPtr<T>& obj)
220{
221 return GObjectSignalConnection<T>(id, internal::GObjectSignalUnsubscriber<T>{obj});
222}
190223
191} // namespace until224} // namespace until
192225
193226
=== added file 'include/unity/util/GioMemory.h'
--- include/unity/util/GioMemory.h 1970-01-01 00:00:00 +0000
+++ include/unity/util/GioMemory.h 2017-04-04 09:34:42 +0000
@@ -0,0 +1,72 @@
1/*
2 * Copyright (C) 2013-2017 Canonical Ltd.
3 *
4 * This program is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU Lesser General Public License version 3 as
6 * published by the Free Software Foundation.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU Lesser General Public License for more details.
12 *
13 * You should have received a copy of the GNU Lesser General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 *
16 * Authored by: Pete Woods <pete.woods@canonical.com>
17 */
18
19#ifndef UNITY_UTIL_GIOMEMORY_H
20#define UNITY_UTIL_GIOMEMORY_H
21
22#include <gio/gio.h>
23
24#include <unity/util/GObjectMemory.h>
25
26namespace unity
27{
28
29namespace util
30{
31
32namespace internal
33{
34struct GDBusSignalUnsubscriber
35{
36public:
37 void operator()(guint handle) noexcept
38 {
39 if (handle != 0 && G_IS_OBJECT(bus_.get()))
40 {
41 g_dbus_connection_signal_unsubscribe(bus_.get(), handle);
42 }
43 }
44
45 GObjectSPtr<GDBusConnection> bus_;
46};
47
48}
49
50typedef ResourcePtr<guint, internal::GDBusSignalUnsubscriber> GDBusSignalConnection;
51
52/**
53 \brief Simple wrapper to manage the lifecycle of manual GDBus signal connections.
54
55 When 'signalConnection_' goes out of scope or is dealloc'ed, the connection will be removed:
56 \code{.cpp}
57 GDBusSignalConnection signalConnection_;
58
59 signalConnection_ = gdbus_signal_connection(
60 g_dbus_connection_signal_subscribe(bus.get(), nullptr, "org.does.not.exist", nullptr, "/does/not/exist", nullptr, G_DBUS_SIGNAL_FLAGS_NONE, on_dbus_signal, this, nullptr), bus);
61 \endcode
62 */
63inline GDBusSignalConnection gdbus_signal_connection(guint id, GObjectSPtr<GDBusConnection> bus) noexcept
64{
65 return GDBusSignalConnection(id, internal::GDBusSignalUnsubscriber{bus});
66}
67
68} // namespace until
69
70} // namespace unity
71
72#endif
073
=== modified file 'include/unity/util/GlibMemory.h'
--- include/unity/util/GlibMemory.h 2017-04-04 09:34:42 +0000
+++ include/unity/util/GlibMemory.h 2017-04-04 09:34:42 +0000
@@ -24,6 +24,8 @@
24#include <memory>24#include <memory>
25#include <glib.h>25#include <glib.h>
2626
27#include <unity/util/ResourcePtr.h>
28
27namespace unity29namespace unity
28{30{
2931
@@ -83,6 +85,17 @@
83 SP& smart_ptr_;85 SP& smart_ptr_;
84};86};
8587
88struct GSourceUnsubscriber
89{
90 void operator()(guint tag) noexcept
91 {
92 if (tag != 0)
93 {
94 g_source_remove(tag);
95 }
96 }
97};
98
86}99}
87100
88#define UNITY_UTIL_DEFINE_GLIB_SMART_POINTERS(TypeName, func) \101#define UNITY_UTIL_DEFINE_GLIB_SMART_POINTERS(TypeName, func) \
@@ -156,6 +169,21 @@
156 return internal::GlibAssigner<SP>(smart_ptr);169 return internal::GlibAssigner<SP>(smart_ptr);
157}170}
158171
172using GSourceManager = ResourcePtr<guint, internal::GSourceUnsubscriber>;
173
174/**
175 \brief Simple wrapper to manage the lifecycle of sources.
176
177 When 'timer' goes out of scope or is dealloc'ed, the source will be removed:
178 \code{.cpp}
179 auto timer = g_source_manager(g_timeout_add(5000, on_timeout, nullptr));
180 \endcode
181 */
182inline GSourceManager g_source_manager(guint id)
183{
184 return GSourceManager(id, internal::GSourceUnsubscriber());
185}
186
159/**187/**
160 * Below here is some hackery to extract the matching deleters for all built in glib types.188 * Below here is some hackery to extract the matching deleters for all built in glib types.
161 */189 */
162190
=== modified file 'include/unity/util/ResourcePtr.h'
--- include/unity/util/ResourcePtr.h 2014-06-25 23:46:22 +0000
+++ include/unity/util/ResourcePtr.h 2017-04-04 09:34:42 +0000
@@ -20,6 +20,7 @@
20#define UNITY_UTIL_RESOURCEPTR_H20#define UNITY_UTIL_RESOURCEPTR_H
2121
22#include <mutex>22#include <mutex>
23#include <type_traits>
2324
24namespace unity25namespace unity
25{26{
@@ -135,6 +136,7 @@
135 */136 */
136 typedef D deleter_type;137 typedef D deleter_type;
137138
139 ResourcePtr();
138 explicit ResourcePtr(D d);140 explicit ResourcePtr(D d);
139 ResourcePtr(R r, D d);141 ResourcePtr(R r, D d);
140 ResourcePtr(ResourcePtr&& r);142 ResourcePtr(ResourcePtr&& r);
@@ -175,6 +177,14 @@
175 typedef LockAdopter<decltype(m_)> AdoptLock;177 typedef LockAdopter<decltype(m_)> AdoptLock;
176};178};
177179
180template<typename R, typename D>
181ResourcePtr<R, D>::ResourcePtr()
182 : initialized_(false)
183{
184 static_assert(!std::is_pointer<deleter_type>::value,
185 "constructed with null function pointer deleter");
186}
187
178/**188/**
179Constructs a ResourcePtr with the specified deleter. No resource is held, so a call to has_resource()189Constructs a ResourcePtr with the specified deleter. No resource is held, so a call to has_resource()
180after constructing a ResourcePtr this way returns <code>false</code>.190after constructing a ResourcePtr this way returns <code>false</code>.
181191
=== modified file 'test/gtest/unity/util/CMakeLists.txt'
--- test/gtest/unity/util/CMakeLists.txt 2017-01-19 13:52:32 +0000
+++ test/gtest/unity/util/CMakeLists.txt 2017-04-04 09:34:42 +0000
@@ -1,6 +1,7 @@
1add_subdirectory(Daemon)1add_subdirectory(Daemon)
2add_subdirectory(DefinesPtrs)2add_subdirectory(DefinesPtrs)
3add_subdirectory(FileIO)3add_subdirectory(FileIO)
4add_subdirectory(GioMemory)
4add_subdirectory(GlibMemory)5add_subdirectory(GlibMemory)
5add_subdirectory(GObjectMemory)6add_subdirectory(GObjectMemory)
6add_subdirectory(IniParser)7add_subdirectory(IniParser)
78
=== modified file 'test/gtest/unity/util/GObjectMemory/GObjectMemory_test.cpp'
--- test/gtest/unity/util/GObjectMemory/GObjectMemory_test.cpp 2017-04-04 09:34:42 +0000
+++ test/gtest/unity/util/GObjectMemory/GObjectMemory_test.cpp 2017-04-04 09:34:42 +0000
@@ -54,6 +54,8 @@
5454
55void foo_bar_assigner_null(FooBar** in);55void foo_bar_assigner_null(FooBar** in);
5656
57void foo_bar_set_name(FooBar* fooBar, const gchar* const name);
58
57G_END_DECLS59G_END_DECLS
5860
59// private implementation61// private implementation
@@ -197,6 +199,11 @@
197 }199 }
198}200}
199201
202void foo_bar_set_name(FooBar* fooBar, const gchar* const name)
203{
204 g_object_set(fooBar, "name", name, nullptr);
205}
206
200//207//
201// Test cases208// Test cases
202//209//
@@ -213,6 +220,22 @@
213 {220 {
214 DELETED_OBJECTS.clear();221 DELETED_OBJECTS.clear();
215 }222 }
223
224 static void on_notify_name(GObject *object, GParamSpec *, gpointer user_data)
225 {
226 static_cast<GObjectMemoryTest*>(user_data)->onNotifyName(object);
227 }
228
229 void onNotifyName(GObject *object)
230 {
231 gcharUPtr name;
232 g_object_get(object, "name", assign_glib(name), nullptr);
233 nameChanges_.emplace_back(name.get());
234 }
235
236 list<string> nameChanges_;
237
238 GObjectSignalConnection<FooBar> nameConnection_;
216};239};
217240
218TEST_F(GObjectMemoryTest, trivial)241TEST_F(GObjectMemoryTest, trivial)
@@ -496,6 +519,17 @@
496 EXPECT_EQ(list<Deleted>({{"hi", 6}, {"bye", 7}}), DELETED_OBJECTS);519 EXPECT_EQ(list<Deleted>({{"hi", 6}, {"bye", 7}}), DELETED_OBJECTS);
497}520}
498521
522TEST_F(GObjectMemoryTest, signals)
523{
524 auto o(share_gobject(foo_bar_new_full("hi", 1)));
525 nameConnection_ = gobject_signal_connection(g_signal_connect(o.get(), "notify::name", G_CALLBACK(on_notify_name), this), o);
526 foo_bar_set_name(o.get(), "change1");
527 nameConnection_.dealloc();
528 foo_bar_set_name(o.get(), "change2");
529
530 EXPECT_EQ(list<string>{"change1"}, nameChanges_);
531}
532
499typedef pair<const char*, guint> GObjectMemoryMakeSharedTestParam;533typedef pair<const char*, guint> GObjectMemoryMakeSharedTestParam;
500534
501class GObjectMemoryMakeHelperMethodsTest: public testing::TestWithParam<GObjectMemoryMakeSharedTestParam>535class GObjectMemoryMakeHelperMethodsTest: public testing::TestWithParam<GObjectMemoryMakeSharedTestParam>
502536
=== added directory 'test/gtest/unity/util/GioMemory'
=== added file 'test/gtest/unity/util/GioMemory/CMakeLists.txt'
--- test/gtest/unity/util/GioMemory/CMakeLists.txt 1970-01-01 00:00:00 +0000
+++ test/gtest/unity/util/GioMemory/CMakeLists.txt 2017-04-04 09:34:42 +0000
@@ -0,0 +1,30 @@
1pkg_check_modules(GIO REQUIRED gio-2.0)
2pkg_check_modules(QDBUSTEST REQUIRED libqtdbustest-1)
3
4find_package(Qt5Core REQUIRED)
5find_package(Qt5DBus REQUIRED)
6
7include_directories(
8 ${Qt5Core_INCLUDE_DIRS}
9 ${Qt5DBus_INCLUDE_DIRS}
10 ${GIO_INCLUDE_DIRS}
11 ${QDBUSTEST_INCLUDE_DIRS}
12 )
13
14add_definitions(
15 -DQT_NO_KEYWORDS=1
16 )
17
18add_executable(GioMemory_test
19 GioMemory_test.cpp
20 )
21
22target_link_libraries(GioMemory_test
23 ${TESTLIBS}
24 ${GIO_LDFLAGS}
25 ${QDBUSTEST_LDFLAGS}
26 Qt5::Core
27 Qt5::DBus
28 )
29
30add_test(GioMemory_test GioMemory_test)
031
=== added file 'test/gtest/unity/util/GioMemory/GioMemory_test.cpp'
--- test/gtest/unity/util/GioMemory/GioMemory_test.cpp 1970-01-01 00:00:00 +0000
+++ test/gtest/unity/util/GioMemory/GioMemory_test.cpp 2017-04-04 09:34:42 +0000
@@ -0,0 +1,114 @@
1/*
2 * Copyright (C) 2017 Canonical Ltd.
3 *
4 * This program is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU Lesser General Public License version 3 as
6 * published by the Free Software Foundation.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU Lesser General Public License for more details.
12 *
13 * You should have received a copy of the GNU Lesser General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 *
16 * Authored by: Pete Woods <pete.woods@canonical.com>
17 */
18
19#include <unity/util/GioMemory.h>
20#include <unity/util/GlibMemory.h>
21#include <libqtdbustest/DBusTestRunner.h>
22#include <gtest/gtest.h>
23#include <list>
24#include <string>
25
26using namespace std;
27using namespace unity::util;
28using namespace QtDBusTest;
29
30namespace
31{
32
33class GioMemoryTest: public testing::Test
34{
35protected:
36 static void SetUpTestCase()
37 {
38 g_log_set_always_fatal((GLogLevelFlags) (G_LOG_LEVEL_CRITICAL | G_LOG_FLAG_FATAL));
39 }
40
41 static void on_dbus_signal(GDBusConnection *, const gchar *, const gchar *, const gchar *, const gchar *signal_name, GVariant *, gpointer user_data)
42 {
43 static_cast<GioMemoryTest*>(user_data)->onDbusSignal(signal_name);
44 }
45
46 void onDbusSignal(const gchar *signal_name)
47 {
48 signals_.emplace_back(signal_name);
49 g_main_loop_quit(mainloop_.get());
50 }
51
52 static gboolean on_timeout(gpointer user_data)
53 {
54 return static_cast<GioMemoryTest*>(user_data)->onTimeout();
55 }
56
57 gboolean onTimeout()
58 {
59 g_main_loop_quit(mainloop_.get());
60 return G_SOURCE_CONTINUE;
61 }
62
63 static GObjectSPtr<GDBusConnection> getSessionBus()
64 {
65 auto address = unique_glib(g_dbus_address_get_for_bus_sync(G_BUS_TYPE_SESSION, nullptr, nullptr));
66
67 auto bus = unique_gobject(
68 g_dbus_connection_new_for_address_sync(address.get(), (GDBusConnectionFlags) (G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT | G_DBUS_CONNECTION_FLAGS_MESSAGE_BUS_CONNECTION), nullptr,
69 nullptr, nullptr));
70
71 g_dbus_connection_set_exit_on_close(bus.get(), FALSE);
72
73 return bus;
74 }
75
76 DBusTestRunner dbusTestRunner;
77
78 GDBusSignalConnection signalConnection_;
79
80 GMainLoopSPtr mainloop_;
81
82 list<string> signals_;
83};
84
85
86TEST_F(GioMemoryTest, signals)
87{
88 mainloop_ = share_glib(g_main_loop_new(nullptr, false));
89
90 auto bus = getSessionBus();
91 ASSERT_TRUE(bool(bus));
92
93 signalConnection_ = gdbus_signal_connection(
94 g_dbus_connection_signal_subscribe(bus.get(), nullptr, "org.does.not.exist", nullptr, "/does/not/exist", nullptr, G_DBUS_SIGNAL_FLAGS_NONE, on_dbus_signal, this, nullptr), bus);
95
96 g_dbus_connection_emit_signal(bus.get(), nullptr, "/does/not/exist", "org.does.not.exist", "hello", nullptr, nullptr);
97 {
98 auto timer = g_source_manager(g_timeout_add(5000, on_timeout, this));
99 g_main_loop_run(mainloop_.get());
100 EXPECT_EQ(list<string>{"hello"}, signals_);
101 }
102 signals_.clear();
103
104 signalConnection_.dealloc();
105
106 g_dbus_connection_emit_signal(bus.get(), nullptr, "/does/not/exist", "org.does.not.exist", "hello", nullptr, nullptr);
107 {
108 auto timer = g_source_manager(g_timeout_add(5000, on_timeout, this));
109 g_main_loop_run(mainloop_.get());
110 EXPECT_TRUE(signals_.empty());
111 }
112}
113
114}
0115
=== modified file 'test/headers/CMakeLists.txt'
--- test/headers/CMakeLists.txt 2017-01-19 13:52:32 +0000
+++ test/headers/CMakeLists.txt 2017-04-04 09:34:42 +0000
@@ -11,6 +11,7 @@
11)11)
1212
13set(exclusions13set(exclusions
14 "GioMemory.h"
14 "GlibMemory.h"15 "GlibMemory.h"
15 "GObjectMemory.h"16 "GObjectMemory.h"
16)17)
1718
=== modified file 'test/headers/includechecker.py'
--- test/headers/includechecker.py 2017-01-19 13:52:32 +0000
+++ test/headers/includechecker.py 2017-04-04 09:34:42 +0000
@@ -38,6 +38,7 @@
38 'unity/shell': { 'Qt' }, # Anything under unity/shell can include anything starting with Qt38 'unity/shell': { 'Qt' }, # Anything under unity/shell can include anything starting with Qt
39 'unity/util/GObjectMemory': { 'glib' }, # The unity/util/GObjectMemory header can include anything starting with glib39 'unity/util/GObjectMemory': { 'glib' }, # The unity/util/GObjectMemory header can include anything starting with glib
40 'unity/util/GlibMemory': { 'glib' }, # The unity/util/GlibMemory header can include anything starting with glib40 'unity/util/GlibMemory': { 'glib' }, # The unity/util/GlibMemory header can include anything starting with glib
41 'unity/util/GioMemory': { 'glib' }, # The unity/util/GioMemory header can include anything starting with glib
41}42}
4243
43def check_file(filename, permitted_includes):44def check_file(filename, permitted_includes):

Subscribers

People subscribed via source and target branches

to all changes: