FS-7906: [mod_av] correct crash from multithreaded opening or closing of multiple files at the same time
This commit is contained in:
parent
3d20f7eac1
commit
543fab93dd
|
@ -40,6 +40,56 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_av_load);
|
||||||
SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_av_shutdown);
|
SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_av_shutdown);
|
||||||
SWITCH_MODULE_DEFINITION(mod_av, mod_av_load, mod_av_shutdown, NULL);
|
SWITCH_MODULE_DEFINITION(mod_av, mod_av_load, mod_av_shutdown, NULL);
|
||||||
|
|
||||||
|
typedef struct av_mutex_helper_s {
|
||||||
|
switch_mutex_t *mutex;
|
||||||
|
switch_memory_pool_t *pool;
|
||||||
|
} av_mutex_helper_t;
|
||||||
|
|
||||||
|
int mod_av_lockmgr_cb(void **m, enum AVLockOp op)
|
||||||
|
{
|
||||||
|
av_mutex_helper_t *context = NULL;
|
||||||
|
|
||||||
|
if (!m) return -1;
|
||||||
|
|
||||||
|
context = (av_mutex_helper_t *)*m;
|
||||||
|
|
||||||
|
switch(op)
|
||||||
|
{
|
||||||
|
case AV_LOCK_CREATE:
|
||||||
|
{
|
||||||
|
switch_memory_pool_t *pool;
|
||||||
|
switch_core_new_memory_pool(&pool);
|
||||||
|
context = switch_core_alloc(pool, sizeof(av_mutex_helper_t));
|
||||||
|
switch_mutex_init(&context->mutex, SWITCH_MUTEX_NESTED, pool);
|
||||||
|
context->pool = pool;
|
||||||
|
*m = (void *)context;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case AV_LOCK_OBTAIN:
|
||||||
|
{
|
||||||
|
switch_mutex_t *mutex = context->mutex;
|
||||||
|
if (!mutex) return -1;
|
||||||
|
switch_mutex_lock(mutex);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case AV_LOCK_RELEASE:
|
||||||
|
{
|
||||||
|
switch_mutex_t *mutex = context->mutex;
|
||||||
|
if (!mutex) return -1;
|
||||||
|
switch_mutex_unlock(mutex);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case AV_LOCK_DESTROY:
|
||||||
|
{
|
||||||
|
switch_core_destroy_memory_pool(&context->pool);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static void log_callback(void *ptr, int level, const char *fmt, va_list vl)
|
static void log_callback(void *ptr, int level, const char *fmt, va_list vl)
|
||||||
{
|
{
|
||||||
switch_log_level_t switch_level = SWITCH_LOG_DEBUG;
|
switch_log_level_t switch_level = SWITCH_LOG_DEBUG;
|
||||||
|
@ -68,12 +118,13 @@ SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_av_shutdown)
|
||||||
{
|
{
|
||||||
avformat_network_deinit();
|
avformat_network_deinit();
|
||||||
av_log_set_callback(NULL);
|
av_log_set_callback(NULL);
|
||||||
|
av_lockmgr_register(NULL);
|
||||||
return SWITCH_STATUS_SUCCESS;
|
return SWITCH_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
SWITCH_MODULE_LOAD_FUNCTION(mod_av_load)
|
SWITCH_MODULE_LOAD_FUNCTION(mod_av_load)
|
||||||
{
|
{
|
||||||
|
av_lockmgr_register(&mod_av_lockmgr_cb);
|
||||||
av_log_set_callback(log_callback);
|
av_log_set_callback(log_callback);
|
||||||
av_log_set_level(AV_LOG_INFO);
|
av_log_set_level(AV_LOG_INFO);
|
||||||
avformat_network_init();
|
avformat_network_init();
|
||||||
|
|
Loading…
Reference in New Issue