/*------------------------------------------------------------------------- * drawElements Thread Library * --------------------------- * * Copyright 2014 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * *//*! * \file * \brief Unix implementation of semaphore. *//*--------------------------------------------------------------------*/ #include "deSemaphore.h" #if (DE_OS == DE_OS_UNIX || DE_OS == DE_OS_ANDROID || DE_OS == DE_OS_SYMBIAN || DE_OS == DE_OS_QNX) #include "deMemory.h" #include <semaphore.h> DE_STATIC_ASSERT(sizeof(deSemaphore) >= sizeof(sem_t*)); deSemaphore deSemaphore_create (int initialValue, const deSemaphoreAttributes* attributes) { sem_t* sem = (sem_t*)deMalloc(sizeof(sem_t)); DE_UNREF(attributes); DE_ASSERT(initialValue >= 0); if (!sem) return 0; if (sem_init(sem, 0, (unsigned int)initialValue) != 0) { deFree(sem); return 0; } return (deSemaphore)sem; } void deSemaphore_destroy (deSemaphore semaphore) { sem_t* sem = (sem_t*)semaphore; DE_ASSERT(sem); sem_destroy(sem); deFree(sem); } void deSemaphore_increment (deSemaphore semaphore) { sem_t* sem = (sem_t*)semaphore; int ret = sem_post(sem); DE_ASSERT(ret == 0); DE_UNREF(ret); } void deSemaphore_decrement (deSemaphore semaphore) { sem_t* sem = (sem_t*)semaphore; int ret = sem_wait(sem); DE_ASSERT(ret == 0); DE_UNREF(ret); } deBool deSemaphore_tryDecrement (deSemaphore semaphore) { sem_t* sem = (sem_t*)semaphore; DE_ASSERT(sem); return (sem_trywait(sem) == 0); } #endif /* DE_OS */