X-Git-Url: http://git.lttng.org/?a=blobdiff_plain;f=liblttng-ust-comm%2Flttng-ust-comm.c;h=543465edf2fe2e2ee703a0d62e1b4c800d5d2f0d;hb=fb31eb73d8a4a6d9784ed5c335b7fa3b9684108c;hp=4e9de57bd0d48e20840b1c168a4e76309f94ad45;hpb=735ea6a81120f85d94666245f24aac233519568e;p=lttng-ust.git diff --git a/liblttng-ust-comm/lttng-ust-comm.c b/liblttng-ust-comm/lttng-ust-comm.c index 4e9de57b..543465ed 100644 --- a/liblttng-ust-comm/lttng-ust-comm.c +++ b/liblttng-ust-comm/lttng-ust-comm.c @@ -19,6 +19,7 @@ #define _GNU_SOURCE #include +#include #include #include #include @@ -33,6 +34,7 @@ #include #include +#include #include #include #include @@ -94,8 +96,10 @@ const char *lttng_ust_strerror(int code) * ustcomm_connect_unix_sock * * Connect to unix socket using the path name. + * + * Caller handles FD tracker. */ -int ustcomm_connect_unix_sock(const char *pathname) +int ustcomm_connect_unix_sock(const char *pathname, long timeout) { struct sockaddr_un sun; int fd, ret; @@ -110,6 +114,15 @@ int ustcomm_connect_unix_sock(const char *pathname) ret = -errno; goto error; } + if (timeout >= 0) { + /* Give at least 10ms. */ + if (timeout < 10) + timeout = 10; + ret = ustcomm_setsockopt_snd_timeout(fd, timeout); + if (ret < 0) { + WARN("Error setting connect socket send timeout"); + } + } ret = fcntl(fd, F_SETFD, FD_CLOEXEC); if (ret < 0) { PERROR("fcntl"); @@ -248,16 +261,22 @@ int ustcomm_listen_unix_sock(int sock) * ustcomm_close_unix_sock * * Shutdown cleanly a unix socket. + * + * Handles fd tracker internally. */ int ustcomm_close_unix_sock(int sock) { int ret; + lttng_ust_lock_fd_tracker(); ret = close(sock); - if (ret < 0) { + if (!ret) { + lttng_ust_delete_fd_from_tracker(sock); + } else { PERROR("close"); ret = -errno; } + lttng_ust_unlock_fd_tracker(); return ret; } @@ -580,7 +599,7 @@ ssize_t ustcomm_recv_channel_from_sessiond(int sock, { void *chan_data; ssize_t len, nr_fd; - int wakeup_fd; + int wakeup_fd, ret; if (var_len > LTTNG_UST_CHANNEL_DATA_MAX_LEN) { len = -EINVAL; @@ -597,8 +616,10 @@ ssize_t ustcomm_recv_channel_from_sessiond(int sock, goto error_recv; } /* recv wakeup fd */ + lttng_ust_lock_fd_tracker(); nr_fd = ustcomm_recv_fds_unix_sock(sock, &wakeup_fd, 1); if (nr_fd <= 0) { + lttng_ust_unlock_fd_tracker(); if (nr_fd < 0) { len = nr_fd; goto error_recv; @@ -607,7 +628,21 @@ ssize_t ustcomm_recv_channel_from_sessiond(int sock, goto error_recv; } } - *_wakeup_fd = wakeup_fd; + + ret = lttng_ust_add_fd_to_tracker(wakeup_fd); + if (ret < 0) { + lttng_ust_unlock_fd_tracker(); + ret = close(wakeup_fd); + if (ret) { + PERROR("close on wakeup_fd"); + } + len = -EIO; + goto error_recv; + } + + *_wakeup_fd = ret; + lttng_ust_unlock_fd_tracker(); + *_chan_data = chan_data; return len; @@ -627,8 +662,10 @@ int ustcomm_recv_stream_from_sessiond(int sock, int fds[2]; /* recv shm fd and wakeup fd */ + lttng_ust_lock_fd_tracker(); len = ustcomm_recv_fds_unix_sock(sock, fds, 2); if (len <= 0) { + lttng_ust_unlock_fd_tracker(); if (len < 0) { ret = len; goto error; @@ -637,8 +674,36 @@ int ustcomm_recv_stream_from_sessiond(int sock, goto error; } } - *shm_fd = fds[0]; - *wakeup_fd = fds[1]; + + ret = lttng_ust_add_fd_to_tracker(fds[0]); + if (ret < 0) { + lttng_ust_unlock_fd_tracker(); + ret = close(fds[0]); + if (ret) { + PERROR("close on received shm_fd"); + } + ret = -EIO; + goto error; + } + *shm_fd = ret; + + ret = lttng_ust_add_fd_to_tracker(fds[1]); + if (ret < 0) { + lttng_ust_unlock_fd_tracker(); + ret = close(*shm_fd); + if (ret) { + PERROR("close on shm_fd"); + } + *shm_fd = -1; + ret = close(fds[1]); + if (ret) { + PERROR("close on received wakeup_fd"); + } + ret = -EIO; + goto error; + } + *wakeup_fd = ret; + lttng_ust_unlock_fd_tracker(); return 0; error: @@ -789,12 +854,15 @@ static int serialize_integer_type(struct ustctl_integer_type *uit, const struct lttng_integer_type *lit) { + int32_t encoding; + uit->size = lit->size; uit->signedness = lit->signedness; uit->reverse_byte_order = lit->reverse_byte_order; uit->base = lit->base; - if (serialize_string_encoding(&uit->encoding, lit->encoding)) + if (serialize_string_encoding(&encoding, lit->encoding)) return -EINVAL; + uit->encoding = encoding; uit->alignment = lit->alignment; return 0; } @@ -816,9 +884,11 @@ int serialize_basic_type(struct lttng_session *session, } case atype_string: { - if (serialize_string_encoding(&ubt->string.encoding, - lbt->string.encoding)) + int32_t encoding; + + if (serialize_string_encoding(&encoding, lbt->string.encoding)) return -EINVAL; + ubt->string.encoding = encoding; *uatype = ustctl_atype_string; break; } @@ -847,8 +917,7 @@ int serialize_basic_type(struct lttng_session *session, if (session) { const struct lttng_enum *_enum; - _enum = lttng_ust_enum_get(session, - lbt->enumeration.desc->name); + _enum = lttng_ust_enum_get_from_desc(session, lbt->enumeration.desc); if (!_enum) return -EINVAL; ubt->enumeration.id = _enum->id; @@ -944,13 +1013,15 @@ int serialize_one_field(struct lttng_session *session, { struct ustctl_field *uf = &fields[*iter_output]; struct ustctl_type *ut = &uf->type; + enum ustctl_abstract_types atype; strncpy(uf->name, lf->name, LTTNG_UST_SYM_NAME_LEN); uf->name[LTTNG_UST_SYM_NAME_LEN - 1] = '\0'; - ret = serialize_basic_type(session, &ut->atype, lt->atype, + ret = serialize_basic_type(session, &atype, lt->atype, &ut->u.basic, <->u.basic); if (ret) return ret; + ut->atype = atype; (*iter_output)++; break; } @@ -960,6 +1031,7 @@ int serialize_one_field(struct lttng_session *session, struct ustctl_type *ut = &uf->type; struct ustctl_basic_type *ubt; const struct lttng_basic_type *lbt; + enum ustctl_abstract_types atype; strncpy(uf->name, lf->name, LTTNG_UST_SYM_NAME_LEN); uf->name[LTTNG_UST_SYM_NAME_LEN - 1] = '\0'; @@ -967,10 +1039,11 @@ int serialize_one_field(struct lttng_session *session, ubt = &ut->u.array.elem_type; lbt = <->u.array.elem_type; ut->u.array.length = lt->u.array.length; - ret = serialize_basic_type(session, &ubt->atype, lbt->atype, + ret = serialize_basic_type(session, &atype, lbt->atype, &ubt->u.basic, &lbt->u.basic); if (ret) return -EINVAL; + ubt->atype = atype; ut->atype = ustctl_atype_array; (*iter_output)++; break; @@ -981,6 +1054,7 @@ int serialize_one_field(struct lttng_session *session, struct ustctl_type *ut = &uf->type; struct ustctl_basic_type *ubt; const struct lttng_basic_type *lbt; + enum ustctl_abstract_types atype; int ret; strncpy(uf->name, lf->name, LTTNG_UST_SYM_NAME_LEN); @@ -988,16 +1062,18 @@ int serialize_one_field(struct lttng_session *session, uf->type.atype = ustctl_atype_sequence; ubt = &ut->u.sequence.length_type; lbt = <->u.sequence.length_type; - ret = serialize_basic_type(session, &ubt->atype, lbt->atype, + ret = serialize_basic_type(session, &atype, lbt->atype, &ubt->u.basic, &lbt->u.basic); if (ret) return -EINVAL; + ubt->atype = atype; ubt = &ut->u.sequence.elem_type; lbt = <->u.sequence.elem_type; - ret = serialize_basic_type(session, &ubt->atype, lbt->atype, + ret = serialize_basic_type(session, &atype, lbt->atype, &ubt->u.basic, &lbt->u.basic); if (ret) return -EINVAL; + ubt->atype = atype; ut->atype = ustctl_atype_sequence; (*iter_output)++; break; @@ -1094,6 +1170,11 @@ int serialize_entries(struct ustctl_enum_entry **_entries, uentry->end.signedness = lentry->end.signedness; strncpy(uentry->string, lentry->string, LTTNG_UST_SYM_NAME_LEN); uentry->string[LTTNG_UST_SYM_NAME_LEN - 1] = '\0'; + + if (lentry->u.extra.options & LTTNG_ENUM_ENTRY_OPTION_IS_AUTO) { + uentry->u.extra.options |= + USTCTL_UST_ENUM_ENTRY_OPTION_IS_AUTO; + } } *_entries = entries; return 0;