From 815b436c0ab334604db4c1fc57f91a37e3f72132 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Wed, 13 May 2015 13:53:23 +0200 Subject: [PATCH 1/9] trivial: add comment to valgrind suppression file --- valgrind.suppressions | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/valgrind.suppressions b/valgrind.suppressions index d3f15d9b7e..ffc4b6e0a6 100644 --- a/valgrind.suppressions +++ b/valgrind.suppressions @@ -395,6 +395,11 @@ fun:g_dbus_proxy_finalize ... } + +############################################################### +# libnl3 +############################################################### + { libnl_01 Memcheck:Leak From 8e2ad8a3bd30d6e20486d718cd651ade32c47cc6 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 11 May 2015 22:54:48 +0200 Subject: [PATCH 2/9] valgrind: add libnl suppression Add a comment about the upstream bug that fixes the suppressed memleak in libnl. Also, add a different backtrace for the same bug. It currently doesn't hit easily, because we don't call nl_msg_parse() often. In the future we will though. --- valgrind.suppressions | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/valgrind.suppressions b/valgrind.suppressions index ffc4b6e0a6..5f89c98b1e 100644 --- a/valgrind.suppressions +++ b/valgrind.suppressions @@ -417,7 +417,8 @@ ... } { - libnl_02 + # fixed by https://github.com/thom311/libnl/commit/d65c32a7205e679c7fc13f0e4565b13e698ba906 + libnl_rtnl_link_set_type_01 Memcheck:Leak match-leak-kinds: definite fun:calloc @@ -434,7 +435,21 @@ ... } { - libnl_03 + # fixed by https://github.com/thom311/libnl/commit/d65c32a7205e679c7fc13f0e4565b13e698ba906 + # Same issue as libnl_rtnl_link_set_type_01, but different backtrace by calling nl_msg_parse(). + libnl_rtnl_link_set_type_02 + Memcheck:Leak + match-leak-kinds: definite + fun:calloc + fun:vlan_alloc + fun:rtnl_link_set_type + fun:link_msg_parser + fun:nl_cache_parse + fun:nl_msg_parse + ... +} +{ + libnl_rtnl_link_alloc_cache Memcheck:Leak match-leak-kinds: definite fun:calloc From 0c258402c72cf691cf24d0955d2b98a8675cd62a Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Wed, 13 May 2015 13:54:08 +0200 Subject: [PATCH 3/9] platform: fix memleak in link_delete() Turns out, the valgrind suppression was hiding a memleak --- src/platform/nm-linux-platform.c | 2 +- valgrind.suppressions | 16 ---------------- 2 files changed, 1 insertion(+), 17 deletions(-) diff --git a/src/platform/nm-linux-platform.c b/src/platform/nm-linux-platform.c index 7f700c2b32..5b9a33f1b8 100644 --- a/src/platform/nm-linux-platform.c +++ b/src/platform/nm-linux-platform.c @@ -2516,7 +2516,7 @@ static gboolean link_delete (NMPlatform *platform, int ifindex) { NMLinuxPlatformPrivate *priv = NM_LINUX_PLATFORM_GET_PRIVATE (platform); - struct rtnl_link *rtnllink = rtnl_link_get (priv->link_cache, ifindex); + auto_nl_object struct rtnl_link *rtnllink = rtnl_link_get (priv->link_cache, ifindex); if (!rtnllink) { platform->error = NM_PLATFORM_ERROR_NOT_FOUND; diff --git a/valgrind.suppressions b/valgrind.suppressions index 5f89c98b1e..b0d5301512 100644 --- a/valgrind.suppressions +++ b/valgrind.suppressions @@ -400,22 +400,6 @@ # libnl3 ############################################################### -{ - libnl_01 - Memcheck:Leak - match-leak-kinds: definite - fun:calloc - fun:nl_object_alloc - fun:link_msg_parser - fun:__pickup_answer - fun:nl_cb_call - fun:recvmsgs - fun:nl_recvmsgs_report - fun:nl_recvmsgs - fun:nl_pickup - fun:rtnl_link_get_kernel - ... -} { # fixed by https://github.com/thom311/libnl/commit/d65c32a7205e679c7fc13f0e4565b13e698ba906 libnl_rtnl_link_set_type_01 From bde42e78db459795559ef6fcdc5a8fe4a03db0cc Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Wed, 13 May 2015 14:06:03 +0200 Subject: [PATCH 4/9] valgrind: disable suppression for libnl Not sure why (and whether!) this is really needed. Disable it for now, resurrect it later if need be. --- valgrind.suppressions | 43 ++++++++++++++++++++++++------------------- 1 file changed, 24 insertions(+), 19 deletions(-) diff --git a/valgrind.suppressions b/valgrind.suppressions index b0d5301512..1368a6041f 100644 --- a/valgrind.suppressions +++ b/valgrind.suppressions @@ -432,23 +432,28 @@ fun:nl_msg_parse ... } -{ - libnl_rtnl_link_alloc_cache - Memcheck:Leak - match-leak-kinds: definite - fun:calloc - fun:nl_object_alloc - fun:link_msg_parser - fun:nl_cache_parse - fun:update_msg_parser - fun:nl_cb_call - fun:recvmsgs - fun:nl_recvmsgs_report - fun:nl_recvmsgs - fun:__cache_pickup - fun:nl_cache_pickup - fun:nl_cache_refill - fun:rtnl_link_alloc_cache - ... -} + +# disable the following suppression. I cannot remember why it was needed, +# maybe it's wrong. +# +# { +# libnl_02 +# libnl_rtnl_link_alloc_cache +# Memcheck:Leak +# match-leak-kinds: definite +# fun:calloc +# fun:nl_object_alloc +# fun:link_msg_parser +# fun:nl_cache_parse +# fun:update_msg_parser +# fun:nl_cb_call +# fun:recvmsgs +# fun:nl_recvmsgs_report +# fun:nl_recvmsgs +# fun:__cache_pickup +# fun:nl_cache_pickup +# fun:nl_cache_refill +# fun:rtnl_link_alloc_cache +# ... +# } From f167346534f98a803a6a7fd6e274cd1d07479f18 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sun, 3 May 2015 16:37:07 +0200 Subject: [PATCH 5/9] platform: fix nm_platform_link_cmp() to consider ifindex --- src/platform/nm-platform.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/platform/nm-platform.c b/src/platform/nm-platform.c index a02423ddeb..5cb285c8a7 100644 --- a/src/platform/nm-platform.c +++ b/src/platform/nm-platform.c @@ -2767,6 +2767,7 @@ int nm_platform_link_cmp (const NMPlatformLink *a, const NMPlatformLink *b) { _CMP_POINTER (a, b); + _CMP_FIELD (a, b, ifindex); _CMP_FIELD (a, b, type); _CMP_FIELD_STR (a, b, name); _CMP_FIELD (a, b, master); From d8d0c481b8d1ad5e9599994c5e8f8fa83657ce5c Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 4 May 2015 15:10:27 +0200 Subject: [PATCH 6/9] test: fix wrong use of memcmp() in nmtst_platform_ip4_routes_equal() And nmtst_platform_ip6_routes_equal(). As already indicated by the comment, using memcmp() doesn't really work here. It worked up to now, because the NMPlatformIP4Route structure has no padding at the end. If we would have a last 'guint8' member (as we will add later), initializing an arry of routes on the stack would not clear the bytes from the padding and the comparison using memcmp() would fail. --- include/nm-test-utils.h | 6 ------ 1 file changed, 6 deletions(-) diff --git a/include/nm-test-utils.h b/include/nm-test-utils.h index 04c5d5f1c5..94040c12c3 100644 --- a/include/nm-test-utils.h +++ b/include/nm-test-utils.h @@ -832,9 +832,6 @@ nmtst_platform_ip4_routes_equal (const NMPlatformIP4Route *a, const NMPlatformIP nmtst_static_1024_02 (nm_platform_ip4_route_to_string (&b[i]))); g_assert_not_reached (); } - - /* also check with memcmp, though this might fail for valid programs (due to field alignment) */ - g_assert_cmpint (memcmp (&a[i], &b[i], sizeof (a[i])), ==, 0); } } @@ -867,9 +864,6 @@ nmtst_platform_ip6_routes_equal (const NMPlatformIP6Route *a, const NMPlatformIP nmtst_static_1024_02 (nm_platform_ip6_route_to_string (&b[i]))); g_assert_not_reached (); } - - /* also check with memcmp, though this might fail for valid programs (due to field alignment) */ - g_assert_cmpint (memcmp (&a[i], &b[i], sizeof (a[i])), ==, 0); } } From 4bdd83127d28f422d23b15ef0ccb65522c7e2b0c Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 4 May 2015 15:38:28 +0200 Subject: [PATCH 7/9] route-manager/test: fix missing initialization of temporary variables on stack Up to now, this code was correct. Later we will add another field to NMPlatformIP4Route which causes the test to operate on uninitialized data. Instead of explicitly initializing the field, just clear the whole struct. --- src/tests/test-route-manager.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/tests/test-route-manager.c b/src/tests/test-route-manager.c index f7b37a3b4a..c7b60e68e0 100644 --- a/src/tests/test-route-manager.c +++ b/src/tests/test-route-manager.c @@ -39,7 +39,7 @@ static void setup_dev0_ip4 (int ifindex, guint mss_of_first_route, guint32 metric_of_second_route) { GArray *routes = g_array_new (FALSE, FALSE, sizeof (NMPlatformIP4Route)); - NMPlatformIP4Route route; + NMPlatformIP4Route route = { 0 }; route.ifindex = ifindex; route.mss = 0; @@ -68,7 +68,7 @@ static void setup_dev1_ip4 (int ifindex) { GArray *routes = g_array_new (FALSE, FALSE, sizeof (NMPlatformIP4Route)); - NMPlatformIP4Route route; + NMPlatformIP4Route route = { 0 }; route.ifindex = ifindex; route.mss = 0; @@ -114,7 +114,7 @@ static void update_dev0_ip4 (int ifindex) { GArray *routes = g_array_new (FALSE, FALSE, sizeof (NMPlatformIP4Route)); - NMPlatformIP4Route route; + NMPlatformIP4Route route = { 0 }; route.ifindex = ifindex; route.mss = 0; From 050c644cce110bef4f48499498e2b6192dca7040 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 4 May 2015 19:26:36 +0200 Subject: [PATCH 8/9] platform/test: make asserting signals more flexible Support accepting more then one signal at a time. It is to be expected, that one change in platform raises several signals. Extend the assertion helpers to express that. --- src/platform/tests/test-address.c | 12 ++++------- src/platform/tests/test-common.c | 34 ++++++++++++++++++++++--------- src/platform/tests/test-common.h | 4 +++- src/platform/tests/test-route.c | 16 ++++++--------- 4 files changed, 37 insertions(+), 29 deletions(-) diff --git a/src/platform/tests/test-address.c b/src/platform/tests/test-address.c index e7b0a47388..c3bc0dcb2b 100644 --- a/src/platform/tests/test-address.c +++ b/src/platform/tests/test-address.c @@ -24,10 +24,8 @@ ip4_address_callback (NMPlatform *platform, int ifindex, NMPlatformIP4Address *r if (data->loop) g_main_loop_quit (data->loop); - if (data->received) - g_error ("Received signal '%s' a second time.", data->name); - - data->received = TRUE; + data->received_count++; + debug ("Received signal '%s' %dth time.", data->name, data->received_count); } static void @@ -46,10 +44,8 @@ ip6_address_callback (NMPlatform *platform, int ifindex, NMPlatformIP6Address *r if (data->loop) g_main_loop_quit (data->loop); - if (data->received) - g_error ("Received signal '%s' a second time.", data->name); - - data->received = TRUE; + data->received_count++; + debug ("Received signal '%s' %dth time.", data->name, data->received_count); } static void diff --git a/src/platform/tests/test-common.c b/src/platform/tests/test-common.c index aced280575..6353cfa5dc 100644 --- a/src/platform/tests/test-common.c +++ b/src/platform/tests/test-common.c @@ -23,7 +23,7 @@ add_signal_full (const char *name, NMPlatformSignalChangeType change_type, GCall data->name = name; data->change_type = change_type; - data->received = FALSE; + data->received_count = 0; data->handler_id = g_signal_connect (nm_platform_get (), name, callback, data); data->ifindex = ifindex; data->ifname = ifname; @@ -52,16 +52,33 @@ void accept_signal (SignalData *data) { debug ("Accepting signal '%s-%s' ifindex %d ifname %s.", data->name, _change_type_to_string (data->change_type), data->ifindex, data->ifname); - if (!data->received) + if (data->received_count == 0) g_error ("Attemted to accept a non-received signal '%s-%s'.", data->name, _change_type_to_string (data->change_type)); + if (data->received_count != 1) + g_error ("Signal already received %d times: '%s-%s'.", data->received_count, data->name, _change_type_to_string (data->change_type)); - data->received = FALSE; + data->received_count = 0; +} + +void +accept_signals (SignalData *data, int min, int max) +{ + if (data->received_count < min || data->received_count > max) + g_error ("Expect [%d,%d] signals, but %s signals queued -- '%s-%s' ifindex %d ifname %s.", min, max, data->received_count, data->name, _change_type_to_string (data->change_type), data->ifindex, data->ifname); + data->received_count = 0; +} + +void +ensure_no_signal (SignalData *data) +{ + if (data->received_count > 0) + g_error ("Unepexted signal '%s-%s'.", data->name, _change_type_to_string (data->change_type)); } void wait_signal (SignalData *data) { - if (data->received) + if (data->received_count) g_error ("Signal '%s' received before waiting for it.", data->name); data->loop = g_main_loop_new (NULL, FALSE); @@ -74,7 +91,7 @@ wait_signal (SignalData *data) void free_signal (SignalData *data) { - if (data->received) + if (data->received_count != 0) g_error ("Attempted to free received but not accepted signal '%s-%s'.", data->name, _change_type_to_string (data->change_type)); g_signal_handler_disconnect (nm_platform_get (), data->handler_id); @@ -106,11 +123,8 @@ link_callback (NMPlatform *platform, int ifindex, NMPlatformLink *received, NMPl g_main_loop_quit (data->loop); } - if (data->received) - g_error ("Received signal '%s-%s' a second time.", data->name, _change_type_to_string (data->change_type)); - - debug ("Received signal '%s-%s' ifindex %d ifname '%s'.", data->name, _change_type_to_string (data->change_type), ifindex, received->name); - data->received = TRUE; + data->received_count++; + debug ("Received signal '%s-%s' ifindex %d ifname '%s' %dth time.", data->name, _change_type_to_string (data->change_type), ifindex, received->name, data->received_count); if (change_type == NM_PLATFORM_SIGNAL_REMOVED) g_assert (!nm_platform_link_get_name (NM_PLATFORM_GET, ifindex)); diff --git a/src/platform/tests/test-common.h b/src/platform/tests/test-common.h index 5a9a86b15a..b0f9ca21fb 100644 --- a/src/platform/tests/test-common.h +++ b/src/platform/tests/test-common.h @@ -22,7 +22,7 @@ typedef struct { int handler_id; const char *name; NMPlatformSignalChangeType change_type; - gboolean received; + gint received_count; GMainLoop *loop; int ifindex; const char *ifname; @@ -35,7 +35,9 @@ SignalData *add_signal_full (const char *name, NMPlatformSignalChangeType change #define add_signal_ifindex(name, change_type, callback, ifindex) add_signal_full (name, change_type, (GCallback) callback, ifindex, NULL) #define add_signal_ifname(name, change_type, callback, ifname) add_signal_full (name, change_type, (GCallback) callback, 0, ifname) void accept_signal (SignalData *data); +void accept_signals (SignalData *data, int min, int max); void wait_signal (SignalData *data); +void ensure_no_signal (SignalData *data); void free_signal (SignalData *data); gboolean ip4_route_exists (const char *ifname, guint32 network, int plen, guint32 metric); diff --git a/src/platform/tests/test-route.c b/src/platform/tests/test-route.c index dcc74d9621..70bd1a1040 100644 --- a/src/platform/tests/test-route.c +++ b/src/platform/tests/test-route.c @@ -22,10 +22,8 @@ ip4_route_callback (NMPlatform *platform, int ifindex, NMPlatformIP4Route *recei if (data->loop) g_main_loop_quit (data->loop); - if (data->received) - g_error ("Received signal '%s' a second time.", data->name); - - data->received = TRUE; + data->received_count++; + debug ("Received signal '%s' %dth time.", data->name, data->received_count); } static void @@ -44,10 +42,8 @@ ip6_route_callback (NMPlatform *platform, int ifindex, NMPlatformIP6Route *recei if (data->loop) g_main_loop_quit (data->loop); - if (data->received) - g_error ("Received signal '%s' a second time.", data->name); - - data->received = TRUE; + data->received_count++; + debug ("Received signal '%s' %dth time.", data->name, data->received_count); } static void @@ -77,7 +73,7 @@ test_ip4_route_metric0 (void) /* Deleting route with metric 0 does nothing */ g_assert (nm_platform_ip4_route_delete (NM_PLATFORM_GET, ifindex, network, plen, 0)); no_error (); - g_assert (!route_removed->received); + ensure_no_signal (route_removed); assert_ip4_route_exists (FALSE, DEVICE_NAME, network, plen, 0); assert_ip4_route_exists (TRUE, DEVICE_NAME, network, plen, metric); @@ -101,7 +97,7 @@ test_ip4_route_metric0 (void) /* Delete route with metric 0 again (we expect nothing to happen) */ g_assert (nm_platform_ip4_route_delete (NM_PLATFORM_GET, ifindex, network, plen, 0)); no_error (); - g_assert (!route_removed->received); + ensure_no_signal (route_removed); assert_ip4_route_exists (FALSE, DEVICE_NAME, network, plen, 0); assert_ip4_route_exists (TRUE, DEVICE_NAME, network, plen, metric); From 500cbcba21a2602bcb172f6a5cd9b13780cd18f0 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 4 May 2015 19:26:36 +0200 Subject: [PATCH 9/9] platform/test: include call location in signal assertions Hard to debug failures, if we don't print where the failure happens. --- src/platform/tests/test-common.c | 35 +++++++++++++++++--------------- src/platform/tests/test-common.h | 15 +++++++++----- 2 files changed, 29 insertions(+), 21 deletions(-) diff --git a/src/platform/tests/test-common.c b/src/platform/tests/test-common.c index 6353cfa5dc..2d37fb837d 100644 --- a/src/platform/tests/test-common.c +++ b/src/platform/tests/test-common.c @@ -7,6 +7,9 @@ #include "nm-test-utils.h" +#define SIGNAL_DATA_FMT "'%s-%s' ifindex %d%s%s%s (%d times received)" +#define SIGNAL_DATA_ARG(data) (data)->name, _change_type_to_string ((data)->change_type), (data)->ifindex, (data)->ifname ? " ifname '" : "", (data)->ifname ? (data)->ifname : "", (data)->ifname ? "'" : "", (data)->received_count + gboolean nmtst_platform_is_root_test () @@ -49,50 +52,51 @@ _change_type_to_string (NMPlatformSignalChangeType change_type) } void -accept_signal (SignalData *data) +_accept_signal (const char *file, int line, const char *func, SignalData *data) { - debug ("Accepting signal '%s-%s' ifindex %d ifname %s.", data->name, _change_type_to_string (data->change_type), data->ifindex, data->ifname); - if (data->received_count == 0) - g_error ("Attemted to accept a non-received signal '%s-%s'.", data->name, _change_type_to_string (data->change_type)); + debug ("NMPlatformSignalAssert: %s:%d, %s(): Accepting signal one time: "SIGNAL_DATA_FMT, file, line, func, SIGNAL_DATA_ARG (data)); if (data->received_count != 1) - g_error ("Signal already received %d times: '%s-%s'.", data->received_count, data->name, _change_type_to_string (data->change_type)); - + g_error ("NMPlatformSignalAssert: %s:%d, %s(): failure to accept signal one time: "SIGNAL_DATA_FMT, file, line, func, SIGNAL_DATA_ARG (data)); data->received_count = 0; } void -accept_signals (SignalData *data, int min, int max) +_accept_signals (const char *file, int line, const char *func, SignalData *data, int min, int max) { + debug ("NMPlatformSignalAssert: %s:%d, %s(): Accepting signal [%d,%d] times: "SIGNAL_DATA_FMT, file, line, func, min, max, SIGNAL_DATA_ARG (data)); if (data->received_count < min || data->received_count > max) - g_error ("Expect [%d,%d] signals, but %s signals queued -- '%s-%s' ifindex %d ifname %s.", min, max, data->received_count, data->name, _change_type_to_string (data->change_type), data->ifindex, data->ifname); + g_error ("NMPlatformSignalAssert: %s:%d, %s(): failure to accept signal [%d,%d] times: "SIGNAL_DATA_FMT, file, line, func, min, max, SIGNAL_DATA_ARG (data)); data->received_count = 0; } void -ensure_no_signal (SignalData *data) +_ensure_no_signal (const char *file, int line, const char *func, SignalData *data) { + debug ("NMPlatformSignalAssert: %s:%d, %s(): Accepting signal 0 times: "SIGNAL_DATA_FMT, file, line, func, SIGNAL_DATA_ARG (data)); if (data->received_count > 0) - g_error ("Unepexted signal '%s-%s'.", data->name, _change_type_to_string (data->change_type)); + g_error ("NMPlatformSignalAssert: %s:%d, %s(): failure to accept signal 0 times: "SIGNAL_DATA_FMT, file, line, func, SIGNAL_DATA_ARG (data)); } void -wait_signal (SignalData *data) +_wait_signal (const char *file, int line, const char *func, SignalData *data) { + debug ("NMPlatformSignalAssert: %s:%d, %s(): wait signal: "SIGNAL_DATA_FMT, file, line, func, SIGNAL_DATA_ARG (data)); if (data->received_count) - g_error ("Signal '%s' received before waiting for it.", data->name); + g_error ("NMPlatformSignalAssert: %s:%d, %s(): failure to wait for signal: "SIGNAL_DATA_FMT, file, line, func, SIGNAL_DATA_ARG (data)); data->loop = g_main_loop_new (NULL, FALSE); g_main_loop_run (data->loop); g_clear_pointer (&data->loop, g_main_loop_unref); - accept_signal (data); + _accept_signal (file, line, func, data); } void -free_signal (SignalData *data) +_free_signal (const char *file, int line, const char *func, SignalData *data) { + debug ("NMPlatformSignalAssert: %s:%d, %s(): free signal: "SIGNAL_DATA_FMT, file, line, func, SIGNAL_DATA_ARG (data)); if (data->received_count != 0) - g_error ("Attempted to free received but not accepted signal '%s-%s'.", data->name, _change_type_to_string (data->change_type)); + g_error ("NMPlatformSignalAssert: %s:%d, %s(): failure to free non-accepted signal: "SIGNAL_DATA_FMT, file, line, func, SIGNAL_DATA_ARG (data)); g_signal_handler_disconnect (nm_platform_get (), data->handler_id); g_free (data); @@ -101,7 +105,6 @@ free_signal (SignalData *data) void link_callback (NMPlatform *platform, int ifindex, NMPlatformLink *received, NMPlatformSignalChangeType change_type, NMPlatformReason reason, SignalData *data) { - GArray *links; NMPlatformLink *cached; int i; diff --git a/src/platform/tests/test-common.h b/src/platform/tests/test-common.h index b0f9ca21fb..56e27f6581 100644 --- a/src/platform/tests/test-common.h +++ b/src/platform/tests/test-common.h @@ -34,11 +34,16 @@ SignalData *add_signal_full (const char *name, NMPlatformSignalChangeType change #define add_signal(name, change_type, callback) add_signal_full (name, change_type, (GCallback) callback, 0, NULL) #define add_signal_ifindex(name, change_type, callback, ifindex) add_signal_full (name, change_type, (GCallback) callback, ifindex, NULL) #define add_signal_ifname(name, change_type, callback, ifname) add_signal_full (name, change_type, (GCallback) callback, 0, ifname) -void accept_signal (SignalData *data); -void accept_signals (SignalData *data, int min, int max); -void wait_signal (SignalData *data); -void ensure_no_signal (SignalData *data); -void free_signal (SignalData *data); +void _accept_signal (const char *file, int line, const char *func, SignalData *data); +void _accept_signals (const char *file, int line, const char *func, SignalData *data, int min, int max); +void _wait_signal (const char *file, int line, const char *func, SignalData *data); +void _ensure_no_signal (const char *file, int line, const char *func, SignalData *data); +void _free_signal (const char *file, int line, const char *func, SignalData *data); +#define accept_signal(data) _accept_signal(__FILE__, __LINE__, G_STRFUNC, data) +#define accept_signals(data, min, max) _accept_signals(__FILE__, __LINE__, G_STRFUNC, data, min, max) +#define wait_signal(data) _wait_signal(__FILE__, __LINE__, G_STRFUNC, data) +#define ensure_no_signal(data) _ensure_no_signal(__FILE__, __LINE__, G_STRFUNC, data) +#define free_signal(data) _free_signal(__FILE__, __LINE__, G_STRFUNC, data) gboolean ip4_route_exists (const char *ifname, guint32 network, int plen, guint32 metric);