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


##########
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:
   I remember discussing with @donghengqaz some months ago about this solution.
   ~The usage of `on_exit` instead of relying on pthread's destructor is due to 
NuttX implementation of `pthread_key_create` not being fully compliant to the 
standard.
   The standard says that the keys created via `pthread_key_create` may be 
shared between threads, but the destructor is still thread-private. But, if I 
am not mistaken, on NuttX the destructor is private to a task-group. So using 
pthread keys did not work out in the certain scenarios.~
   
   So, my initial interpretation was wrong. NuttX implementation of 
`pthread_key_create` is indeed compliant, since the key's destructor is 
allocated in TLS storage, so it is thread-specific.
   
   I need some time to recall and understand what the driver expects.



-- 
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