Merge pull request #11888 from keszybz/non-atomic

Drop unused atomic operations
This commit is contained in:
Lennart Poettering
2019-03-04 19:03:46 +01:00
committed by GitHub
21 changed files with 70 additions and 130 deletions
-1
View File
@@ -148,7 +148,6 @@ basic_sources = files('''
ratelimit.h
raw-clone.h
raw-reboot.h
refcnt.h
replace-var.c
replace-var.h
rlimit-util.c
-54
View File
@@ -1,54 +0,0 @@
/* SPDX-License-Identifier: LGPL-2.1+ */
#pragma once
/* A type-safe atomic refcounter.
*
* DO NOT USE THIS UNLESS YOU ACTUALLY CARE ABOUT THREAD SAFETY! */
typedef struct {
volatile unsigned _value;
} RefCount;
#define REFCNT_GET(r) ((r)._value)
#define REFCNT_INC(r) (__sync_add_and_fetch(&(r)._value, 1))
#define REFCNT_DEC(r) (__sync_sub_and_fetch(&(r)._value, 1))
#define REFCNT_INIT ((RefCount) { ._value = 1 })
#define _DEFINE_ATOMIC_REF_FUNC(type, name, scope) \
scope type *name##_ref(type *p) { \
if (!p) \
return NULL; \
\
assert_se(REFCNT_INC(p->n_ref) >= 2); \
return p; \
}
#define _DEFINE_ATOMIC_UNREF_FUNC(type, name, free_func, scope) \
scope type *name##_unref(type *p) { \
if (!p) \
return NULL; \
\
if (REFCNT_DEC(p->n_ref) > 0) \
return NULL; \
\
return free_func(p); \
}
#define DEFINE_ATOMIC_REF_FUNC(type, name) \
_DEFINE_ATOMIC_REF_FUNC(type, name,)
#define DEFINE_PUBLIC_ATOMIC_REF_FUNC(type, name) \
_DEFINE_ATOMIC_REF_FUNC(type, name, _public_)
#define DEFINE_ATOMIC_UNREF_FUNC(type, name, free_func) \
_DEFINE_ATOMIC_UNREF_FUNC(type, name, free_func,)
#define DEFINE_PUBLIC_ATOMIC_UNREF_FUNC(type, name, free_func) \
_DEFINE_ATOMIC_UNREF_FUNC(type, name, free_func, _public_)
#define DEFINE_ATOMIC_REF_UNREF_FUNC(type, name, free_func) \
DEFINE_ATOMIC_REF_FUNC(type, name); \
DEFINE_ATOMIC_UNREF_FUNC(type, name, free_func);
#define DEFINE_PUBLIC_ATOMIC_REF_UNREF_FUNC(type, name, free_func) \
DEFINE_PUBLIC_ATOMIC_REF_FUNC(type, name); \
DEFINE_PUBLIC_ATOMIC_UNREF_FUNC(type, name, free_func);
+2 -1
View File
@@ -15,6 +15,7 @@
#include "lldp-network.h"
#include "macro.h"
#include "string-util.h"
#include "tests.h"
#define TEST_LLDP_PORT "em1"
#define TEST_LLDP_TYPE_SYSTEM_NAME "systemd-lldp"
@@ -365,7 +366,7 @@ static void test_multiple_neighbors_sorted(sd_event *e) {
int main(int argc, char *argv[]) {
_cleanup_(sd_event_unrefp) sd_event *e = NULL;
log_set_max_level(LOG_DEBUG);
test_setup_logging(LOG_DEBUG);
/* LLDP reception tests */
assert_se(sd_event_new(&e) == 0);
+1 -10
View File
@@ -13,7 +13,6 @@
#include "hashmap.h"
#include "list.h"
#include "prioq.h"
#include "refcnt.h"
#include "socket-util.h"
#include "util.h"
@@ -171,15 +170,7 @@ enum bus_auth {
};
struct sd_bus {
/* We use atomic ref counting here since sd_bus_message
objects retain references to their originating sd_bus but
we want to allow them to be processed in a different
thread. We won't provide full thread safety, but only the
bare minimum that makes it possible to use sd_bus and
sd_bus_message objects independently and on different
threads as long as each object is used only once at the
same time. */
RefCount n_ref;
unsigned n_ref;
enum bus_state state;
int input_fd, output_fd;
+2 -2
View File
@@ -236,7 +236,7 @@ _public_ int sd_bus_new(sd_bus **ret) {
return -ENOMEM;
*b = (sd_bus) {
.n_ref = REFCNT_INIT,
.n_ref = 1,
.input_fd = -1,
.output_fd = -1,
.inotify_fd = -1,
@@ -1585,7 +1585,7 @@ void bus_enter_closing(sd_bus *bus) {
bus_set_state(bus, BUS_CLOSING);
}
DEFINE_PUBLIC_ATOMIC_REF_UNREF_FUNC(sd_bus, sd_bus, bus_free);
DEFINE_PUBLIC_TRIVIAL_REF_UNREF_FUNC(sd_bus, sd_bus, bus_free);
_public_ int sd_bus_is_open(sd_bus *bus) {
assert_return(bus, -EINVAL);
+2 -3
View File
@@ -4,6 +4,7 @@
#include "log.h"
#include "string-util.h"
#include "strv.h"
#include "tests.h"
static void test_one_address(sd_bus *b,
const char *host,
@@ -59,9 +60,7 @@ static void test_bus_set_address_system_remote(char **args) {
}
int main(int argc, char *argv[]) {
log_set_max_level(LOG_INFO);
log_parse_environment();
log_open();
test_setup_logging(LOG_INFO);
test_bus_set_address_system_remote(argv + 1);
+8 -9
View File
@@ -7,7 +7,6 @@
#include "bus-internal.h"
#include "bus-message.h"
#include "bus-util.h"
#include "refcnt.h"
#include "tests.h"
static bool use_system_bus = false;
@@ -16,7 +15,7 @@ static void test_bus_new(void) {
_cleanup_(sd_bus_unrefp) sd_bus *bus = NULL;
assert_se(sd_bus_new(&bus) == 0);
printf("after new: refcount %u\n", REFCNT_GET(bus->n_ref));
assert_se(bus->n_ref == 1);
}
static int test_bus_open(void) {
@@ -32,7 +31,7 @@ static int test_bus_open(void) {
}
assert_se(r >= 0);
printf("after open: refcount %u\n", REFCNT_GET(bus->n_ref));
assert_se(bus->n_ref >= 1); /* we send a hello message when opening, so the count is above 1 */
return 0;
}
@@ -45,10 +44,10 @@ static void test_bus_new_method_call(void) {
assert_se(sd_bus_message_new_method_call(bus, &m, "a.service.name", "/an/object/path", "an.interface.name", "AMethodName") >= 0);
printf("after message_new_method_call: refcount %u\n", REFCNT_GET(bus->n_ref));
assert_se(m->n_ref == 1); /* We hold the only reference to the message */
assert_se(bus->n_ref >= 2);
sd_bus_flush_close_unref(bus);
printf("after bus_flush_close_unref: refcount %u\n", m->n_ref);
assert_se(m->n_ref == 1);
}
static void test_bus_new_signal(void) {
@@ -59,10 +58,10 @@ static void test_bus_new_signal(void) {
assert_se(sd_bus_message_new_signal(bus, &m, "/an/object/path", "an.interface.name", "Name") >= 0);
printf("after message_new_signal: refcount %u\n", REFCNT_GET(bus->n_ref));
assert_se(m->n_ref == 1); /* We hold the only reference to the message */
assert_se(bus->n_ref >= 2);
sd_bus_flush_close_unref(bus);
printf("after bus_flush_close_unref: refcount %u\n", m->n_ref);
assert_se(m->n_ref == 1);
}
int main(int argc, char **argv) {
+2 -1
View File
@@ -2,6 +2,7 @@
#include "bus-introspect.h"
#include "log.h"
#include "tests.h"
static int prop_get(sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *reply, void *userdata, sd_bus_error *error) {
return -EINVAL;
@@ -29,7 +30,7 @@ static const sd_bus_vtable vtable[] = {
int main(int argc, char *argv[]) {
struct introspect intro;
log_set_max_level(LOG_DEBUG);
test_setup_logging(LOG_DEBUG);
assert_se(introspect_begin(&intro, false) >= 0);
@@ -1,10 +1,10 @@
/* SPDX-License-Identifier: LGPL-2.1+ */
#include "sd-bus.h"
#include "main-func.h"
#include "sd-bus.h"
#include "tests.h"
static int run(int argc, char *argv[]) {
static int test_ref_unref(void) {
sd_bus_message *m = NULL;
sd_bus *bus = NULL;
int r;
@@ -41,4 +41,16 @@ static int run(int argc, char *argv[]) {
return 0;
}
static int run(int argc, char *argv[]) {
int r;
test_setup_logging(LOG_INFO);
r = test_ref_unref();
if (r < 0)
return r;
return 0;
}
DEFINE_MAIN_FUNCTION(run);
+2 -1
View File
@@ -16,6 +16,7 @@
#include "socket-util.h"
#include "string-util.h"
#include "tmpfile-util.h"
#include "tests.h"
static int method_foobar(sd_bus_message *m, void *userdata, sd_bus_error *ret_error) {
log_info("Got Foobar() call.");
@@ -198,7 +199,7 @@ int main(int argc, char *argv[]) {
pthread_t server, client1, client2;
char *path;
log_set_max_level(LOG_DEBUG);
test_setup_logging(LOG_DEBUG);
/* We use /dev/shm here rather than /tmp, since some weird distros might set up /tmp as some weird fs that
* doesn't support inotify properly. */
@@ -18,7 +18,6 @@
#include "mkdir.h"
#include "parse-util.h"
#include "path-util.h"
#include "refcnt.h"
#include "set.h"
#include "string-table.h"
#include "string-util.h"
+14 -16
View File
@@ -18,12 +18,11 @@
#include "hashmap.h"
#include "hwdb-internal.h"
#include "hwdb-util.h"
#include "refcnt.h"
#include "string-util.h"
#include "util.h"
struct sd_hwdb {
RefCount n_ref;
unsigned n_ref;
FILE *f;
struct stat st;
@@ -316,27 +315,27 @@ _public_ int sd_hwdb_new(sd_hwdb **ret) {
if (!hwdb)
return -ENOMEM;
hwdb->n_ref = REFCNT_INIT;
hwdb->n_ref = 1;
/* find hwdb.bin in hwdb_bin_paths */
NULSTR_FOREACH(hwdb_bin_path, hwdb_bin_paths) {
log_debug("Trying to open \"%s\"...", hwdb_bin_path);
hwdb->f = fopen(hwdb_bin_path, "re");
if (hwdb->f)
break;
else if (errno == ENOENT)
continue;
else
if (errno != ENOENT)
return log_debug_errno(errno, "Failed to open %s: %m", hwdb_bin_path);
}
if (!hwdb->f) {
log_debug("hwdb.bin does not exist, please run 'systemd-hwdb update'");
return -ENOENT;
}
if (!hwdb->f)
return log_debug_errno(SYNTHETIC_ERRNO(ENOENT),
"hwdb.bin does not exist, please run 'systemd-hwdb update'");
if (fstat(fileno(hwdb->f), &hwdb->st) < 0 ||
(size_t) hwdb->st.st_size < offsetof(struct trie_header_f, strings_len) + 8)
return log_debug_errno(errno, "Failed to read %s: %m", hwdb_bin_path);
if (fstat(fileno(hwdb->f), &hwdb->st) < 0)
return log_debug_errno(errno, "Failed to stat %s: %m", hwdb_bin_path);
if (hwdb->st.st_size < (off_t) offsetof(struct trie_header_f, strings_len) + 8)
return log_debug_errno(SYNTHETIC_ERRNO(EIO),
"File %s is too short: %m", hwdb_bin_path);
hwdb->map = mmap(0, hwdb->st.st_size, PROT_READ, MAP_SHARED, fileno(hwdb->f), 0);
if (hwdb->map == MAP_FAILED)
@@ -370,7 +369,7 @@ static sd_hwdb *hwdb_free(sd_hwdb *hwdb) {
return mfree(hwdb);
}
DEFINE_PUBLIC_ATOMIC_REF_UNREF_FUNC(sd_hwdb, sd_hwdb, hwdb_free)
DEFINE_PUBLIC_TRIVIAL_REF_UNREF_FUNC(sd_hwdb, sd_hwdb, hwdb_free)
bool hwdb_validate(sd_hwdb *hwdb) {
bool found = false;
@@ -383,12 +382,11 @@ bool hwdb_validate(sd_hwdb *hwdb) {
return false;
/* if hwdb.bin doesn't exist anywhere, we need to update */
NULSTR_FOREACH(p, hwdb_bin_paths) {
NULSTR_FOREACH(p, hwdb_bin_paths)
if (stat(p, &st) >= 0) {
found = true;
break;
}
}
if (!found)
return true;
+2 -3
View File
@@ -8,7 +8,6 @@
#include "list.h"
#include "netlink-types.h"
#include "prioq.h"
#include "refcnt.h"
#define RTNL_DEFAULT_TIMEOUT ((usec_t) (25 * USEC_PER_SEC))
@@ -56,7 +55,7 @@ struct sd_netlink_slot {
};
struct sd_netlink {
RefCount n_ref;
unsigned n_ref;
int fd;
@@ -114,7 +113,7 @@ struct netlink_container {
};
struct sd_netlink_message {
RefCount n_ref;
unsigned n_ref;
sd_netlink *rtnl;
+4 -7
View File
@@ -12,7 +12,6 @@
#include "netlink-internal.h"
#include "netlink-types.h"
#include "netlink-util.h"
#include "refcnt.h"
#include "socket-util.h"
#include "util.h"
@@ -36,7 +35,7 @@ int message_new_empty(sd_netlink *rtnl, sd_netlink_message **ret) {
if (!m)
return -ENOMEM;
m->n_ref = REFCNT_INIT;
m->n_ref = 1;
m->protocol = rtnl->protocol;
m->sealed = false;
@@ -96,12 +95,10 @@ int sd_netlink_message_request_dump(sd_netlink_message *m, int dump) {
return 0;
}
DEFINE_ATOMIC_REF_FUNC(sd_netlink_message, sd_netlink_message);
DEFINE_TRIVIAL_REF_FUNC(sd_netlink_message, sd_netlink_message);
sd_netlink_message *sd_netlink_message_unref(sd_netlink_message *m) {
sd_netlink_message *t;
while (m && REFCNT_DEC(m->n_ref) == 0) {
while (m && --m->n_ref == 0) {
unsigned i;
free(m->hdr);
@@ -109,7 +106,7 @@ sd_netlink_message *sd_netlink_message_unref(sd_netlink_message *m) {
for (i = 0; i <= m->n_containers; i++)
free(m->containers[i].attributes);
t = m;
sd_netlink_message *t = m;
m = m->next;
free(t);
}
@@ -14,7 +14,6 @@
#include "netlink-internal.h"
#include "netlink-types.h"
#include "netlink-util.h"
#include "refcnt.h"
#include "socket-util.h"
#include "util.h"
-1
View File
@@ -12,7 +12,6 @@
#include "netlink-internal.h"
#include "netlink-types.h"
#include "netlink-util.h"
#include "refcnt.h"
#include "socket-util.h"
#include "util.h"
+2 -2
View File
@@ -28,7 +28,7 @@ static int sd_netlink_new(sd_netlink **ret) {
return -ENOMEM;
*rtnl = (sd_netlink) {
.n_ref = REFCNT_INIT,
.n_ref = 1,
.fd = -1,
.sockaddr.nl.nl_family = AF_NETLINK,
.original_pid = getpid_cached(),
@@ -182,7 +182,7 @@ static sd_netlink *netlink_free(sd_netlink *rtnl) {
return mfree(rtnl);
}
DEFINE_ATOMIC_REF_UNREF_FUNC(sd_netlink, sd_netlink, netlink_free);
DEFINE_TRIVIAL_REF_UNREF_FUNC(sd_netlink, sd_netlink, netlink_free);
static void rtnl_seal_message(sd_netlink *rtnl, sd_netlink_message *m) {
assert(rtnl);
+2 -2
View File
@@ -4,6 +4,7 @@
#include "keymap-util.h"
#include "log.h"
#include "string-util.h"
#include "tests.h"
static void test_find_language_fallback(void) {
_cleanup_free_ char *ans = NULL, *ans2 = NULL;
@@ -189,8 +190,7 @@ static void test_x11_convert_to_vconsole(void) {
}
int main(int argc, char **argv) {
log_set_max_level(LOG_DEBUG);
log_parse_environment();
test_setup_logging(LOG_DEBUG);
test_find_language_fallback();
test_find_converted_keymap();
+2 -3
View File
@@ -10,6 +10,7 @@
#include "log.h"
#include "resolved-etc-hosts.h"
#include "strv.h"
#include "tests.h"
#include "tmpfile-util.h"
static void test_parse_etc_hosts_system(void) {
@@ -137,9 +138,7 @@ static void test_parse_file(const char *fname) {
}
int main(int argc, char **argv) {
log_set_max_level(LOG_DEBUG);
log_parse_environment();
log_open();
test_setup_logging(LOG_DEBUG);
if (argc == 1) {
test_parse_etc_hosts_system();
+2 -4
View File
@@ -2,6 +2,7 @@
#include "log.h"
#include "resolved-dns-packet.h"
#include "tests.h"
static void test_dns_packet_new(void) {
size_t i;
@@ -23,10 +24,7 @@ static void test_dns_packet_new(void) {
}
int main(int argc, char **argv) {
log_set_max_level(LOG_DEBUG);
log_parse_environment();
log_open();
test_setup_logging(LOG_DEBUG);
test_dns_packet_new();
+9 -6
View File
@@ -12,11 +12,13 @@
#include "in-addr-util.h"
#include "local-addresses.h"
#include "log.h"
#include "main-func.h"
#include "nss-util.h"
#include "path-util.h"
#include "stdio-util.h"
#include "string-util.h"
#include "strv.h"
#include "tests.h"
static const char* nss_status_to_string(enum nss_status status, char *buf, size_t buf_len) {
switch (status) {
@@ -485,7 +487,7 @@ static int parse_argv(int argc, char **argv,
return 0;
}
int main(int argc, char **argv) {
static int run(int argc, char **argv) {
_cleanup_free_ char *dir = NULL;
_cleanup_strv_free_ char **modules = NULL, **names = NULL;
_cleanup_free_ struct local_address *addresses = NULL;
@@ -493,8 +495,7 @@ int main(int argc, char **argv) {
char **module;
int r;
log_set_max_level(LOG_INFO);
log_parse_environment();
test_setup_logging(LOG_INFO);
r = parse_argv(argc, argv, &modules, &names, &addresses, &n_addresses);
if (r < 0) {
@@ -504,13 +505,15 @@ int main(int argc, char **argv) {
dir = dirname_malloc(argv[0]);
if (!dir)
return EXIT_FAILURE;
return log_oom();
STRV_FOREACH(module, modules) {
r = test_one_module(dir, *module, names, addresses, n_addresses);
if (r < 0)
return EXIT_FAILURE;
return r;
}
return EXIT_SUCCESS;
return 0;
}
DEFINE_MAIN_FUNCTION(run);