Skip to content

Commit

Permalink
libobs/util: Split buffered writer queue into chunks
Browse files Browse the repository at this point in the history
  • Loading branch information
derrod committed Apr 28, 2024
1 parent edd063d commit 50f9ce9
Showing 1 changed file with 42 additions and 5 deletions.
47 changes: 42 additions & 5 deletions libobs/util/buffered-file-serializer.c
Original file line number Diff line number Diff line change
Expand Up @@ -179,11 +179,19 @@ static void *io_thread(void *opaque)
next_seek_position + chunk_used;

want_seek = false;

// If we did a seek but do not have any data left to write
// break out here.
if (!chunk_used) {
force_flush_chunk = false;
break;
}
}

if (!chunk_used) {
blog(LOG_WARNING,
"Attempted flushing empty chunk");
blog(LOG_ERROR, "Tried to write 0-byte chunk!");
os_atomic_set_bool(&out->io.output_error, true);
goto error;
}

// Write the current chunk to the output file
Expand Down Expand Up @@ -248,10 +256,9 @@ static int64_t file_output_seek(void *opaque, int64_t offset,
return (int64_t)out->io.next_pos;
}

static size_t file_output_write(void *opaque, const void *buf, size_t buf_size)
static inline size_t enqueue_chunk(struct file_output_data *out,
const void *buf, size_t buf_size)
{
struct file_output_data *out = opaque;

// If the output thread failed, signal that back up the stack
if (os_atomic_load_bool(&out->io.output_error))
return 0;
Expand Down Expand Up @@ -292,6 +299,36 @@ static size_t file_output_write(void *opaque, const void *buf, size_t buf_size)
return buf_size;
}

static size_t file_output_write(void *opaque, const void *buf, size_t buf_size)
{
struct file_output_data *out = opaque;

if (!buf_size)
return 0;

if (buf_size <= out->io.chunk_size) {
enqueue_chunk(out, buf, buf_size);
} else {
// Split writes into at most chunk_size chunks
uintptr_t ptr = (uintptr_t)buf;
size_t remaining = buf_size;

while (remaining) {
size_t chunk_size = remaining > out->io.chunk_size
? out->io.chunk_size
: remaining;

if (!enqueue_chunk(out, (const void *)ptr, buf_size))
return 0;

remaining -= chunk_size;
ptr += chunk_size;
}
}

return buf_size;
}

static int64_t file_output_get_pos(void *opaque)
{
struct file_output_data *out = opaque;
Expand Down

0 comments on commit 50f9ce9

Please sign in to comment.