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