/* | |
* Amazon FreeRTOS POSIX V1.1.0 | |
* Copyright (C) 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. | |
* | |
* Permission is hereby granted, free of charge, to any person obtaining a copy of | |
* this software and associated documentation files (the "Software"), to deal in | |
* the Software without restriction, including without limitation the rights to | |
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of | |
* the Software, and to permit persons to whom the Software is furnished to do so, | |
* subject to the following conditions: | |
* | |
* The above copyright notice and this permission notice shall be included in all | |
* copies or substantial portions of the Software. | |
* | |
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS | |
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR | |
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER | |
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | |
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | |
* | |
* http://aws.amazon.com/freertos | |
* http://www.FreeRTOS.org | |
*/ | |
#ifndef _FREERTOS_POSIX_INTERNAL_H_ | |
#define _FREERTOS_POSIX_INTERNAL_H_ | |
/** | |
* @file FreeRTOS_POSIX_internal.h | |
* @brief Internal structs and initializers for FreeRTOS+POSIX. | |
*/ | |
/* Amazon FreeRTOS includes. */ | |
#include "iot_doubly_linked_list.h" | |
/** | |
* @brief Mutex attribute object. | |
*/ | |
#if posixconfigENABLE_PTHREAD_MUTEXATTR_T == 1 | |
typedef struct pthread_mutexattr_internal | |
{ | |
int iType; /**< Mutex type. */ | |
} pthread_mutexattr_internal_t; | |
#endif | |
#if posixconfigENABLE_PTHREAD_MUTEX_T == 1 | |
/** | |
* @brief Mutex. | |
*/ | |
typedef struct pthread_mutex_internal | |
{ | |
BaseType_t xIsInitialized; /**< Set to pdTRUE if this mutex is initialized, pdFALSE otherwise. */ | |
StaticSemaphore_t xMutex; /**< FreeRTOS mutex. */ | |
TaskHandle_t xTaskOwner; /**< Owner; used for deadlock detection and permission checks. */ | |
pthread_mutexattr_internal_t xAttr; /**< Mutex attributes. */ | |
} pthread_mutex_internal_t; | |
/** | |
* @brief Compile-time initializer of pthread_mutex_internal_t. | |
*/ | |
#define FREERTOS_POSIX_MUTEX_INITIALIZER \ | |
( ( ( pthread_mutex_internal_t ) \ | |
{ \ | |
.xIsInitialized = pdFALSE, \ | |
.xMutex = { { 0 } }, \ | |
.xTaskOwner = NULL, \ | |
.xAttr = { .iType = 0 } \ | |
} \ | |
) \ | |
) | |
#endif /* if posixconfigENABLE_PTHREAD_MUTEX_T == 1 */ | |
#if posixconfigENABLE_PTHREAD_COND_T == 1 | |
/** | |
* @brief Condition variable. | |
*/ | |
typedef struct pthread_cond_internal | |
{ | |
BaseType_t xIsInitialized; /**< Set to pdTRUE if this condition variable is initialized, pdFALSE otherwise. */ | |
StaticSemaphore_t xCondWaitSemaphore; /**< Threads block on this semaphore in pthread_cond_wait. */ | |
unsigned iWaitingThreads; /**< The number of threads currently waiting on this condition variable. */ | |
} pthread_cond_internal_t; | |
/** | |
* @brief Compile-time initializer of pthread_cond_internal_t. | |
*/ | |
#define FREERTOS_POSIX_COND_INITIALIZER \ | |
( ( ( pthread_cond_internal_t ) \ | |
{ \ | |
.xIsInitialized = pdFALSE, \ | |
.xCondWaitSemaphore = { { 0 } }, \ | |
.iWaitingThreads = 0 \ | |
} \ | |
) \ | |
) | |
#endif /* if posixconfigENABLE_PTHREAD_COND_T == 1 */ | |
#if posixconfigENABLE_SEM_T == 1 | |
/** | |
* @brief Semaphore type. | |
*/ | |
typedef struct | |
{ | |
StaticSemaphore_t xSemaphore; /**< FreeRTOS semaphore. */ | |
int value; /**< POSIX semaphore count. */ | |
} sem_internal_t; | |
#endif /* if posixconfigENABLE_SEM_T == 1 */ | |
#if posixconfigENABLE_PTHREAD_BARRIER_T == 1 | |
/** | |
* @brief Barrier object. | |
*/ | |
typedef struct pthread_barrier_internal | |
{ | |
unsigned uThreadCount; /**< Current number of threads that have entered barrier. */ | |
unsigned uThreshold; /**< The count argument of pthread_barrier_init. */ | |
StaticSemaphore_t xThreadCountSemaphore; /**< Prevents more than uThreshold threads from exiting pthread_barrier_wait at once. */ | |
StaticEventGroup_t xBarrierEventGroup; /**< FreeRTOS event group that blocks to wait on threads entering barrier. */ | |
} pthread_barrier_internal_t; | |
#endif /* if posixconfigENABLE_PTHREAD_BARRIER_T == 1 */ | |
#endif /* _FREERTOS_POSIX_INTERNAL_H_ */ |