return mfree(g);
}
+DEFINE_TRIVIAL_CLEANUP_FUNC(JournalRateLimitGroup*, journal_ratelimit_group_free);
+
void journal_ratelimit_free(JournalRateLimit *r) {
assert(r);
journal_ratelimit_group_free(r->lru_tail);
}
-static JournalRateLimitGroup* journal_ratelimit_group_new(
+static int journal_ratelimit_group_new(
JournalRateLimit *rl,
const char *id,
usec_t interval,
- usec_t ts) {
+ usec_t ts,
+ JournalRateLimitGroup **ret) {
- JournalRateLimitGroup *g;
+ _cleanup_(journal_ratelimit_group_freep) JournalRateLimitGroup *g = NULL;
assert(rl);
assert(id);
+ assert(ret);
- g = new0(JournalRateLimitGroup, 1);
+ g = new(JournalRateLimitGroup, 1);
if (!g)
- return NULL;
+ return -ENOMEM;
- g->id = strdup(id);
+ *g = (JournalRateLimitGroup) {
+ .id = strdup(id),
+ .hash = siphash24_string(id, rl->hash_key),
+ .interval = interval,
+ };
if (!g->id)
- goto fail;
-
- g->hash = siphash24_string(g->id, rl->hash_key);
-
- g->interval = interval;
+ return -ENOMEM;
journal_ratelimit_vacuum(rl, ts);
rl->n_groups++;
g->parent = rl;
- return g;
-fail:
- journal_ratelimit_group_free(g);
- return NULL;
+ *ret = TAKE_PTR(g);
+ return 0;
}
static unsigned burst_modulate(unsigned burst, uint64_t available) {
unsigned burst;
uint64_t h;
usec_t ts;
+ int r;
assert(id);
}
if (!found) {
- found = journal_ratelimit_group_new(rl, id, rl_interval, ts);
- if (!found)
- return -ENOMEM;
+ r = journal_ratelimit_group_new(rl, id, rl_interval, ts, &found);
+ if (r < 0)
+ return r;
} else
found->interval = rl_interval;