mirror of
				https://github.com/espressif/esp-idf.git
				synced 2025-11-04 00:51:42 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			105 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			105 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
 * Copyright 2010-2015 Amazon.com, Inc. or its affiliates. All Rights Reserved.
 | 
						|
 * Additions Copyright 2016 Espressif Systems (Shanghai) PTE LTD
 | 
						|
 *
 | 
						|
 * Licensed under the Apache License, Version 2.0 (the "License").
 | 
						|
 * You may not use this file except in compliance with the License.
 | 
						|
 * A copy of the License is located at
 | 
						|
 *
 | 
						|
 *  http://aws.amazon.com/apache2.0
 | 
						|
 *
 | 
						|
 * or in the "license" file accompanying this file. This file 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 "freertos/FreeRTOS.h"
 | 
						|
#include "freertos/task.h"
 | 
						|
 | 
						|
#include "threads_platform.h"
 | 
						|
 | 
						|
#ifdef __cplusplus
 | 
						|
extern "C" {
 | 
						|
#endif
 | 
						|
 | 
						|
/**
 | 
						|
 * @brief Initialize the provided mutex
 | 
						|
 *
 | 
						|
 * Call this function to initialize the mutex
 | 
						|
 *
 | 
						|
 * @param IoT_Mutex_t - pointer to the mutex to be initialized
 | 
						|
 * @return IoT_Error_t - error code indicating result of operation
 | 
						|
 */
 | 
						|
IoT_Error_t aws_iot_thread_mutex_init(IoT_Mutex_t *pMutex) {
 | 
						|
 | 
						|
    pMutex->mutex = xSemaphoreCreateRecursiveMutex();
 | 
						|
    return pMutex->mutex ? SUCCESS : MUTEX_INIT_ERROR;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * @brief Lock the provided mutex
 | 
						|
 *
 | 
						|
 * Call this function to lock the mutex before performing a state change
 | 
						|
 * Blocking, thread will block until lock request fails
 | 
						|
 *
 | 
						|
 * @param IoT_Mutex_t - pointer to the mutex to be locked
 | 
						|
 * @return IoT_Error_t - error code indicating result of operation
 | 
						|
 */
 | 
						|
IoT_Error_t aws_iot_thread_mutex_lock(IoT_Mutex_t *pMutex) {
 | 
						|
    xSemaphoreTakeRecursive(pMutex->mutex, portMAX_DELAY);
 | 
						|
    return SUCCESS;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * @brief Try to lock the provided mutex
 | 
						|
 *
 | 
						|
 * Call this function to attempt to lock the mutex before performing a state change
 | 
						|
 * Non-Blocking, immediately returns with failure if lock attempt fails
 | 
						|
 *
 | 
						|
 * @param IoT_Mutex_t - pointer to the mutex to be locked
 | 
						|
 * @return IoT_Error_t - error code indicating result of operation
 | 
						|
 */
 | 
						|
IoT_Error_t aws_iot_thread_mutex_trylock(IoT_Mutex_t *pMutex) {
 | 
						|
    if (xSemaphoreTakeRecursive(pMutex->mutex, 0)) {
 | 
						|
        return SUCCESS;
 | 
						|
    } else {
 | 
						|
        return MUTEX_LOCK_ERROR;
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * @brief Unlock the provided mutex
 | 
						|
 *
 | 
						|
 * Call this function to unlock the mutex before performing a state change
 | 
						|
 *
 | 
						|
 * @param IoT_Mutex_t - pointer to the mutex to be unlocked
 | 
						|
 * @return IoT_Error_t - error code indicating result of operation
 | 
						|
 */
 | 
						|
IoT_Error_t aws_iot_thread_mutex_unlock(IoT_Mutex_t *pMutex) {
 | 
						|
    if (xSemaphoreGiveRecursive(pMutex->mutex)) {
 | 
						|
        return SUCCESS;
 | 
						|
    } else {
 | 
						|
        return MUTEX_UNLOCK_ERROR;
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * @brief Destroy the provided mutex
 | 
						|
 *
 | 
						|
 * Call this function to destroy the mutex
 | 
						|
 *
 | 
						|
 * @param IoT_Mutex_t - pointer to the mutex to be destroyed
 | 
						|
 * @return IoT_Error_t - error code indicating result of operation
 | 
						|
 */
 | 
						|
IoT_Error_t aws_iot_thread_mutex_destroy(IoT_Mutex_t *pMutex) {
 | 
						|
    vSemaphoreDelete(pMutex->mutex);
 | 
						|
    return SUCCESS;
 | 
						|
}
 | 
						|
 | 
						|
#ifdef __cplusplus
 | 
						|
}
 | 
						|
#endif
 | 
						|
 |