mirror of
https://github.com/obsproject/obs-studio.git
synced 2024-09-20 13:08:50 +02:00
Add rename cache for thread safety
This just ensures that if an obs object is renamed that the pointer to older names will still be valid. Prevents renames from causing any invalid memory access. When the obs object is destroyed, so are the cached names.
This commit is contained in:
parent
4f2a731acf
commit
87475cdf89
@ -198,6 +198,9 @@ struct obs_context_data {
|
||||
signal_handler_t signals;
|
||||
proc_handler_t procs;
|
||||
|
||||
DARRAY(char*) rename_cache;
|
||||
pthread_mutex_t rename_cache_mutex;
|
||||
|
||||
pthread_mutex_t *mutex;
|
||||
struct obs_context_data *next;
|
||||
struct obs_context_data **prev_next;
|
||||
|
18
libobs/obs.c
18
libobs/obs.c
@ -1189,8 +1189,12 @@ static inline bool obs_context_data_init_wrap(
|
||||
{
|
||||
assert(context);
|
||||
|
||||
pthread_mutex_init_value(&context->rename_cache_mutex);
|
||||
obs_context_data_free(context);
|
||||
|
||||
if (pthread_mutex_init(&context->rename_cache_mutex, NULL) < 0)
|
||||
return false;
|
||||
|
||||
context->signals = signal_handler_create();
|
||||
if (!context)
|
||||
return false;
|
||||
@ -1201,6 +1205,8 @@ static inline bool obs_context_data_init_wrap(
|
||||
|
||||
context->name = dup_name(name);
|
||||
context->settings = obs_data_newref(settings);
|
||||
|
||||
da_init(context->rename_cache);
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -1223,8 +1229,13 @@ void obs_context_data_free(struct obs_context_data *context)
|
||||
proc_handler_destroy(context->procs);
|
||||
obs_data_release(context->settings);
|
||||
obs_context_data_remove(context);
|
||||
pthread_mutex_destroy(&context->rename_cache_mutex);
|
||||
bfree(context->name);
|
||||
|
||||
for (size_t i = 0; i < context->rename_cache.num; i++)
|
||||
bfree(context->rename_cache.array[i]);
|
||||
da_free(context->rename_cache);
|
||||
|
||||
memset(context, 0, sizeof(*context));
|
||||
}
|
||||
|
||||
@ -1264,6 +1275,11 @@ void obs_context_data_remove(struct obs_context_data *context)
|
||||
void obs_context_data_setname(struct obs_context_data *context,
|
||||
const char *name)
|
||||
{
|
||||
bfree(context->name);
|
||||
pthread_mutex_lock(&context->rename_cache_mutex);
|
||||
|
||||
if (context->name)
|
||||
da_push_back(context->rename_cache, &context->name);
|
||||
context->name = dup_name(name);
|
||||
|
||||
pthread_mutex_unlock(&context->rename_cache_mutex);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user