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: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]