Fix for x86_64 build fail
[platform/upstream/connectedhomeip.git] / examples / common / m5stack-tft / repo / components / spiffs / mutex.c
1 /*
2  * Lua RTOS, mutex api implementation over FreeRTOS
3  *
4  * Copyright (C) 2015 - 2017
5  * IBEROXARXA SERVICIOS INTEGRALES, S.L. & CSS IBÉRICA, S.L.
6  * 
7  * Author: Jaume Olivé (jolive@iberoxarxa.com / jolive@whitecatboard.org)
8  * 
9  * All rights reserved.  
10  *
11  * Permission to use, copy, modify, and distribute this software
12  * and its documentation for any purpose and without fee is hereby
13  * granted, provided that the above copyright notice appear in all
14  * copies and that both that the copyright notice and this
15  * permission notice and warranty disclaimer appear in supporting
16  * documentation, and that the name of the author not be used in
17  * advertising or publicity pertaining to distribution of the
18  * software without specific, written prior permission.
19  *
20  * The author disclaim all warranties with regard to this
21  * software, including all implied warranties of merchantability
22  * and fitness.  In no event shall the author be liable for any
23  * special, indirect or consequential damages or any damages
24  * whatsoever resulting from loss of use, data or profits, whether
25  * in an action of contract, negligence or other tortious action,
26  * arising out of or in connection with the use or performance of
27  * this software.
28  *
29  * Modified by: LoBo (loboris@gmail.com / https://github.com/loboris)
30  *
31  */
32
33 #include "freertos/FreeRTOS.h"
34 #include "esp_attr.h"
35 #include "mutex.h"
36
37
38 #define portEND_SWITCHING_ISR(xSwitchRequired) \
39 if (xSwitchRequired) {    \
40         _frxt_setup_switch(); \
41 }
42
43 extern unsigned port_interruptNesting[portNUM_PROCESSORS];
44
45 void _mtx_init() {
46 }
47
48 void mtx_init(struct mtx *mutex, const char *name, const char *type, int opts) {    
49     mutex->sem = xSemaphoreCreateBinary();
50
51     if (mutex->sem) {
52         if (port_interruptNesting[xPortGetCoreID()] != 0) {
53             BaseType_t xHigherPriorityTaskWoken = pdFALSE;
54             xSemaphoreGiveFromISR( mutex->sem, &xHigherPriorityTaskWoken); 
55             portEND_SWITCHING_ISR( xHigherPriorityTaskWoken );
56         } else {
57             xSemaphoreGive( mutex->sem );            
58         }
59     }    
60 }
61
62 void IRAM_ATTR mtx_lock(struct mtx *mutex) {
63     if (port_interruptNesting[xPortGetCoreID()] != 0) {
64         BaseType_t xHigherPriorityTaskWoken = pdFALSE;        
65         xSemaphoreTakeFromISR( mutex->sem, &xHigherPriorityTaskWoken );
66         portEND_SWITCHING_ISR( xHigherPriorityTaskWoken );
67     } else {
68         xSemaphoreTake( mutex->sem, portMAX_DELAY );
69     }
70 }
71
72 int mtx_trylock(struct  mtx *mutex) {
73     if (xSemaphoreTake( mutex->sem, 0 ) == pdTRUE) {
74         return 1;
75     } else {
76         return 0;
77     }
78 }
79
80 void IRAM_ATTR mtx_unlock(struct mtx *mutex) {
81     if (port_interruptNesting[xPortGetCoreID()] != 0) {
82         BaseType_t xHigherPriorityTaskWoken = pdFALSE;  
83         xSemaphoreGiveFromISR( mutex->sem, &xHigherPriorityTaskWoken );  
84         portEND_SWITCHING_ISR( xHigherPriorityTaskWoken );
85     } else {
86         xSemaphoreGive( mutex->sem );    
87     }
88 }
89
90 void mtx_destroy(struct mtx *mutex) {
91     if (port_interruptNesting[xPortGetCoreID()] != 0) {
92         BaseType_t xHigherPriorityTaskWoken = pdFALSE;  
93         xSemaphoreGiveFromISR( mutex->sem, &xHigherPriorityTaskWoken );  
94         portEND_SWITCHING_ISR( xHigherPriorityTaskWoken );
95     } else {
96         xSemaphoreGive( mutex->sem );        
97     }
98     
99     vSemaphoreDelete( mutex->sem );
100     
101     mutex->sem = 0;
102 }