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_unlock(&rstream->viewer_stream_rotation_lock);
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);
+ pthread_mutex_unlock(&rstream->viewer_stream_rotation_lock);
if (read_ret < 0) {
viewer_index.status = htobe32(LTTNG_VIEWER_INDEX_HUP);
viewer_stream_delete(vstream);
/*
* 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,
goto end;
}
- /*
- * 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.
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) {