gustavonihei commented on code in PR #6197:
URL: https://github.com/apache/incubator-nuttx/pull/6197#discussion_r880691328


##########
arch/risc-v/src/esp32c3/esp32c3_wifi_adapter.c:
##########
@@ -1339,20 +1340,23 @@ static int IRAM_ATTR wifi_is_in_isr(void)
 static void *esp_thread_semphr_get(void)
 {
   int ret;
-  int i;
   void *sem;
-  struct tcb_s *tcb = this_task();
-  struct task_group_s *group = tcb->group;
 
-  for (i = 0; i < CONFIG_SCHED_EXIT_MAX; i++)
+  if (!g_wifi_tkey_init)
     {
-      if (group->tg_exit[i].func.on == esp_thread_semphr_free)
+      ret = tls_alloc(NULL);
+      if (ret < 0)
         {
-          break;
+          wlerr("Failed to create pthread key\n");
+          return NULL;
         }
+
+      g_wifi_thread_key = ret;
+      g_wifi_tkey_init = true;
     }
 
-  if (i >= CONFIG_SCHED_EXIT_MAX)
+  sem = (void *)tls_get_value(g_wifi_thread_key);

Review Comment:
   @pussuw @xiaoxiang781216 @pkarashchenko I think I understood the issue once 
again. The Wi-Fi kernel thread creates a new semaphore for every new socket 
connection (e.g. from `wapi`), but when allocating it on Thread-Local Storage 
it fails to destroy the semaphores due to the threads creating the semaphores 
belonging to a different Task Group from the one that originally created the 
Pthread Key.
   
   Refactoring the solution to use Task Local Storage worked and the semaphores 
are now properly destroyed after `wapi` finishes.
   
   The new solution for both ESP32 and ESP32-C3 is undergoing our internal CI. 
I'll submit it as soon as it passes.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to