pkarashchenko commented on a change in pull request #5171:
URL: https://github.com/apache/incubator-nuttx/pull/5171#discussion_r779482914



##########
File path: sched/semaphore/sem_holder.c
##########
@@ -1035,17 +1011,52 @@ void nxsem_release_holder(FAR sem_t *sem)
 {
   FAR struct tcb_s *rtcb = this_task();
   FAR struct semholder_s *pholder;
+  FAR struct semholder_s *candidate = NULL;
+  unsigned int total = 0;
 
   /* Find the container for this holder */
 
-  pholder = nxsem_findholder(sem, rtcb);
-  if (pholder != NULL && pholder->counts > 0)
+#if CONFIG_SEM_PREALLOCHOLDERS > 0
+  for (pholder = sem->hhead; pholder; pholder = pholder->flink)
+    {
+#else
+  int i;
+
+  /* We have two hard-allocated holder structures in sem_t */
+
+  for (i = 0; i < 2; i++)
+    {
+      pholder = &sem->holder[i];
+#endif
+
+      if (pholder->counts <= 0)
+        continue;
+
+      if (pholder->htcb == rtcb)
+        {
+          /* Decrement the counts on this holder -- the holder will be freed
+           * later in nxsem_restore_baseprio.
+           */
+
+          pholder->counts--;
+          return;
+        }
+
+      total++;
+      if (candidate == NULL)
+        candidate = pholder;
+    }
+
+  /* The current task is not a holder */
+
+  if (total == 1)

Review comment:
       > Yes, the sum of holder's counts must <= SEM_VALUE_MAX, but there may 
be multi holders. If the caller of sem_post is not a holder, how do we choose 
the holder to decrement it's counts? 
   
   No, the sum of holder's counts is not limited by `SEM_VALUE_MAX`. For 
example the task1 always call `sem_post` and task2 and task3 try to take 
semaphore with concurrency to each other. Then sem counts will be incremented 
and decremented why task2 and task3 holders counts will increment only 
(currently with rollover).
   
   As it was discussed in the mailing list signaling use case for semaphores is 
not a valid case, so we do not have any expectations to priority inheritance in 
this case. So I really think that might think of only limiting holders count by 
`SEM_VALUE_MAX` and do not decrement at all.
   
   As an alternative to your proposed changes it is better to fing a holder 
with the highest counts value and use it as a candidate.




-- 
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: commits-unsubscr...@nuttx.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


Reply via email to