return mfree(req);
}
-DEFINE_TRIVIAL_CLEANUP_FUNC(Request*, request_free);
+DEFINE_TRIVIAL_REF_UNREF_FUNC(Request, request, request_free);
void request_drop(Request *req) {
if (!req)
if (req->message_counter)
(*req->message_counter)--;
- request_free(req);
+ request_unref(req);
}
static void request_hash_func(const Request *req, struct siphash *state) {
Request,
request_hash_func,
request_compare_func,
- request_free);
+ request_unref);
int netdev_queue_request(
NetDev *netdev,
Request **ret) {
- _cleanup_(request_freep) Request *req = NULL;
+ _cleanup_(request_unrefp) Request *req = NULL;
Request *existing;
int r;
return -ENOMEM;
*req = (Request) {
+ .n_ref = 1,
.netdev = netdev_ref(netdev),
.type = REQUEST_TYPE_NETDEV_INDEPENDENT,
.consume_object = true,
link_netlink_message_handler_t netlink_handler,
Request **ret) {
- _cleanup_(request_freep) Request *req = NULL;
+ _cleanup_(request_unrefp) Request *req = NULL;
Request *existing;
int r;
}
*req = (Request) {
+ .n_ref = 1,
.link = link_ref(link),
.type = type,
.object = object,
link_enter_failed(req->link);
} else if (r > 0) {
ordered_set_remove(manager->request_queue, req);
- request_free(req);
+ request_unref(req);
processed = true;
}
}
} RequestType;
typedef struct Request {
+ unsigned n_ref;
+
Link *link;
RequestType type;
bool consume_object;
link_netlink_message_handler_t netlink_handler;
} Request;
+Request *request_ref(Request *req);
+Request *request_unref(Request *req);
+DEFINE_TRIVIAL_CLEANUP_FUNC(Request*, request_unref);
+
void request_drop(Request *req);
int netdev_queue_request(