Skip to content

Commit 545bab1

Browse files
committed
sd-netlink: add destroy_callback argument to sd_netlink_call_async()
1 parent 2fea609 commit 545bab1

16 files changed

+75
-54
lines changed

src/core/loopback-setup.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ static int start_loopback(sd_netlink *rtnl, struct state *s) {
5353
if (r < 0)
5454
return r;
5555

56-
r = sd_netlink_call_async(rtnl, req, generic_handler, s, LOOPBACK_SETUP_TIMEOUT_USEC, NULL);
56+
r = sd_netlink_call_async(rtnl, req, generic_handler, NULL, s, LOOPBACK_SETUP_TIMEOUT_USEC, NULL);
5757
if (r < 0)
5858
return r;
5959

@@ -88,7 +88,7 @@ static int add_ipv4_address(sd_netlink *rtnl, struct state *s) {
8888
if (r < 0)
8989
return r;
9090

91-
r = sd_netlink_call_async(rtnl, req, generic_handler, s, USEC_INFINITY, NULL);
91+
r = sd_netlink_call_async(rtnl, req, generic_handler, NULL, s, USEC_INFINITY, NULL);
9292
if (r < 0)
9393
return r;
9494

@@ -123,7 +123,7 @@ static int add_ipv6_address(sd_netlink *rtnl, struct state *s) {
123123
if (r < 0)
124124
return r;
125125

126-
r = sd_netlink_call_async(rtnl, req, generic_handler, s, USEC_INFINITY, NULL);
126+
r = sd_netlink_call_async(rtnl, req, generic_handler, NULL, s, USEC_INFINITY, NULL);
127127
if (r < 0)
128128
return r;
129129

src/libsystemd/sd-netlink/netlink-internal.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ struct reply_callback {
2323
usec_t timeout;
2424
uint64_t serial;
2525
unsigned prioq_idx;
26+
sd_netlink_destroy_t destroy_callback;
2627
};
2728

2829
struct match_callback {

src/libsystemd/sd-netlink/sd-netlink.c

Lines changed: 37 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,7 @@ int sd_netlink_inc_rcvbuf(sd_netlink *rtnl, size_t size) {
148148
}
149149

150150
static sd_netlink *netlink_free(sd_netlink *rtnl) {
151+
struct reply_callback *c;
151152
struct match_callback *f;
152153
unsigned i;
153154

@@ -163,7 +164,12 @@ static sd_netlink *netlink_free(sd_netlink *rtnl) {
163164

164165
free(rtnl->rbuffer);
165166

166-
hashmap_free_free(rtnl->reply_callbacks);
167+
while ((c = hashmap_steal_first(rtnl->reply_callbacks))) {
168+
if (c->destroy_callback)
169+
c->destroy_callback(c->userdata);
170+
free(c);
171+
}
172+
hashmap_free(rtnl->reply_callbacks);
167173
prioq_free(rtnl->reply_callbacks_prioq);
168174

169175
sd_event_source_unref(rtnl->io_event_source);
@@ -299,6 +305,9 @@ static int process_timeout(sd_netlink *rtnl) {
299305
if (r < 0)
300306
log_debug_errno(r, "sd-netlink: timedout callback failed: %m");
301307

308+
if (c->destroy_callback)
309+
c->destroy_callback(c->userdata);
310+
302311
free(c);
303312

304313
return 1;
@@ -332,6 +341,9 @@ static int process_reply(sd_netlink *rtnl, sd_netlink_message *m) {
332341
if (r < 0)
333342
log_debug_errno(r, "sd-netlink: callback failed: %m");
334343

344+
if (c->destroy_callback)
345+
c->destroy_callback(c->userdata);
346+
335347
return 1;
336348
}
337349

@@ -494,13 +506,15 @@ static int timeout_compare(const void *a, const void *b) {
494506
return CMP(x->timeout, y->timeout);
495507
}
496508

497-
int sd_netlink_call_async(sd_netlink *nl,
498-
sd_netlink_message *m,
499-
sd_netlink_message_handler_t callback,
500-
void *userdata,
501-
uint64_t usec,
502-
uint32_t *serial) {
503-
struct reply_callback *c;
509+
int sd_netlink_call_async(
510+
sd_netlink *nl,
511+
sd_netlink_message *m,
512+
sd_netlink_message_handler_t callback,
513+
sd_netlink_destroy_t destroy_callback,
514+
void *userdata,
515+
uint64_t usec,
516+
uint32_t *serial) {
517+
_cleanup_free_ struct reply_callback *c = NULL;
504518
uint32_t s;
505519
int r, k;
506520

@@ -519,40 +533,40 @@ int sd_netlink_call_async(sd_netlink *nl,
519533
return r;
520534
}
521535

522-
c = new0(struct reply_callback, 1);
536+
c = new(struct reply_callback, 1);
523537
if (!c)
524538
return -ENOMEM;
525539

526-
c->callback = callback;
527-
c->userdata = userdata;
528-
c->timeout = calc_elapse(usec);
540+
*c = (struct reply_callback) {
541+
.callback = callback,
542+
.userdata = userdata,
543+
.timeout = calc_elapse(usec),
544+
.destroy_callback = destroy_callback,
545+
};
529546

530547
k = sd_netlink_send(nl, m, &s);
531-
if (k < 0) {
532-
free(c);
548+
if (k < 0)
533549
return k;
534-
}
535550

536551
c->serial = s;
537552

538553
r = hashmap_put(nl->reply_callbacks, &c->serial, c);
539-
if (r < 0) {
540-
free(c);
554+
if (r < 0)
541555
return r;
542-
}
543556

544557
if (c->timeout != 0) {
545558
r = prioq_put(nl->reply_callbacks_prioq, c, &c->prioq_idx);
546559
if (r < 0) {
547-
c->timeout = 0;
548-
sd_netlink_call_async_cancel(nl, c->serial);
560+
(void) hashmap_remove(nl->reply_callbacks, &c->serial);
549561
return r;
550562
}
551563
}
552564

553565
if (serial)
554566
*serial = s;
555567

568+
TAKE_PTR(c);
569+
556570
return k;
557571
}
558572

@@ -571,6 +585,9 @@ int sd_netlink_call_async_cancel(sd_netlink *nl, uint32_t serial) {
571585
if (c->timeout != 0)
572586
prioq_remove(nl->reply_callbacks_prioq, c, &c->prioq_idx);
573587

588+
if (c->destroy_callback)
589+
c->destroy_callback(c->userdata);
590+
574591
free(c);
575592
return 1;
576593
}

src/libsystemd/sd-netlink/test-netlink.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ static void test_event_loop(int ifindex) {
199199
assert_se(sd_netlink_open(&rtnl) >= 0);
200200
assert_se(sd_rtnl_message_new_link(rtnl, &m, RTM_GETLINK, ifindex) >= 0);
201201

202-
assert_se(sd_netlink_call_async(rtnl, m, link_handler, ifname, 0, NULL) >= 0);
202+
assert_se(sd_netlink_call_async(rtnl, m, link_handler, NULL, ifname, 0, NULL) >= 0);
203203

204204
assert_se(sd_event_default(&event) >= 0);
205205

@@ -240,7 +240,7 @@ static void test_async(int ifindex) {
240240

241241
assert_se(sd_rtnl_message_new_link(rtnl, &m, RTM_GETLINK, ifindex) >= 0);
242242

243-
assert_se(sd_netlink_call_async(rtnl, m, link_handler, ifname, 0, &serial) >= 0);
243+
assert_se(sd_netlink_call_async(rtnl, m, link_handler, NULL, ifname, 0, &serial) >= 0);
244244

245245
assert_se(sd_netlink_wait(rtnl, 0) >= 0);
246246
assert_se(sd_netlink_process(rtnl, &r) >= 0);
@@ -259,10 +259,10 @@ static void test_pipe(int ifindex) {
259259
assert_se(sd_rtnl_message_new_link(rtnl, &m2, RTM_GETLINK, ifindex) >= 0);
260260

261261
counter++;
262-
assert_se(sd_netlink_call_async(rtnl, m1, pipe_handler, &counter, 0, NULL) >= 0);
262+
assert_se(sd_netlink_call_async(rtnl, m1, pipe_handler, NULL, &counter, 0, NULL) >= 0);
263263

264264
counter++;
265-
assert_se(sd_netlink_call_async(rtnl, m2, pipe_handler, &counter, 0, NULL) >= 0);
265+
assert_se(sd_netlink_call_async(rtnl, m2, pipe_handler, NULL, &counter, 0, NULL) >= 0);
266266

267267
while (counter > 0) {
268268
assert_se(sd_netlink_wait(rtnl, 0) >= 0);

src/network/netdev/bridge.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ static int netdev_bridge_post_create(NetDev *netdev, Link *link, sd_netlink_mess
129129
if (r < 0)
130130
return log_netdev_error_errno(netdev, r, "Could not append IFLA_INFO_DATA attribute: %m");
131131

132-
r = sd_netlink_call_async(netdev->manager->rtnl, req, netdev_bridge_set_handler, netdev, 0, NULL);
132+
r = sd_netlink_call_async(netdev->manager->rtnl, req, netdev_bridge_set_handler, NULL, netdev, 0, NULL);
133133
if (r < 0)
134134
return log_netdev_error_errno(netdev, r, "Could not send rtnetlink message: %m");
135135

src/network/netdev/geneve.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ static int netdev_geneve_create(NetDev *netdev) {
135135
if (r < 0)
136136
return log_netdev_error_errno(netdev, r, "Could not append IFLA_LINKINFO attribute: %m");
137137

138-
r = sd_netlink_call_async(netdev->manager->rtnl, m, geneve_netdev_create_handler, netdev, 0, NULL);
138+
r = sd_netlink_call_async(netdev->manager->rtnl, m, geneve_netdev_create_handler, NULL, netdev, 0, NULL);
139139
if (r < 0)
140140
return log_netdev_error_errno(netdev, r, "Could not send rtnetlink message: %m");
141141

src/network/netdev/netdev.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,7 @@ static int netdev_enslave_ready(NetDev *netdev, Link* link, sd_netlink_message_h
229229
if (r < 0)
230230
return log_netdev_error_errno(netdev, r, "Could not append IFLA_MASTER attribute: %m");
231231

232-
r = sd_netlink_call_async(netdev->manager->rtnl, req, callback, link, 0, NULL);
232+
r = sd_netlink_call_async(netdev->manager->rtnl, req, callback, NULL, link, 0, NULL);
233233
if (r < 0)
234234
return log_netdev_error_errno(netdev, r, "Could not send rtnetlink message: %m");
235235

@@ -537,13 +537,13 @@ static int netdev_create(NetDev *netdev, Link *link,
537537
return log_netdev_error_errno(netdev, r, "Could not append IFLA_LINKINFO attribute: %m");
538538

539539
if (link) {
540-
r = sd_netlink_call_async(netdev->manager->rtnl, m, callback, link, 0, NULL);
540+
r = sd_netlink_call_async(netdev->manager->rtnl, m, callback, NULL, link, 0, NULL);
541541
if (r < 0)
542542
return log_netdev_error_errno(netdev, r, "Could not send rtnetlink message: %m");
543543

544544
link_ref(link);
545545
} else {
546-
r = sd_netlink_call_async(netdev->manager->rtnl, m, netdev_create_handler, netdev, 0, NULL);
546+
r = sd_netlink_call_async(netdev->manager->rtnl, m, netdev_create_handler, NULL, netdev, 0, NULL);
547547
if (r < 0)
548548
return log_netdev_error_errno(netdev, r, "Could not send rtnetlink message: %m");
549549

src/network/networkd-address-label.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ int address_label_configure(
112112
if (r < 0)
113113
return log_error_errno(r, "Could not append IFA_ADDRESS attribute: %m");
114114

115-
r = sd_netlink_call_async(link->manager->rtnl, req, callback, link, 0, NULL);
115+
r = sd_netlink_call_async(link->manager->rtnl, req, callback, NULL, link, 0, NULL);
116116
if (r < 0)
117117
return log_error_errno(r, "Could not send rtnetlink message: %m");
118118

src/network/networkd-address.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -453,7 +453,7 @@ int address_remove(
453453
if (r < 0)
454454
return log_error_errno(r, "Could not append IFA_LOCAL attribute: %m");
455455

456-
r = sd_netlink_call_async(link->manager->rtnl, req, callback, link, 0, NULL);
456+
r = sd_netlink_call_async(link->manager->rtnl, req, callback, NULL, link, 0, NULL);
457457
if (r < 0)
458458
return log_error_errno(r, "Could not send rtnetlink message: %m");
459459

@@ -631,7 +631,7 @@ int address_configure(
631631
if (r < 0)
632632
return r;
633633

634-
r = sd_netlink_call_async(link->manager->rtnl, req, callback, link, 0, NULL);
634+
r = sd_netlink_call_async(link->manager->rtnl, req, callback, NULL, link, 0, NULL);
635635
if (r < 0) {
636636
address_release(address);
637637
return log_error_errno(r, "Could not send rtnetlink message: %m");

src/network/networkd-brvlan.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ int br_vlan_configure(Link *link, uint16_t pvid, uint32_t *br_vid_bitmap, uint32
195195
return log_link_error_errno(link, r, "Could not close IFLA_AF_SPEC container: %m");
196196

197197
/* send message to the kernel */
198-
r = sd_netlink_call_async(rtnl, req, set_brvlan_handler, link, 0, NULL);
198+
r = sd_netlink_call_async(rtnl, req, set_brvlan_handler, NULL, link, 0, NULL);
199199
if (r < 0)
200200
return log_link_error_errno(link, r, "Could not send rtnetlink message: %m");
201201

0 commit comments

Comments
 (0)