]> granicus.if.org Git - esp-idf/commitdiff
impact components: lwip/freertos
authorliuzhifu <liuzhifu@espressif.com>
Fri, 19 Aug 2016 09:23:04 +0000 (17:23 +0800)
committerWu Jian Gang <wujiangang@espressif.com>
Fri, 26 Aug 2016 11:03:50 +0000 (19:03 +0800)
1. Remove xTaskGetPerTaskData
2. Implement lwip per thread semaphore with vTaskSetThreadLocalStoragePointer
   and pvTaskGetThreadLocalStoragePointer
3. Add sys_thread_sem_get/sys_thread_sem_init/sys_thread_sem_deinit

components/freertos/tasks.c
components/lwip/include/lwip/lwip/priv/api_msg.h
components/lwip/include/lwip/port/arch/sys_arch.h
components/lwip/port/freertos/sys_arch.c

index adeaee60c277c62a4766ea1a8c0897b96f8db413..f9ad8ff8cd92e36efd94e8e7222ba3689a8a4e3f 100644 (file)
@@ -206,10 +206,6 @@ typedef struct tskTaskControlBlock
                volatile eNotifyValue eNotifyState;
        #endif
 
-#if (configESP32_PER_TASK_DATA == 1)
-       void *data;
-#endif
-
 } tskTCB;
 
 /* The old tskTCB name is maintained above then typedefed to the new TCB_t name
@@ -611,9 +607,6 @@ BaseType_t i;
 
        if( pxNewTCB != NULL )
        {
-#if (configESP32_PER_TASK_DATA == 1)
-               pxNewTCB->data = NULL;
-#endif
                #if( portUSING_MPU_WRAPPERS == 1 )
                        /* Should the task be created in privileged mode? */
                        BaseType_t xRunPrivileged;
@@ -799,11 +792,6 @@ BaseType_t i;
                        being deleted. */
                        pxTCB = prvGetTCBFromHandle( xTaskToDelete );
 
-#if (configESP32_PER_TASK_DATA == 1)
-                       if (pxTCB->data){
-                               vSemaphoreDelete( pxTCB->data );
-                       }
-#endif
                        /* Remove task from the ready list and place in the     termination list.
                        This will stop the task from be scheduled.  The idle task will check
                        the termination list and free up any memory allocated by the
@@ -4592,23 +4580,6 @@ TickType_t uxReturn;
 
 #endif /* configUSE_TASK_NOTIFICATIONS */
 
-/*-----------------------------------------------------------*/
-#if (configESP32_PER_TASK_DATA == 1)
-void* xTaskGetPerTaskData(void)
-{
-       TCB_t *pxTCB = (TCB_t*)(xTaskGetCurrentTaskHandle());
-       if (pxTCB){
-               if (!pxTCB->data){
-                       vSemaphoreCreateBinary(pxTCB->data);
-               }
-               return (void*)(&pxTCB->data);
-        }
-
-       return NULL;
-}
-#endif /* configESP32_PER_TASK_DATA */
-/*-----------------------------------------------------------*/
-
 #ifdef FREERTOS_MODULE_TEST
        #include "tasks_test_access_functions.h"
 #endif
index dceff82d640bbcf876e6f4845ee852e6660d8cdb..329fa0de30c87e5dd1f30c07ab8ef404132d18db 100755 (executable)
@@ -188,9 +188,9 @@ struct dns_api_msg {
 
 #if LWIP_NETCONN_SEM_PER_THREAD
 #ifdef LWIP_ESP8266
-#define LWIP_NETCONN_THREAD_SEM_GET() sys_thread_sem()
-#define LWIP_NETCONN_THREAD_SEM_ALLOC()
-#define LWIP_NETCONN_THREAD_SEM_FREE() 
+#define LWIP_NETCONN_THREAD_SEM_GET() sys_thread_sem_get()
+#define LWIP_NETCONN_THREAD_SEM_ALLOC() sys_thread_sem_init()
+#define LWIP_NETCONN_THREAD_SEM_FREE() sys_thread_sem_deinit()
 #endif
 #endif
 
index 3d9e460e095b43c72ef97841be94a421d369ae8f..945b4e170a80b6837ce3847148f8e606308f03ea 100644 (file)
@@ -64,10 +64,10 @@ typedef struct sys_mbox_s {
 \r
 void sys_arch_assert(const char *file, int line);\r
 uint32_t system_get_time(void);
-sys_sem_t* sys_thread_sem(void);
 void sys_delay_ms(uint32_t ms);
-void* xTaskGetPerTaskData(void);
-
+sys_sem_t* sys_thread_sem_init(void);
+void sys_thread_sem_deinit(void);
+sys_sem_t* sys_thread_sem_get(void);
 
 \r
 #endif /* __SYS_ARCH_H__ */\r
index 93272a60307a92365afd9f0e9d42706b10f49fb5..3ae4bcda4eeecf9d8c8d8a13a7cf8b96fcccd922 100755 (executable)
@@ -475,17 +475,57 @@ sys_arch_assert(const char *file, int line)
   while(1);
 }
 
-/* This is a super hacky thread-local-storage repository
-   FreeRTOS 8.2.3 & up have thread local storage in the
-   OS, which is how we should do this. Once we upgrade FreeRTOS,
-   we can drop this hacky store and use the FreeRTOS TLS API.
-*/
-sys_sem_t* sys_thread_sem(void)
+/* 
+ * get per thread semphore
+ */
+sys_sem_t* sys_thread_sem_get(void)
+{
+  sys_sem_t *sem = (sys_sem_t*)pvTaskGetThreadLocalStoragePointer(xTaskGetCurrentTaskHandle(), 0);
+  if (!sem){
+    sem = sys_thread_sem_init();
+  }
+  LWIP_DEBUGF(THREAD_SAFE_DEBUG, ("sem_get s=%p\n", sem));
+  return sem;
+}
+
+sys_sem_t* sys_thread_sem_init(void)
 {
-  sys_sem_t *sem = (sys_sem_t*)xTaskGetPerTaskData();
+  sys_sem_t *sem = (sys_sem_t*)malloc(sizeof(sys_sem_t*));
+
+  if (!sem){
+    printf("sem f1\n");
+    return 0;
+  }
+
+  *sem = xSemaphoreCreateBinary();
+  if (!(*sem)){
+    free(sem);
+    printf("sem f2\n");
+    return 0;
+  }
+
+  LWIP_DEBUGF(THREAD_SAFE_DEBUG, ("sem init %p %p\n", sem, *sem));
+  vTaskSetThreadLocalStoragePointer(xTaskGetCurrentTaskHandle(), 0, sem);
+
   return sem;
 }
 
+void sys_thread_sem_deinit(void)
+{
+  sys_sem_t *sem = sys_thread_sem_get();
+  if (sem && *sem){
+    LWIP_DEBUGF(THREAD_SAFE_DEBUG, ("sem del:%p %p\n", sem, *sem));
+    vSemaphoreDelete(*sem);
+  }
+
+  if (sem){
+    free(sem);
+  }
+
+  vTaskSetThreadLocalStoragePointer(xTaskGetCurrentTaskHandle(), 0, 0);
+  return;
+}
+
 void sys_delay_ms(uint32_t ms)
 {
   vTaskDelay(ms/portTICK_RATE_MS);