8df79e9d42
Avoid a pthreads dependency via pthread_once() when compiled with --disable-multithread. In addition, this synchronization is disabled for Win32 as well, even though we can be sure that the required primatives exist, so that the requirements on the application when built with --disable-multithread are consistent across platforms. Users using libvpx built with --disable-multithread in a multithreaded context should provide their own synchronization. Updated the documentation to vpx_codec_enc_init_ver() and vpx_codec_dec_init_ver() to note this requirement. Moved the RTCD initialization call to match this description, as previously it didn't happen until the first frame. Change-Id: Id576f6bce2758362188278d3085051c218a56d4a
70 lines
1.6 KiB
C
70 lines
1.6 KiB
C
/*
|
|
* Copyright (c) 2011 The WebM project authors. All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license
|
|
* that can be found in the LICENSE file in the root of the source
|
|
* tree. An additional intellectual property rights grant can be found
|
|
* in the file PATENTS. All contributing project authors may
|
|
* be found in the AUTHORS file in the root of the source tree.
|
|
*/
|
|
#include "vpx_config.h"
|
|
#define RTCD_C
|
|
#include "vpx_rtcd.h"
|
|
|
|
#if CONFIG_MULTITHREAD && HAVE_PTHREAD_H
|
|
#include <pthread.h>
|
|
static void once(void (*func)(void))
|
|
{
|
|
static pthread_once_t lock = PTHREAD_ONCE_INIT;
|
|
pthread_once(&lock, func);
|
|
}
|
|
|
|
|
|
#elif CONFIG_MULTITHREAD && defined(_WIN32)
|
|
#include <windows.h>
|
|
static void once(void (*func)(void))
|
|
{
|
|
/* Using a static initializer here rather than InitializeCriticalSection()
|
|
* since there's no race-free context in which to execute it. Protecting
|
|
* it with an atomic op like InterlockedCompareExchangePointer introduces
|
|
* an x86 dependency, and InitOnceExecuteOnce requires Vista.
|
|
*/
|
|
static CRITICAL_SECTION lock = {(void *)-1, -1, 0, 0, 0, 0};
|
|
static int done;
|
|
|
|
EnterCriticalSection(&lock);
|
|
|
|
if (!done)
|
|
{
|
|
func();
|
|
done = 1;
|
|
}
|
|
|
|
LeaveCriticalSection(&lock);
|
|
}
|
|
|
|
|
|
#else
|
|
/* No-op version that performs no synchronization. vpx_rtcd() is idempotent,
|
|
* so as long as your platform provides atomic loads/stores of pointers
|
|
* no synchronization is strictly necessary.
|
|
*/
|
|
|
|
static void once(void (*func)(void))
|
|
{
|
|
static int done;
|
|
|
|
if(!done)
|
|
{
|
|
func();
|
|
done = 1;
|
|
}
|
|
}
|
|
#endif
|
|
|
|
|
|
void vpx_rtcd()
|
|
{
|
|
once(setup_rtcd_internal);
|
|
}
|