NetworkManager/src/libnm-client-impl
Thomas Haller 71454ae4cd
libnm: make ref counting of immutable types thread safe
The types NMBridgeVlan, NMIPRoutingRule, NMRange, NMWireGuardPeer
are immutable (or immutable, after the seal() function is called).

Immutable types are great, as it means a reference to them can be shared
without doing a full clone. Hence the G_DEFINE_BOXED_TYPE() for these
types prefers to take a reference instead of cloning the objects. Except
for sealable types, where it will prefer to clone unsealed values.
Likewise, nm_simple_connection_new_clone() probably will just take
another reference to the value, instead of doing a deep clone.

libnm is not a thread-safe library in the sense that you could pass a
NMConnection or NMClient instance to multiple threads and access them
without your own synchronization. However, it should be possible that
multiple threads access (seemingly) distinct objects.

As the copy function of these boxed types (and nm_simple_connection_new_clone()
and similar) prefers to share the references to immutable types, it is important
that the ref function is thread-safe too. Otherwise you cannot just clone a
NMConnection on thread1, hand the clone to thread2 and operate on the
clone and the original independently. If you do before this patch, you would
hit a subtle race condition.

Avoid that. While atomic operations have a runtime overhead, being safe
is more important. Also, we already save a full malloc()/free() by
having immutable, ref-counted types. We just need to make it safe to use
in order to fully benefit from it.
2022-12-20 10:35:02 +01:00
..
tests clang-format: reformat code with clang-format 15.0.4-1.fc37 2022-11-23 09:17:21 +01:00
libnm.pc.in libnm.pc: plugindir & configdir 2021-11-03 12:19:36 +01:00
libnm.ver core: support flag "preserve-external-ip" for Reapply() call 2022-12-14 17:31:16 +01:00
meson.build support loopback interface 2022-11-23 20:51:22 +01:00
nm-access-point.c format: reformat source tree with clang-format 13.0 2021-11-29 09:31:09 +00:00
nm-active-connection.c format: reformat source tree with clang-format 13.0 2021-11-29 09:31:09 +00:00
nm-checkpoint.c format: reformat source tree with clang-format 13.0 2021-11-29 09:31:09 +00:00
nm-client.c core: add "VersionInfo" property on D-Bus and NMClient 2022-12-14 17:31:15 +01:00
nm-conn-utils.c libnm/conn-utils: include a documentation string 2022-11-13 23:36:37 +01:00
nm-dbus-helpers.c format: reformat source tree with clang-format 13.0 2021-11-29 09:31:09 +00:00
nm-dbus-helpers.h clang-format: use "IndentPPDirectives:None" instead of "BeforeHash" 2021-07-09 08:49:06 +02:00
nm-default-libnm.h libnm: move nm-errors.h include away from nm-connection.h 2022-11-13 23:36:37 +01:00
nm-device-6lowpan.c libnm: actually export a lot of routines that were supposed to be public 2022-11-08 11:43:00 +01:00
nm-device-adsl.c format: reformat source tree with clang-format 13.0 2021-11-29 09:31:09 +00:00
nm-device-bond.c format: reformat source tree with clang-format 13.0 2021-11-29 09:31:09 +00:00
nm-device-bridge.c format: reformat source tree with clang-format 13.0 2021-11-29 09:31:09 +00:00
nm-device-bt.c format: reformat source tree with clang-format 13.0 2021-11-29 09:31:09 +00:00
nm-device-dummy.c dummy: drop NM_DEVICE_DUMMY_GET_PRIVATE() 2022-09-12 07:39:13 +02:00
nm-device-ethernet.c format: reformat source tree with clang-format 13.0 2021-11-29 09:31:09 +00:00
nm-device-generic.c format: reformat source tree with clang-format 13.0 2021-11-29 09:31:09 +00:00
nm-device-infiniband.c format: reformat source tree with clang-format 13.0 2021-11-29 09:31:09 +00:00
nm-device-ip-tunnel.c format: reformat source tree with clang-format 13.0 2021-11-29 09:31:09 +00:00
nm-device-loopback.c support loopback interface 2022-11-23 20:51:22 +01:00
nm-device-macsec.c libnm: actually export a lot of routines that were supposed to be public 2022-11-08 11:43:00 +01:00
nm-device-macvlan.c libnm: fix placement of some "Since:" tags 2022-05-06 18:33:27 +02:00
nm-device-modem.c libnm" fix type description for LTE,5GNR modems 2022-12-19 08:34:48 +01:00
nm-device-olpc-mesh.c libnm: replace nm-types.h by defining the types in respective headers 2022-05-06 18:33:27 +02:00
nm-device-ovs-bridge.c format: reformat source tree with clang-format 13.0 2021-11-29 09:31:09 +00:00
nm-device-ovs-interface.c build: move "libnm/" to "src/" and split it 2021-02-24 12:48:37 +01:00
nm-device-ovs-port.c format: reformat source tree with clang-format 13.0 2021-11-29 09:31:09 +00:00
nm-device-ppp.c build: move "libnm/" to "src/" and split it 2021-02-24 12:48:37 +01:00
nm-device-private.h build: move "libnm/" to "src/" and split it 2021-02-24 12:48:37 +01:00
nm-device-team.c format: reformat source tree with clang-format 13.0 2021-11-29 09:31:09 +00:00
nm-device-tun.c libnm: fix a large amount of Since tags 2022-11-08 11:40:18 +01:00
nm-device-veth.c libnm: actually export a lot of routines that were supposed to be public 2022-11-08 11:43:00 +01:00
nm-device-vlan.c format: reformat source tree with clang-format 13.0 2021-11-29 09:31:09 +00:00
nm-device-vrf.c format: reformat source tree with clang-format 13.0 2021-11-29 09:31:09 +00:00
nm-device-vxlan.c libnm: actually export a lot of routines that were supposed to be public 2022-11-08 11:43:00 +01:00
nm-device-wifi-p2p.c libnm: actually export a lot of routines that were supposed to be public 2022-11-08 11:43:00 +01:00
nm-device-wifi.c libnm: replace nm-types.h by defining the types in respective headers 2022-05-06 18:33:27 +02:00
nm-device-wimax.c libnm: replace nm-types.h by defining the types in respective headers 2022-05-06 18:33:27 +02:00
nm-device-wireguard.c build: move "libnm/" to "src/" and split it 2021-02-24 12:48:37 +01:00
nm-device-wpan.c libnm: remove nm_device_wpan_get_hw_address() 2022-11-08 11:40:18 +01:00
nm-device.c libnm: make ref counting of immutable types thread safe 2022-12-20 10:35:02 +01:00
nm-dhcp-config.c libnm: fix a handful of misformatted gtk-doc blocks 2022-11-13 23:36:37 +01:00
nm-dhcp4-config.c build: move "libnm/" to "src/" and split it 2021-02-24 12:48:37 +01:00
nm-dhcp4-config.h all: use _NM_G_TYPE_CHECK_INSTANCE_CAST() for internal uses 2022-12-16 10:55:03 +01:00
nm-dhcp6-config.c build: move "libnm/" to "src/" and split it 2021-02-24 12:48:37 +01:00
nm-dhcp6-config.h all: use _NM_G_TYPE_CHECK_INSTANCE_CAST() for internal uses 2022-12-16 10:55:03 +01:00
nm-dns-manager.c dns-manager,client: rename struct NMDnsEntry 2022-11-13 23:36:37 +01:00
nm-dns-manager.h format: reformat source tree with clang-format 13.0 2021-11-29 09:31:09 +00:00
nm-ip-config.c glib-aux: rename IP address related helpers from "nm-inet-utils.h" 2022-08-25 19:05:51 +02:00
nm-ip4-config.c build: move "libnm/" to "src/" and split it 2021-02-24 12:48:37 +01:00
nm-ip4-config.h all: use _NM_G_TYPE_CHECK_INSTANCE_CAST() for internal uses 2022-12-16 10:55:03 +01:00
nm-ip6-config.c build: move "libnm/" to "src/" and split it 2021-02-24 12:48:37 +01:00
nm-ip6-config.h all: use _NM_G_TYPE_CHECK_INSTANCE_CAST() for internal uses 2022-12-16 10:55:03 +01:00
nm-libnm-utils.c support loopback interface 2022-11-23 20:51:22 +01:00
nm-libnm-utils.h support loopback interface 2022-11-23 20:51:22 +01:00
nm-object-private.h clang-format: use "IndentPPDirectives:None" instead of "BeforeHash" 2021-07-09 08:49:06 +02:00
nm-object.c all: fix various "-Wcast-align=strict" warnings 2022-12-09 09:15:56 +01:00
nm-remote-connection-private.h clang-format: use "IndentPPDirectives:None" instead of "BeforeHash" 2021-07-09 08:49:06 +02:00
nm-remote-connection.c libnm: fix a large amount of Since tags 2022-11-08 11:40:18 +01:00
nm-secret-agent-old.c libnm: fix a handful of misformatted gtk-doc blocks 2022-11-13 23:36:37 +01:00
nm-vpn-connection.c format: reformat source tree with clang-format 13.0 2021-11-29 09:31:09 +00:00
nm-vpn-editor.c build: move "libnm/" to "src/" and split it 2021-02-24 12:48:37 +01:00
nm-vpn-plugin-old.c libnm: drop nm_vpn_plugin_old_set_{,ip6_}config() 2022-11-08 11:40:18 +01:00
nm-vpn-service-plugin.c libnm: fix a large amount of Since tags 2022-11-08 11:40:18 +01:00
nm-wifi-p2p-peer.c format: reformat source tree with clang-format 13.0 2021-11-29 09:31:09 +00:00
nm-wimax-nsp.c build: move "libnm/" to "src/" and split it 2021-02-24 12:48:37 +01:00
README.md all: add some README.md files describing the purpose of our sources 2021-08-19 17:51:11 +02:00

libnm-client-impl

libnm is NetworkManager's client API. This API consists of two parts:

  • the handling of connections (NMConnection), implemented by libnm-core-impl.
  • the caching of D-Bus API (NMClient), implemented by libnm-client-impl.

This directory contains the implementation of the second part. As such, it will be statically linked with libnm-core-impl to make libnm. Also, it cannot be used by the daemon.