/* * If sock is negative, it means we don't have to notify the other side * (e.g. application has already vanished). */ int ustctl_release_object(int sock, struct lttng_ust_object_data *data) { int ret; if (!data) return -EINVAL; switch (data->type) { case LTTNG_UST_OBJECT_TYPE_CHANNEL: if (data->u.channel.wakeup_fd >= 0) { ret = close(data->u.channel.wakeup_fd); if (ret < 0) { ret = -errno; return ret; } } free(data->u.channel.data); break; case LTTNG_UST_OBJECT_TYPE_STREAM: if (data->u.stream.shm_fd >= 0) { ret = close(data->u.stream.shm_fd); if (ret < 0) { ret = -errno; return ret; } } if (data->u.stream.wakeup_fd >= 0) { ret = close(data->u.stream.wakeup_fd); if (ret < 0) { ret = -errno; return ret; } } break; case LTTNG_UST_OBJECT_TYPE_EVENT: case LTTNG_UST_OBJECT_TYPE_CONTEXT: break; default: assert(0); } return ustctl_release_handle(sock, data->handle); }
/* * If sock is negative, it means we don't have to notify the other side * (e.g. application has already vanished). */ int ustctl_release_object(int sock, struct lttng_ust_object_data *data) { int ret; if (!data) return -EINVAL; if (data->shm_fd >= 0) { ret = close(data->shm_fd); if (ret < 0) { return ret; } } if (data->wait_fd >= 0) { ret = close(data->wait_fd); if (ret < 0) { return ret; } } return ustctl_release_handle(sock, data->handle); }