diff --git a/src/platform/nm-linux-platform.c b/src/platform/nm-linux-platform.c index 287cf135a8..b79aa76767 100644 --- a/src/platform/nm-linux-platform.c +++ b/src/platform/nm-linux-platform.c @@ -2310,7 +2310,13 @@ do_emit_signal (NMPlatform *platform, const NMPObject *obj, NMPCacheOpsType cach /* don't expose @obj directly, but clone the public fields. A signal handler might * call back into NMPlatform which could invalidate (or modify) @obj. */ memcpy (&obj_clone.object, &obj->object, klass->sizeof_public); - g_signal_emit_by_name (platform, klass->signal_type, klass->obj_type, obj_clone.object.ifindex, &obj_clone.object, (NMPlatformSignalChangeType) cache_op); + g_signal_emit (platform, + _nm_platform_signal_id_get (klass->signal_type_id), + 0, + klass->obj_type, + obj_clone.object.ifindex, + &obj_clone.object, + (NMPlatformSignalChangeType) cache_op); } /******************************************************************/ diff --git a/src/platform/nm-platform.c b/src/platform/nm-platform.c index 9250d19061..bb82ab0959 100644 --- a/src/platform/nm-platform.c +++ b/src/platform/nm-platform.c @@ -77,17 +77,7 @@ G_STATIC_ASSERT (G_STRUCT_OFFSET (NMPlatformIPRoute, network_ptr) == G_STRUCT_OF G_DEFINE_TYPE (NMPlatform, nm_platform, G_TYPE_OBJECT) -/* NMPlatform signals */ -enum { - SIGNAL_LINK_CHANGED, - SIGNAL_IP4_ADDRESS_CHANGED, - SIGNAL_IP6_ADDRESS_CHANGED, - SIGNAL_IP4_ROUTE_CHANGED, - SIGNAL_IP6_ROUTE_CHANGED, - LAST_SIGNAL -}; - -static guint signals[LAST_SIGNAL] = { 0 }; +static guint signals[_NM_PLATFORM_SIGNAL_ID_LAST] = { 0 }; enum { PROP_0, @@ -101,6 +91,18 @@ typedef struct { /******************************************************************/ +guint +_nm_platform_signal_id_get (NMPlatformSignalIdType signal_type) +{ + nm_assert ( signal_type > 0 + && signal_type != NM_PLATFORM_SIGNAL_ID_NONE + && signal_type < _NM_PLATFORM_SIGNAL_ID_LAST); + + return signals[signal_type]; +} + +/******************************************************************/ + /* Singleton NMPlatform subclass instance and cached class object */ NM_DEFINE_SINGLETON_INSTANCE (NMPlatform); @@ -3697,14 +3699,6 @@ nm_platform_init (NMPlatform *object) { } -#define SIGNAL(signal_id, method) signals[signal_id] = \ - g_signal_new_class_handler (NM_PLATFORM_ ## signal_id, \ - G_OBJECT_CLASS_TYPE (object_class), \ - G_SIGNAL_RUN_FIRST, \ - G_CALLBACK (method), \ - NULL, NULL, NULL, \ - G_TYPE_NONE, 4, NM_TYPE_POBJECT_TYPE, G_TYPE_INT, G_TYPE_POINTER, NM_TYPE_PLATFORM_SIGNAL_CHANGE_TYPE); - static void nm_platform_class_init (NMPlatformClass *platform_class) { @@ -3725,10 +3719,21 @@ nm_platform_class_init (NMPlatformClass *platform_class) G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); +#define SIGNAL(signal, signal_id, method) \ + G_STMT_START { \ + signals[signal] = \ + g_signal_new_class_handler (""signal_id"", \ + G_OBJECT_CLASS_TYPE (object_class), \ + G_SIGNAL_RUN_FIRST, \ + G_CALLBACK (method), \ + NULL, NULL, NULL, \ + G_TYPE_NONE, 4, NM_TYPE_POBJECT_TYPE, G_TYPE_INT, G_TYPE_POINTER, NM_TYPE_PLATFORM_SIGNAL_CHANGE_TYPE); \ + } G_STMT_END + /* Signals */ - SIGNAL (SIGNAL_LINK_CHANGED, log_link) - SIGNAL (SIGNAL_IP4_ADDRESS_CHANGED, log_ip4_address) - SIGNAL (SIGNAL_IP6_ADDRESS_CHANGED, log_ip6_address) - SIGNAL (SIGNAL_IP4_ROUTE_CHANGED, log_ip4_route) - SIGNAL (SIGNAL_IP6_ROUTE_CHANGED, log_ip6_route) + SIGNAL (NM_PLATFORM_SIGNAL_ID_LINK, NM_PLATFORM_SIGNAL_LINK_CHANGED, log_link); + SIGNAL (NM_PLATFORM_SIGNAL_ID_IP4_ADDRESS, NM_PLATFORM_SIGNAL_IP4_ADDRESS_CHANGED, log_ip4_address); + SIGNAL (NM_PLATFORM_SIGNAL_ID_IP6_ADDRESS, NM_PLATFORM_SIGNAL_IP6_ADDRESS_CHANGED, log_ip6_address); + SIGNAL (NM_PLATFORM_SIGNAL_ID_IP4_ROUTE, NM_PLATFORM_SIGNAL_IP4_ROUTE_CHANGED, log_ip4_route); + SIGNAL (NM_PLATFORM_SIGNAL_ID_IP6_ROUTE, NM_PLATFORM_SIGNAL_IP6_ROUTE_CHANGED, log_ip6_route); } diff --git a/src/platform/nm-platform.h b/src/platform/nm-platform.h index 7ca27e254b..00029b3aeb 100644 --- a/src/platform/nm-platform.h +++ b/src/platform/nm-platform.h @@ -153,6 +153,18 @@ struct _NMPlatformLink { guint mtu; }; +typedef enum { /*< skip >*/ + NM_PLATFORM_SIGNAL_ID_NONE, + NM_PLATFORM_SIGNAL_ID_LINK, + NM_PLATFORM_SIGNAL_ID_IP4_ADDRESS, + NM_PLATFORM_SIGNAL_ID_IP6_ADDRESS, + NM_PLATFORM_SIGNAL_ID_IP4_ROUTE, + NM_PLATFORM_SIGNAL_ID_IP6_ROUTE, + _NM_PLATFORM_SIGNAL_ID_LAST, +} NMPlatformSignalIdType; + +guint _nm_platform_signal_id_get (NMPlatformSignalIdType signal_type); + typedef enum { NM_PLATFORM_SIGNAL_NONE, NM_PLATFORM_SIGNAL_ADDED, diff --git a/src/platform/nmp-object.c b/src/platform/nmp-object.c index 2264c9cd62..ef467f4241 100644 --- a/src/platform/nmp-object.c +++ b/src/platform/nmp-object.c @@ -1931,6 +1931,7 @@ const NMPClass _nmp_classes[NMP_OBJECT_TYPE_MAX] = { .obj_type_name = "link", .addr_family = AF_UNSPEC, .rtm_gettype = RTM_GETLINK, + .signal_type_id = NM_PLATFORM_SIGNAL_ID_LINK, .signal_type = NM_PLATFORM_SIGNAL_LINK_CHANGED, .cmd_obj_cmp = _vt_cmd_obj_cmp_link, .cmd_obj_copy = _vt_cmd_obj_copy_link, @@ -1953,6 +1954,7 @@ const NMPClass _nmp_classes[NMP_OBJECT_TYPE_MAX] = { .obj_type_name = "ip4-address", .addr_family = AF_INET, .rtm_gettype = RTM_GETADDR, + .signal_type_id = NM_PLATFORM_SIGNAL_ID_IP4_ADDRESS, .signal_type = NM_PLATFORM_SIGNAL_IP4_ADDRESS_CHANGED, .cmd_obj_init_cache_id = _vt_cmd_obj_init_cache_id_ipx_address, .cmd_obj_stackinit_id = _vt_cmd_obj_stackinit_id_ip4_address, @@ -1972,6 +1974,7 @@ const NMPClass _nmp_classes[NMP_OBJECT_TYPE_MAX] = { .obj_type_name = "ip6-address", .addr_family = AF_INET6, .rtm_gettype = RTM_GETADDR, + .signal_type_id = NM_PLATFORM_SIGNAL_ID_IP6_ADDRESS, .signal_type = NM_PLATFORM_SIGNAL_IP6_ADDRESS_CHANGED, .cmd_obj_init_cache_id = _vt_cmd_obj_init_cache_id_ipx_address, .cmd_obj_stackinit_id = _vt_cmd_obj_stackinit_id_ip6_address, @@ -1991,6 +1994,7 @@ const NMPClass _nmp_classes[NMP_OBJECT_TYPE_MAX] = { .obj_type_name = "ip4-route", .addr_family = AF_INET, .rtm_gettype = RTM_GETROUTE, + .signal_type_id = NM_PLATFORM_SIGNAL_ID_IP4_ROUTE, .signal_type = NM_PLATFORM_SIGNAL_IP4_ROUTE_CHANGED, .cmd_obj_init_cache_id = _vt_cmd_obj_init_cache_id_ipx_route, .cmd_obj_stackinit_id = _vt_cmd_obj_stackinit_id_ip4_route, @@ -2010,6 +2014,7 @@ const NMPClass _nmp_classes[NMP_OBJECT_TYPE_MAX] = { .obj_type_name = "ip6-route", .addr_family = AF_INET6, .rtm_gettype = RTM_GETROUTE, + .signal_type_id = NM_PLATFORM_SIGNAL_ID_IP6_ROUTE, .signal_type = NM_PLATFORM_SIGNAL_IP6_ROUTE_CHANGED, .cmd_obj_init_cache_id = _vt_cmd_obj_init_cache_id_ipx_route, .cmd_obj_stackinit_id = _vt_cmd_obj_stackinit_id_ip6_route, diff --git a/src/platform/nmp-object.h b/src/platform/nmp-object.h index 7de44895e6..971bd37eca 100644 --- a/src/platform/nmp-object.h +++ b/src/platform/nmp-object.h @@ -116,6 +116,7 @@ typedef struct { int rtm_gettype; int sizeof_data; int sizeof_public; + NMPlatformSignalIdType signal_type_id; const char *obj_type_name; const char *signal_type;