The overwrite_lock is nested inside the viewer_stream_rotation_lock.
And the viewer_stream_rotate function is always called with the
viewer_stream_rotation_lock held.
Signed-off-by: Julien Desfossez <jdesfossez@efficios.com>
Signed-off-by: David Goulet <dgoulet@efficios.com>
viewer_index.flags |= LTTNG_VIEWER_FLAG_NEW_STREAM;
}
viewer_index.flags |= LTTNG_VIEWER_FLAG_NEW_STREAM;
}
+ pthread_mutex_lock(&rstream->viewer_stream_rotation_lock);
pthread_mutex_lock(&vstream->overwrite_lock);
if (vstream->abort_flag) {
/* The file is being overwritten by the writer, we cannot use it. */
pthread_mutex_unlock(&vstream->overwrite_lock);
ret = viewer_stream_rotate(vstream, rstream);
pthread_mutex_lock(&vstream->overwrite_lock);
if (vstream->abort_flag) {
/* The file is being overwritten by the writer, we cannot use it. */
pthread_mutex_unlock(&vstream->overwrite_lock);
ret = viewer_stream_rotate(vstream, rstream);
+ pthread_mutex_unlock(&rstream->viewer_stream_rotation_lock);
if (ret < 0) {
goto end_unlock;
} else if (ret == 1) {
if (ret < 0) {
goto end_unlock;
} else if (ret == 1) {
read_ret = lttng_read(vstream->index_read_fd, &packet_index,
sizeof(packet_index));
pthread_mutex_unlock(&vstream->overwrite_lock);
read_ret = lttng_read(vstream->index_read_fd, &packet_index,
sizeof(packet_index));
pthread_mutex_unlock(&vstream->overwrite_lock);
+ pthread_mutex_unlock(&rstream->viewer_stream_rotation_lock);
if (read_ret < 0) {
viewer_index.status = htobe32(LTTNG_VIEWER_INDEX_HUP);
viewer_stream_delete(vstream);
if (read_ret < 0) {
viewer_index.status = htobe32(LTTNG_VIEWER_INDEX_HUP);
viewer_stream_delete(vstream);
/*
* Rotate a stream to the next tracefile.
*
/*
* Rotate a stream to the next tracefile.
*
+ * Must be called with viewer_stream_rotation_lock held.
* Returns 0 on success, 1 on EOF, a negative value on error.
*/
int viewer_stream_rotate(struct relay_viewer_stream *vstream,
* Returns 0 on success, 1 on EOF, a negative value on error.
*/
int viewer_stream_rotate(struct relay_viewer_stream *vstream,
- /*
- * Lock to execute rotation in order to avoid races between a modification
- * on the index values.
- */
- pthread_mutex_lock(&stream->viewer_stream_rotation_lock);
-
/*
* The writer and the reader are not working in the same tracefile, we can
* read up to EOF, we don't care about the total_index_received.
/*
* The writer and the reader are not working in the same tracefile, we can
* read up to EOF, we don't care about the total_index_received.
vstream->abort_flag = 0;
pthread_mutex_unlock(&vstream->overwrite_lock);
vstream->abort_flag = 0;
pthread_mutex_unlock(&vstream->overwrite_lock);
- pthread_mutex_unlock(&stream->viewer_stream_rotation_lock);
-
ret = index_open(vstream->path_name, vstream->channel_name,
vstream->tracefile_count, vstream->tracefile_count_current);
if (ret < 0) {
ret = index_open(vstream->path_name, vstream->channel_name,
vstream->tracefile_count, vstream->tracefile_count_current);
if (ret < 0) {