sd-netlink: drop the write-queue

AF_NETLINK is not write-buffered, so this was actually never used.
This commit is contained in:
Tom Gundersen
2015-06-13 20:51:56 +02:00
parent 1c4baffc18
commit bbe181b489
5 changed files with 11 additions and 133 deletions
@@ -72,10 +72,6 @@ struct sd_netlink {
unsigned rqueue_partial_size;
size_t rqueue_partial_allocated;
sd_netlink_message **wqueue;
unsigned wqueue_size;
size_t wqueue_allocated;
struct nlmsghdr *rbuffer;
size_t rbuffer_allocated;
+1 -1
View File
@@ -1410,7 +1410,7 @@ int socket_write_message(sd_netlink *nl, sd_netlink_message *m) {
k = sendto(nl->fd, m->hdr, m->hdr->nlmsg_len,
0, &addr.sa, sizeof(addr));
if (k < 0)
return (errno == EAGAIN) ? 0 : -errno;
return -errno;
return k;
}
+10 -124
View File
@@ -50,11 +50,6 @@ static int sd_netlink_new(sd_netlink **ret) {
LIST_HEAD_INIT(rtnl->match_callbacks);
/* We guarantee that wqueue always has space for at least
* one entry */
if (!GREEDY_REALLOC(rtnl->wqueue, rtnl->wqueue_allocated, 1))
return -ENOMEM;
/* We guarantee that the read buffer has at least space for
* a message header */
if (!greedy_realloc((void**)&rtnl->rbuffer, &rtnl->rbuffer_allocated,
@@ -204,10 +199,6 @@ sd_netlink *sd_netlink_unref(sd_netlink *rtnl) {
sd_netlink_message_unref(rtnl->rqueue_partial[i]);
free(rtnl->rqueue_partial);
for (i = 0; i < rtnl->wqueue_size; i++)
sd_netlink_message_unref(rtnl->wqueue[i]);
free(rtnl->wqueue);
free(rtnl->rbuffer);
hashmap_free_free(rtnl->reply_callbacks);
@@ -215,7 +206,6 @@ sd_netlink *sd_netlink_unref(sd_netlink *rtnl) {
sd_event_source_unref(rtnl->io_event_source);
sd_event_source_unref(rtnl->time_event_source);
sd_event_source_unref(rtnl->exit_event_source);
sd_event_unref(rtnl->event);
while ((f = rtnl->match_callbacks)) {
@@ -257,29 +247,9 @@ int sd_netlink_send(sd_netlink *nl,
rtnl_seal_message(nl, message);
if (nl->wqueue_size <= 0) {
/* send directly */
r = socket_write_message(nl, message);
if (r < 0)
return r;
else if (r == 0) {
/* nothing was sent, so let's put it on
* the queue */
nl->wqueue[0] = sd_netlink_message_ref(message);
nl->wqueue_size = 1;
}
} else {
/* append to queue */
if (nl->wqueue_size >= RTNL_WQUEUE_MAX) {
log_debug("rtnl: exhausted the write queue size (%d)", RTNL_WQUEUE_MAX);
return -ENOBUFS;
}
if (!GREEDY_REALLOC(nl->wqueue, nl->wqueue_allocated, nl->wqueue_size + 1))
return -ENOMEM;
nl->wqueue[nl->wqueue_size ++] = sd_netlink_message_ref(message);
}
r = socket_write_message(nl, message);
if (r < 0)
return r;
if (serial)
*serial = rtnl_message_get_serial(message);
@@ -337,31 +307,6 @@ static int dispatch_rqueue(sd_netlink *rtnl, sd_netlink_message **message) {
return 1;
}
static int dispatch_wqueue(sd_netlink *rtnl) {
int r, ret = 0;
assert(rtnl);
while (rtnl->wqueue_size > 0) {
r = socket_write_message(rtnl, rtnl->wqueue[0]);
if (r < 0)
return r;
else if (r == 0)
/* Didn't do anything this time */
return ret;
else {
/* see equivalent in sd-bus.c */
sd_netlink_message_unref(rtnl->wqueue[0]);
rtnl->wqueue_size --;
memmove(rtnl->wqueue, rtnl->wqueue + 1, sizeof(sd_netlink_message*) * rtnl->wqueue_size);
ret = 1;
}
}
return ret;
}
static int process_timeout(sd_netlink *rtnl) {
_cleanup_netlink_message_unref_ sd_netlink_message *m = NULL;
struct reply_callback *c;
@@ -462,10 +407,6 @@ static int process_running(sd_netlink *rtnl, sd_netlink_message **ret) {
if (r != 0)
goto null_message;
r = dispatch_wqueue(rtnl);
if (r != 0)
goto null_message;
r = dispatch_rqueue(rtnl, &m);
if (r < 0)
return r;
@@ -759,48 +700,17 @@ int sd_netlink_call(sd_netlink *rtnl,
return r;
else if (r == 0)
return -ETIMEDOUT;
r = dispatch_wqueue(rtnl);
if (r < 0)
return r;
}
}
int sd_netlink_flush(sd_netlink *rtnl) {
int r;
assert_return(rtnl, -EINVAL);
assert_return(!rtnl_pid_changed(rtnl), -ECHILD);
if (rtnl->wqueue_size <= 0)
return 0;
for (;;) {
r = dispatch_wqueue(rtnl);
if (r < 0)
return r;
if (rtnl->wqueue_size <= 0)
return 0;
r = rtnl_poll(rtnl, false, (uint64_t) -1);
if (r < 0)
return r;
}
}
int sd_netlink_get_events(sd_netlink *rtnl) {
int flags = 0;
assert_return(rtnl, -EINVAL);
assert_return(!rtnl_pid_changed(rtnl), -ECHILD);
if (rtnl->rqueue_size <= 0)
flags |= POLLIN;
if (rtnl->wqueue_size > 0)
flags |= POLLOUT;
return flags;
if (rtnl->rqueue_size == 0)
return POLLIN;
else
return 0;
}
int sd_netlink_get_timeout(sd_netlink *rtnl, uint64_t *timeout_usec) {
@@ -886,16 +796,6 @@ static int prepare_callback(sd_event_source *s, void *userdata) {
return 1;
}
static int exit_callback(sd_event_source *event, void *userdata) {
sd_netlink *rtnl = userdata;
assert(event);
sd_netlink_flush(rtnl);
return 1;
}
int sd_netlink_attach_event(sd_netlink *rtnl, sd_event *event, int priority) {
int r;
@@ -941,14 +841,6 @@ int sd_netlink_attach_event(sd_netlink *rtnl, sd_event *event, int priority) {
if (r < 0)
goto fail;
r = sd_event_add_exit(rtnl->event, &rtnl->exit_event_source, exit_callback, rtnl);
if (r < 0)
goto fail;
r = sd_event_source_set_description(rtnl->exit_event_source, "rtnl-exit");
if (r < 0)
goto fail;
return 0;
fail:
@@ -960,17 +852,11 @@ int sd_netlink_detach_event(sd_netlink *rtnl) {
assert_return(rtnl, -EINVAL);
assert_return(rtnl->event, -ENXIO);
if (rtnl->io_event_source)
rtnl->io_event_source = sd_event_source_unref(rtnl->io_event_source);
rtnl->io_event_source = sd_event_source_unref(rtnl->io_event_source);
if (rtnl->time_event_source)
rtnl->time_event_source = sd_event_source_unref(rtnl->time_event_source);
rtnl->time_event_source = sd_event_source_unref(rtnl->time_event_source);
if (rtnl->exit_event_source)
rtnl->exit_event_source = sd_event_source_unref(rtnl->exit_event_source);
if (rtnl->event)
rtnl->event = sd_event_unref(rtnl->event);
rtnl->event = sd_event_unref(rtnl->event);
return 0;
}
-3
View File
@@ -115,7 +115,6 @@ static void test_link_get(sd_netlink *rtnl, int ifindex) {
assert_se(sd_netlink_message_read_ether_addr(r, IFLA_ADDRESS, &eth_data) == 0);
assert_se(sd_netlink_flush(rtnl) >= 0);
assert_se((m = sd_netlink_message_unref(m)) == NULL);
assert_se((r = sd_netlink_message_unref(r)) == NULL);
}
@@ -138,7 +137,6 @@ static void test_address_get(sd_netlink *rtnl, int ifindex) {
assert_se(sd_netlink_message_read_string(r, IFA_LABEL, &label) == 0);
assert_se(sd_netlink_message_read_cache_info(r, IFA_CACHEINFO, &cache) == 0);
assert_se(sd_netlink_flush(rtnl) >= 0);
assert_se((m = sd_netlink_message_unref(m)) == NULL);
assert_se((r = sd_netlink_message_unref(r)) == NULL);
@@ -434,7 +432,6 @@ int main(void) {
test_link_get(rtnl, if_loopback);
test_address_get(rtnl, if_loopback);
assert_se(sd_netlink_flush(rtnl) >= 0);
assert_se((m = sd_netlink_message_unref(m)) == NULL);
assert_se((r = sd_netlink_message_unref(r)) == NULL);
assert_se((rtnl = sd_netlink_unref(rtnl)) == NULL);
-1
View File
@@ -61,7 +61,6 @@ int sd_netlink_get_events(sd_netlink *nl);
int sd_netlink_get_timeout(sd_netlink *nl, uint64_t *timeout);
int sd_netlink_process(sd_netlink *nl, sd_netlink_message **ret);
int sd_netlink_wait(sd_netlink *nl, uint64_t timeout);
int sd_netlink_flush(sd_netlink *nl);
int sd_netlink_add_match(sd_netlink *nl, uint16_t match, sd_netlink_message_handler_t c, void *userdata);
int sd_netlink_remove_match(sd_netlink *nl, uint16_t match, sd_netlink_message_handler_t c, void *userdata);