fort_CFLAGS = -Wall
# Feel free to temporarily remove this one if you're not using gcc 7.3.0.
#fort_CFLAGS += $(GCC_WARNS)
-fort_CFLAGS += -std=gnu99 -O0 -g $(CFLAGS_DEBUG)
+fort_CFLAGS += -std=gnu11 -O0 -g $(CFLAGS_DEBUG)
fort_LDFLAGS = $(LDFLAGS_DEBUG)
fort_LDADD = ${JANSSON_LIBS}
pdu: Protocol Data Unit (RFC 6810)
pr: print
ptr: pointer
+refget: reference get (+1 to reference counter)
+refput: reference put (-1 to reference counter)
str: string
tmp: temporal
uint: unsigned int
#include "rtr/db/delta.h"
+#include <stdatomic.h>
#include "data_structure/array_list.h"
struct delta_v4 {
struct deltas_v6 removes;
} v6;
- /* TODO (now) atomic */
- unsigned int references;
+ atomic_uint references;
};
int
deltas_v4_init(&result->v4.removes);
deltas_v6_init(&result->v6.adds);
deltas_v6_init(&result->v6.removes);
- result->references = 1;
+ atomic_init(&result->references, 1);
*_result = result;
return 0;
}
void
-deltas_get(struct deltas *deltas)
+deltas_refget(struct deltas *deltas)
{
- deltas->references++;
+ atomic_fetch_add(&deltas->references, 1);
}
void
-deltas_put(struct deltas *deltas)
+deltas_refput(struct deltas *deltas)
{
- deltas->references--;
- if (deltas->references == 0) {
+ /*
+ * Reminder: atomic_fetch_sub() returns the previous value, not the
+ * resulting one.
+ */
+ if (atomic_fetch_sub(&deltas->references, 1) == 1) {
deltas_v4_cleanup(&deltas->v4.adds, NULL);
deltas_v4_cleanup(&deltas->v4.removes, NULL);
deltas_v6_cleanup(&deltas->v6.adds, NULL);
struct deltas;
int deltas_create(struct deltas **);
-void deltas_get(struct deltas *);
-void deltas_put(struct deltas *);
+void deltas_refget(struct deltas *);
+void deltas_refput(struct deltas *);
int deltas_add_roa_v4(struct deltas *, uint32_t, struct v4_address *, int);
int deltas_add_roa_v6(struct deltas *, uint32_t, struct v6_address *, int);
return 0;
fail:
- deltas_put(deltas);
+ deltas_refput(deltas);
return error;
}
void
deltagroup_cleanup(struct delta_group *group)
{
- deltas_put(group->deltas);
+ deltas_refput(group->deltas);
}
int
memcpy(tmp, start, db->len * sizeof(struct delta_group));
/* Release memory allocated */
for (ptr = db->array; ptr < start; ptr++)
- deltas_put(ptr->deltas);
+ deltas_refput(ptr->deltas);
free(db->array);
db->array = tmp;
}
min_serial = clients_get_min_serial();
- /** Assume is ordered by serial, so get the new initial pointer */
+ /* Assume is ordered by serial, so get the new initial pointer */
ARRAYLIST_FOREACH(&state.deltas, group, i)
if (group->serial >= min_serial)
break;
- /** Is the first element or reached end, nothing to purge */
+ /* Is the first element or reached end, nothing to purge */
if (group == state.deltas.array ||
(group - state.deltas.array) == state.deltas.len)
return;
*/
old_base = state.base;
- /** Remove unnecessary deltas */
+ /* Remove unnecessary deltas */
vrps_purge();
} else {
return 0;
revert_deltas:
- deltas_put(deltas);
+ deltas_refput(deltas);
revert_base:
roa_table_destroy(new_base);
return error;
return error;
}
- deltas_get(group->deltas);
+ deltas_refget(group->deltas);
*to = group->serial;
}