* ijksdl_mutex.c
*****************************************************************************
*
* Copyright (c) 2013 Bilibili
* copyright (c) 2013 Zhang Rui <bbcallen@gmail.com>
*
* This file is part of ijkPlayer.
*
* ijkPlayer is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* ijkPlayer is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with ijkPlayer; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "ijksdl_mutex.h"
#include <errno.h>
#include <assert.h>
#include <sys/time.h>
#include "ijksdl_inc_internal.h"
SDL_mutex *SDL_CreateMutex(void)
{
SDL_mutex *mutex;
mutex = (SDL_mutex *) mallocz(sizeof(SDL_mutex));
if (!mutex)
return NULL;
if (pthread_mutex_init(&mutex->id, NULL) != 0) {
free(mutex);
return NULL;
}
return mutex;
}
void SDL_DestroyMutex(SDL_mutex *mutex)
{
if (mutex) {
pthread_mutex_destroy(&mutex->id);
free(mutex);
}
}
void SDL_DestroyMutexP(SDL_mutex **mutex)
{
if (mutex) {
SDL_DestroyMutex(*mutex);
*mutex = NULL;
}
}
int SDL_LockMutex(SDL_mutex *mutex)
{
assert(mutex);
if (!mutex)
return -1;
return pthread_mutex_lock(&mutex->id);
}
int SDL_UnlockMutex(SDL_mutex *mutex)
{
assert(mutex);
if (!mutex)
return -1;
return pthread_mutex_unlock(&mutex->id);
}
SDL_cond *SDL_CreateCond(void)
{
SDL_cond *cond;
cond = (SDL_cond *) mallocz(sizeof(SDL_cond));
if (!cond)
return NULL;
if (pthread_cond_init(&cond->id, NULL) != 0) {
free(cond);
return NULL;
}
return cond;
}
void SDL_DestroyCond(SDL_cond *cond)
{
if (cond) {
pthread_cond_destroy(&cond->id);
free(cond);
}
}
void SDL_DestroyCondP(SDL_cond **cond)
{
if (cond) {
SDL_DestroyCond(*cond);
*cond = NULL;
}
}
int SDL_CondSignal(SDL_cond *cond)
{
assert(cond);
if (!cond)
return -1;
return pthread_cond_signal(&cond->id);
}
int SDL_CondBroadcast(SDL_cond *cond)
{
assert(cond);
if (!cond)
return -1;
return pthread_cond_broadcast(&cond->id);
}
int SDL_CondWaitTimeout(SDL_cond *cond, SDL_mutex *mutex, uint32_t ms)
{
LOGI("audio->SDL_CondWaitTimeout");
int retval;
struct timeval delta;
struct timespec abstime;
assert(cond);
assert(mutex);
if (!cond || !mutex) {
return -1;
}
LOGI("audio->gettimeofday");
gettimeofday(&delta, NULL);
abstime.tv_sec = delta.tv_sec + (ms / 1000);
abstime.tv_nsec = (delta.tv_usec + (ms % 1000) * 1000) * 1000;
if (abstime.tv_nsec > 1000000000) {
abstime.tv_sec += 1;
abstime.tv_nsec -= 1000000000;
}
while (1) {
retval = pthread_cond_timedwait(&cond->id, &mutex->id, &abstime);
if (retval == 0)
return 0;
else if (retval == EINTR)
continue;
else if (retval == ETIMEDOUT)
return SDL_MUTEX_TIMEDOUT;
else
break;
}
LOGI("audio->SDL_CondWaitTimeout end");
return -1;
}
int SDL_CondWait(SDL_cond *cond, SDL_mutex *mutex)
{
assert(cond);
assert(mutex);
if (!cond || !mutex)
return -1;
return pthread_cond_wait(&cond->id, &mutex->id);
}