diff options
| author | dec05eba <dec05eba@protonmail.com> | 2026-08-06 13:02:59 +0200 |
|---|---|---|
| committer | dec05eba <dec05eba@protonmail.com> | 2026-08-06 13:02:59 +0200 |
| commit | e31968fc4074df739c00947b993ee19be4ef1caa (patch) | |
| tree | 57f2d57cd9392bf28fe57e82bc25017a4c4d9d59 /src | |
| parent | 5db30f3fb99545524fc80f87ecc488972aec1711 (diff) | |
Faster shutdown time when several gb of replay data is in ram
Diffstat (limited to 'src')
| -rw-r--r-- | src/cli/main.c | 2 | ||||
| -rw-r--r-- | src/encoder/encoder.c | 13 | ||||
| -rw-r--r-- | src/recorder/recorder.c | 6 | ||||
| -rw-r--r-- | src/replay_buffer/replay_buffer.c | 5 | ||||
| -rw-r--r-- | src/replay_buffer/replay_buffer_disk.c | 2 | ||||
| -rw-r--r-- | src/replay_buffer/replay_buffer_ram.c | 6 |
6 files changed, 25 insertions, 9 deletions
diff --git a/src/cli/main.c b/src/cli/main.c index ac7de24..aaa315c 100644 --- a/src/cli/main.c +++ b/src/cli/main.c @@ -500,7 +500,7 @@ static int record(args_parser *arg_parser, gsr_windowing *windowing, gsr_capture gsr_ipc_complete_request(ipc, GSR_IPC_DEFERRED_REQUEST_STOP, true, arg_parser->settings.is_replaying ? NULL : arg_parser->settings.filename); gsr_ipc_stop(ipc); - gsr_recorder_destroy(recorder); + gsr_recorder_destroy(recorder, true); recorder = NULL; return run_result; } diff --git a/src/encoder/encoder.c b/src/encoder/encoder.c index 3aebb7a..e9b71d7 100644 --- a/src/encoder/encoder.c +++ b/src/encoder/encoder.c @@ -44,14 +44,14 @@ bool gsr_encoder_init(gsr_encoder *self, gsr_replay_storage replay_storage, size if(pthread_mutex_init(&self->file_write_mutex, NULL) != 0) { gsr_log(GSR_LOG_LEVEL_ERROR, "gsr_encoder_init: failed to create mutex"); - gsr_encoder_deinit(self); + gsr_encoder_deinit(self, false); return false; } self->file_write_mutex_created = true; if(pthread_mutex_init(&self->replay_mutex, NULL) != 0) { gsr_log(GSR_LOG_LEVEL_ERROR, "gsr_encoder_init: failed to create mutex"); - gsr_encoder_deinit(self); + gsr_encoder_deinit(self, false); return false; } self->replay_mutex_created = true; @@ -60,7 +60,7 @@ bool gsr_encoder_init(gsr_encoder *self, gsr_replay_storage replay_storage, size self->replay_buffer = gsr_replay_buffer_create(replay_storage, replay_directory, replay_buffer_time, replay_buffer_num_packets); if(!self->replay_buffer) { gsr_log(GSR_LOG_LEVEL_ERROR, "gsr_encoder_init: failed to create replay buffer"); - gsr_encoder_deinit(self); + gsr_encoder_deinit(self, false); return false; } } @@ -68,7 +68,7 @@ bool gsr_encoder_init(gsr_encoder *self, gsr_replay_storage replay_storage, size return true; } -void gsr_encoder_deinit(gsr_encoder *self) { +void gsr_encoder_deinit(gsr_encoder *self, bool exiting) { if(self->file_write_mutex_created) pthread_mutex_lock(&self->file_write_mutex); for(size_t i = 0; i < self->num_recording_destinations; ++i) { @@ -81,7 +81,10 @@ void gsr_encoder_deinit(gsr_encoder *self) { if(self->replay_buffer) { pthread_mutex_lock(&self->replay_mutex); - gsr_replay_buffer_destroy(self->replay_buffer); + if(exiting) + gsr_replay_buffer_destroy_at_exit(self->replay_buffer); + else + gsr_replay_buffer_destroy(self->replay_buffer); self->replay_buffer = NULL; pthread_mutex_unlock(&self->replay_mutex); } diff --git a/src/recorder/recorder.c b/src/recorder/recorder.c index 949ed99..f24495c 100644 --- a/src/recorder/recorder.c +++ b/src/recorder/recorder.c @@ -450,7 +450,7 @@ gsr_recorder* gsr_recorder_create(const gsr_recorder_params *params, const gsr_r fail: *error = error_code; - gsr_recorder_destroy(self); + gsr_recorder_destroy(self, false); return NULL; } @@ -892,7 +892,7 @@ static void gsr_recorder_stop_recording(gsr_recorder *self) { self->callbacks.recording_stopped(self->settings.filename, self->callbacks.userdata); } -void gsr_recorder_destroy(gsr_recorder *self) { +void gsr_recorder_destroy(gsr_recorder *self, bool exiting) { if(!self) return; @@ -909,7 +909,7 @@ void gsr_recorder_destroy(gsr_recorder *self) { gsr_video_encoder_destroy(self->video_encoder, self->video_codec_context); if(self->encoder_initialized) - gsr_encoder_deinit(&self->encoder); + gsr_encoder_deinit(&self->encoder, exiting); gsr_video_sources_deinit(&self->video_sources_data); diff --git a/src/replay_buffer/replay_buffer.c b/src/replay_buffer/replay_buffer.c index 458b359..4958bba 100644 --- a/src/replay_buffer/replay_buffer.c +++ b/src/replay_buffer/replay_buffer.c @@ -22,6 +22,11 @@ void gsr_replay_buffer_destroy(gsr_replay_buffer *self) { free(self); } +void gsr_replay_buffer_destroy_at_exit(gsr_replay_buffer *self) { + self->destroy_at_exit(self); + /* |self| is intentionally not free'd, the operating system does that when the process exits */ +} + bool gsr_replay_buffer_append(gsr_replay_buffer *self, const AVPacket *av_packet, double timestamp) { return self->append(self, av_packet, timestamp); } diff --git a/src/replay_buffer/replay_buffer_disk.c b/src/replay_buffer/replay_buffer_disk.c index 56244f9..da82df5 100644 --- a/src/replay_buffer/replay_buffer_disk.c +++ b/src/replay_buffer/replay_buffer_disk.c @@ -423,6 +423,8 @@ static void get_current_time(char *time_str, size_t time_str_size) { static void gsr_replay_buffer_disk_set_impl_funcs(gsr_replay_buffer_disk *self) { self->replay_buffer.destroy = gsr_replay_buffer_disk_destroy; + /* The files and the directory have to be removed even when the process exits */ + self->replay_buffer.destroy_at_exit = gsr_replay_buffer_disk_destroy; self->replay_buffer.append = gsr_replay_buffer_disk_append; self->replay_buffer.clear = gsr_replay_buffer_disk_clear; self->replay_buffer.iterator_get_packet = gsr_replay_buffer_disk_iterator_get_packet; diff --git a/src/replay_buffer/replay_buffer_ram.c b/src/replay_buffer/replay_buffer_ram.c index 680517d..ce3914b 100644 --- a/src/replay_buffer/replay_buffer_ram.c +++ b/src/replay_buffer/replay_buffer_ram.c @@ -70,6 +70,11 @@ static void gsr_replay_buffer_ram_destroy(gsr_replay_buffer *replay_buffer) { self->index = 0; } +/* The replay buffer only holds memory, which the operating system frees when the process exits */ +static void gsr_replay_buffer_ram_destroy_at_exit(gsr_replay_buffer *replay_buffer) { + (void)replay_buffer; +} + static bool gsr_replay_buffer_ram_append(gsr_replay_buffer *replay_buffer, const AVPacket *av_packet, double timestamp) { gsr_replay_buffer_ram *self = (gsr_replay_buffer_ram*)replay_buffer; gsr_av_packet_ram *packet = gsr_av_packet_ram_create(av_packet, timestamp); @@ -231,6 +236,7 @@ static bool gsr_replay_buffer_ram_iterator_next(gsr_replay_buffer *replay_buffer static void gsr_replay_buffer_ram_set_impl_funcs(gsr_replay_buffer_ram *self) { self->replay_buffer.destroy = gsr_replay_buffer_ram_destroy; + self->replay_buffer.destroy_at_exit = gsr_replay_buffer_ram_destroy_at_exit; self->replay_buffer.append = gsr_replay_buffer_ram_append; self->replay_buffer.clear = gsr_replay_buffer_ram_clear; self->replay_buffer.iterator_get_packet = gsr_replay_buffer_ram_iterator_get_packet; |
