| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- /******************************************************************************
- *
- * Copyright (C) 2015 Google, Inc.
- *
- * 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.
- *
- ******************************************************************************/
- #include "osi/semaphore.h"
- /*-----------------------------------------------------------------------------------*/
- // Creates and returns a new semaphore. The "init_count" argument specifies
- // the initial state of the semaphore, "max_count" specifies the maximum value
- // that can be reached.
- int osi_sem_new(osi_sem_t *sem, uint32_t max_count, uint32_t init_count)
- {
- int ret = -1;
- if (sem) {
- *sem = xSemaphoreCreateCounting(max_count, init_count);
- if ((*sem) != NULL) {
- ret = 0;
- }
- }
- return ret;
- }
- /*-----------------------------------------------------------------------------------*/
- // Give a semaphore
- void osi_sem_give(osi_sem_t *sem)
- {
- xSemaphoreGive(*sem);
- }
- /*
- Blocks the thread while waiting for the semaphore to be
- signaled. If the "timeout" argument is non-zero, the thread should
- only be blocked for the specified time (measured in
- milliseconds).
- */
- int
- osi_sem_take(osi_sem_t *sem, uint32_t timeout)
- {
- int ret = 0;
- if (timeout == OSI_SEM_MAX_TIMEOUT) {
- if (xSemaphoreTake(*sem, portMAX_DELAY) != pdTRUE) {
- ret = -1;
- }
- } else {
- if (xSemaphoreTake(*sem, timeout / portTICK_PERIOD_MS) != pdTRUE) {
- ret = -2;
- }
- }
- return ret;
- }
- // Deallocates a semaphore
- void osi_sem_free(osi_sem_t *sem)
- {
- vSemaphoreDelete(*sem);
- *sem = NULL;
- }
|