mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2026-02-07 18:00:30 +01:00
platform: emit signals by signal-id instead of string
We potentially emit a lot of signals. Don't look up the signal by name because that adds quite some additional overhead, like peeking for a GQuark. Instead pass the numeric signal-id directly.
This commit is contained in:
parent
510e53ca16
commit
832539a511
5 changed files with 54 additions and 25 deletions
|
|
@ -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);
|
||||
}
|
||||
|
||||
/******************************************************************/
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue