};
struct udev_ctrl_msg {
- int refcount;
+ unsigned n_ref;
struct udev_ctrl_connection *conn;
struct udev_ctrl_msg_wire ctrl_msg_wire;
};
struct udev_ctrl {
- int refcount;
+ unsigned n_ref;
int sock;
union sockaddr_union saddr;
socklen_t addrlen;
};
struct udev_ctrl_connection {
- int refcount;
+ unsigned n_ref;
struct udev_ctrl *uctrl;
int sock;
};
uctrl = new0(struct udev_ctrl, 1);
if (uctrl == NULL)
return NULL;
- uctrl->refcount = 1;
+ uctrl->n_ref = 1;
if (fd < 0) {
uctrl->sock = socket(AF_LOCAL, SOCK_SEQPACKET|SOCK_NONBLOCK|SOCK_CLOEXEC, 0);
return 0;
}
-static struct udev_ctrl *udev_ctrl_ref(struct udev_ctrl *uctrl) {
- if (uctrl)
- uctrl->refcount++;
+static struct udev_ctrl *udev_ctrl_free(struct udev_ctrl *uctrl) {
+ assert(uctrl);
- return uctrl;
+ safe_close(uctrl->sock);
+ return mfree(uctrl);
}
-struct udev_ctrl *udev_ctrl_unref(struct udev_ctrl *uctrl) {
- if (uctrl && -- uctrl->refcount == 0) {
- if (uctrl->sock >= 0)
- close(uctrl->sock);
- free(uctrl);
- }
-
- return NULL;
-}
+DEFINE_PRIVATE_TRIVIAL_REF_FUNC(struct udev_ctrl, udev_ctrl);
+DEFINE_TRIVIAL_UNREF_FUNC(struct udev_ctrl, udev_ctrl, udev_ctrl_free);
int udev_ctrl_cleanup(struct udev_ctrl *uctrl) {
if (uctrl == NULL)
conn = new(struct udev_ctrl_connection, 1);
if (conn == NULL)
return NULL;
- conn->refcount = 1;
+ conn->n_ref = 1;
conn->uctrl = uctrl;
conn->sock = accept4(uctrl->sock, NULL, NULL, SOCK_CLOEXEC|SOCK_NONBLOCK);
return mfree(conn);
}
-struct udev_ctrl_connection *udev_ctrl_connection_ref(struct udev_ctrl_connection *conn) {
- if (conn == NULL)
- return NULL;
- conn->refcount++;
- return conn;
-}
-
-struct udev_ctrl_connection *udev_ctrl_connection_unref(struct udev_ctrl_connection *conn) {
- if (conn && -- conn->refcount == 0) {
- if (conn->sock >= 0)
- close(conn->sock);
+static struct udev_ctrl_connection *udev_ctrl_connection_free(struct udev_ctrl_connection *conn) {
+ assert(conn);
- udev_ctrl_unref(conn->uctrl);
-
- free(conn);
- }
-
- return NULL;
+ safe_close(conn->sock);
+ udev_ctrl_unref(conn->uctrl);
+ return mfree(conn);
}
+DEFINE_TRIVIAL_REF_UNREF_FUNC(struct udev_ctrl_connection, udev_ctrl_connection, udev_ctrl_connection_free);
+
static int ctrl_send(struct udev_ctrl *uctrl, enum udev_ctrl_msg_type type, int intval, const char *buf, int timeout) {
struct udev_ctrl_msg_wire ctrl_msg_wire;
int err = 0;
uctrl_msg = new0(struct udev_ctrl_msg, 1);
if (uctrl_msg == NULL)
return NULL;
- uctrl_msg->refcount = 1;
+ uctrl_msg->n_ref = 1;
uctrl_msg->conn = conn;
udev_ctrl_connection_ref(conn);
return NULL;
}
-struct udev_ctrl_msg *udev_ctrl_msg_unref(struct udev_ctrl_msg *ctrl_msg) {
- if (ctrl_msg && -- ctrl_msg->refcount == 0) {
- udev_ctrl_connection_unref(ctrl_msg->conn);
- free(ctrl_msg);
- }
+static struct udev_ctrl_msg *udev_ctrl_msg_free(struct udev_ctrl_msg *ctrl_msg) {
+ assert(ctrl_msg);
- return NULL;
+ udev_ctrl_connection_unref(ctrl_msg->conn);
+ return mfree(ctrl_msg);
}
+DEFINE_TRIVIAL_UNREF_FUNC(struct udev_ctrl_msg, udev_ctrl_msg, udev_ctrl_msg_free);
+
int udev_ctrl_get_set_log_level(struct udev_ctrl_msg *ctrl_msg) {
if (ctrl_msg->ctrl_msg_wire.type == UDEV_CTRL_SET_LOG_LEVEL)
return ctrl_msg->ctrl_msg_wire.intval;