network: get rid of more RefCnt usage

A follow-up to 3733eec3e2
This commit is contained in:
Lennart Poettering 2015-08-27 19:56:52 +02:00
parent 86514214e3
commit 9c8e3101ce
5 changed files with 93 additions and 62 deletions

View file

@ -374,9 +374,8 @@ int lldp_mib_add_objects(Prioq *by_expiry,
}
/* Admission Control: Can this port attached to the existing chassis ? */
if (REFCNT_GET(c->n_ref) >= LLDP_MIB_MAX_PORT_PER_CHASSIS) {
log_lldp("Port limit reached. Chassis has: %d ports. Dropping ...",
REFCNT_GET(c->n_ref));
if (c->n_ref >= LLDP_MIB_MAX_PORT_PER_CHASSIS) {
log_lldp("Port limit reached. Chassis has: %d ports. Dropping ...", c->n_ref);
c = NULL;
goto drop;
@ -394,7 +393,7 @@ int lldp_mib_add_objects(Prioq *by_expiry,
/* Attach new port to chassis */
LIST_PREPEND(port, c->ports, p);
REFCNT_INC(c->n_ref);
c->n_ref ++;
p = NULL;
c = NULL;
@ -424,7 +423,8 @@ void lldp_neighbour_port_remove_and_free(lldp_neighbour_port *p) {
lldp_neighbour_port_free(p);
/* Drop the Chassis if no port is attached */
if (REFCNT_DEC(c->n_ref) <= 1) {
c->n_ref --;
if (c->n_ref <= 1) {
hashmap_remove(c->neighbour_mib, &c->chassis_id);
lldp_chassis_free(c);
}
@ -486,7 +486,7 @@ void lldp_chassis_free(lldp_chassis *c) {
if (!c)
return;
if (REFCNT_GET(c->n_ref) > 1)
if (c->n_ref > 1)
return;
free(c->chassis_id.data);
@ -513,7 +513,7 @@ int lldp_chassis_new(tlv_packet *tlv,
if (!c)
return -ENOMEM;
c->n_ref = REFCNT_INIT;
c->n_ref = 1;
c->chassis_id.type = type;
c->chassis_id.length = length;

View file

@ -24,7 +24,6 @@
#include "log.h"
#include "list.h"
#include "refcnt.h"
#include "lldp-tlv.h"
#include "prioq.h"
@ -63,7 +62,7 @@ struct lldp_chassis_id {
};
struct lldp_chassis {
RefCount n_ref;
unsigned n_ref;
lldp_chassis_id chassis_id;

View file

@ -25,7 +25,6 @@
#include <sys/ioctl.h>
#include "socket-util.h"
#include "refcnt.h"
#include "async.h"
#include "dhcp6-internal.h"
@ -47,7 +46,7 @@ enum icmp6_nd_state {
typedef struct ICMP6Prefix ICMP6Prefix;
struct ICMP6Prefix {
RefCount n_ref;
unsigned n_ref;
LIST_FIELDS(ICMP6Prefix, prefixes);
@ -57,7 +56,7 @@ struct ICMP6Prefix {
};
struct sd_icmp6_nd {
RefCount n_ref;
unsigned n_ref;
enum icmp6_nd_state state;
sd_event *event;
@ -78,13 +77,18 @@ struct sd_icmp6_nd {
#define log_icmp6_nd(p, fmt, ...) log_internal(LOG_DEBUG, 0, __FILE__, __LINE__, __func__, "ICMPv6 CLIENT: " fmt, ##__VA_ARGS__)
static ICMP6Prefix *icmp6_prefix_unref(ICMP6Prefix *prefix) {
if (prefix && REFCNT_DEC(prefix->n_ref) <= 0) {
prefix->timeout_valid =
sd_event_source_unref(prefix->timeout_valid);
free(prefix);
}
if (!prefix)
return NULL;
assert(prefix->n_ref > 0);
prefix->n_ref--;
if (prefix->n_ref > 0)
return NULL;
prefix->timeout_valid = sd_event_source_unref(prefix->timeout_valid);
free(prefix);
return NULL;
}
@ -97,7 +101,7 @@ static int icmp6_prefix_new(ICMP6Prefix **ret) {
if (!prefix)
return -ENOMEM;
prefix->n_ref = REFCNT_INIT;
prefix->n_ref = 1;
LIST_INIT(prefixes, prefix);
*ret = prefix;
@ -176,9 +180,12 @@ sd_event *sd_icmp6_nd_get_event(sd_icmp6_nd *nd) {
}
sd_icmp6_nd *sd_icmp6_nd_ref(sd_icmp6_nd *nd) {
assert (nd);
assert_se(REFCNT_INC(nd->n_ref) >= 2);
if (!nd)
return NULL;
assert(nd->n_ref > 0);
nd->n_ref++;
return nd;
}
@ -194,21 +201,28 @@ static int icmp6_nd_init(sd_icmp6_nd *nd) {
}
sd_icmp6_nd *sd_icmp6_nd_unref(sd_icmp6_nd *nd) {
if (nd && REFCNT_DEC(nd->n_ref) == 0) {
ICMP6Prefix *prefix, *p;
ICMP6Prefix *prefix, *p;
icmp6_nd_init(nd);
sd_icmp6_nd_detach_event(nd);
if (!nd)
return NULL;
LIST_FOREACH_SAFE(prefixes, prefix, p, nd->prefixes) {
LIST_REMOVE(prefixes, nd->prefixes, prefix);
assert(nd->n_ref > 0);
nd->n_ref--;
prefix = icmp6_prefix_unref(prefix);
}
if (nd->n_ref > 0)
return NULL;
free(nd);
icmp6_nd_init(nd);
sd_icmp6_nd_detach_event(nd);
LIST_FOREACH_SAFE(prefixes, prefix, p, nd->prefixes) {
LIST_REMOVE(prefixes, nd->prefixes, prefix);
prefix = icmp6_prefix_unref(prefix);
}
free(nd);
return NULL;
}
@ -224,7 +238,7 @@ int sd_icmp6_nd_new(sd_icmp6_nd **ret) {
if (!nd)
return -ENOMEM;
nd->n_ref = REFCNT_INIT;
nd->n_ref = 1;
nd->index = -1;
nd->fd = -1;

View file

@ -26,7 +26,6 @@
#include "util.h"
#include "siphash24.h"
#include "list.h"
#include "refcnt.h"
#include "random-util.h"
#include "ipv4ll-internal.h"
@ -68,7 +67,7 @@ typedef enum IPv4LLState {
} IPv4LLState;
struct sd_ipv4ll {
RefCount n_ref;
unsigned n_ref;
IPv4LLState state;
int index;
@ -598,30 +597,39 @@ int sd_ipv4ll_stop(sd_ipv4ll *ll) {
}
sd_ipv4ll *sd_ipv4ll_ref(sd_ipv4ll *ll) {
if (ll)
assert_se(REFCNT_INC(ll->n_ref) >= 2);
if (!ll)
return NULL;
assert(ll->n_ref >= 1);
ll->n_ref++;
return ll;
}
sd_ipv4ll *sd_ipv4ll_unref(sd_ipv4ll *ll) {
if (ll && REFCNT_DEC(ll->n_ref) == 0) {
ll->receive_message =
sd_event_source_unref(ll->receive_message);
ll->fd = safe_close(ll->fd);
ll->timer = sd_event_source_unref(ll->timer);
sd_ipv4ll_detach_event(ll);
free(ll->random_data);
free(ll->random_data_state);
free(ll);
if (!ll)
return NULL;
}
return ll;
assert(ll->n_ref >= 1);
ll->n_ref--;
if (ll->n_ref > 0)
return ll;
ll->receive_message = sd_event_source_unref(ll->receive_message);
ll->fd = safe_close(ll->fd);
ll->timer = sd_event_source_unref(ll->timer);
sd_ipv4ll_detach_event(ll);
free(ll->random_data);
free(ll->random_data_state);
free(ll);
return NULL;
}
DEFINE_TRIVIAL_CLEANUP_FUNC(sd_ipv4ll*, sd_ipv4ll_unref);
@ -636,7 +644,7 @@ int sd_ipv4ll_new(sd_ipv4ll **ret) {
if (!ll)
return -ENOMEM;
ll->n_ref = REFCNT_INIT;
ll->n_ref = 1;
ll->state = IPV4LL_STATE_INIT;
ll->index = -1;
ll->fd = -1;

View file

@ -36,7 +36,6 @@
#include "random-util.h"
#include "socket-util.h"
#include "async.h"
#include "refcnt.h"
#include "utf8.h"
#define PPPOE_MAX_PACKET_SIZE 1484
@ -68,7 +67,7 @@ typedef struct PPPoETags {
} PPPoETags;
struct sd_pppoe {
RefCount n_ref;
unsigned n_ref;
PPPoEState state;
uint64_t host_uniq;
@ -202,23 +201,34 @@ int sd_pppoe_detach_event(sd_pppoe *ppp) {
}
sd_pppoe *sd_pppoe_ref(sd_pppoe *ppp) {
if (ppp)
assert_se(REFCNT_INC(ppp->n_ref) >= 2);
if (!ppp)
return NULL;
assert(ppp->n_ref > 0);
ppp->n_ref++;
return ppp;
}
sd_pppoe *sd_pppoe_unref(sd_pppoe *ppp) {
if (ppp && REFCNT_DEC(ppp->n_ref) <= 0) {
pppoe_tags_clear(&ppp->tags);
free(ppp->ifname);
free(ppp->service_name);
sd_pppoe_stop(ppp);
sd_pppoe_detach_event(ppp);
free(ppp);
}
if (!ppp)
return NULL;
assert(ppp->n_ref > 0);
ppp->n_ref--;
if (ppp->n_ref > 0)
return NULL;
pppoe_tags_clear(&ppp->tags);
free(ppp->ifname);
free(ppp->service_name);
sd_pppoe_stop(ppp);
sd_pppoe_detach_event(ppp);
free(ppp);
return NULL;
}
@ -231,7 +241,7 @@ int sd_pppoe_new (sd_pppoe **ret) {
if (!ppp)
return -ENOMEM;
ppp->n_ref = REFCNT_INIT;
ppp->n_ref = 1;
ppp->state = _PPPOE_STATE_INVALID;
ppp->ifindex = -1;
ppp->fd = -1;