You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by GitBox <gi...@apache.org> on 2020/03/19 16:26:30 UTC

[GitHub] [incubator-nuttx] patacongo commented on issue #587: pthread_mutex_lock() does not resume waiting after signal

patacongo commented on issue #587: pthread_mutex_lock() does not resume waiting after signal
URL: https://github.com/apache/incubator-nuttx/issues/587#issuecomment-601276937
 
 
   NOTE:  Passing the value false to pthread_mutex_take() is not a solution.
   
   That argument is passed to pthread_sem_take() and if the argument is false it calls:
   
       117       if (abs_timeout == NULL)
       118         {
       119           ret = nxsem_wait_uninterruptible(sem);
       120         }
       121       else
       122         {
       123           ret = nxsem_timedwait_uninterruptible(sem, abs_timeout);
       124         }
   
   But nxsem_wait_uninterruptble does more than just ignore signal interupts:
   
       544 static inline int nxsem_wait_uninterruptible(FAR sem_t *sem)
       545 {
       546   int ret;
       547
       548   do
       549     {
       550       /* Take the semaphore (perhaps waiting) */
       551
       552       ret = nxsem_wait(sem);
       553     }
       554   while (ret == -EINTR || ret == -ECANCELED);
       555
       556   return ret;
       557 }
   
   It also breaks thread cancellation.  When cancellation pointers are enabled, semaphore waits will be awakened with ECANCELED and must return.  In the deferred cancellation mode all resources will be cleaned-up and that task will terminated when it attempts to exit the cancellation point.
   
   The above breaks thread cancellation because in the event that the thread is cancelled, it simply loops back and waits again.  The thread cannot be cancelled in the recommended deferred cancellation most.  That is seriaous OS breakage.
   
   This is another bug in the existing implementation.  ALL semaphore waits must return in the event of thread cancellation, otherwise thread cancellation is broken (it is broken in many cases).
   
   A better solution in  pthread_sem_take() would be to set up a sigprocmask and block relevant signals instead of calling nxsem_wait_uninterruptible().  That is too brutal.  All signals should be blocked except (1) the signal that wakes up the timed event and (2) any signals associated with thread cancellation.

----------------------------------------------------------------
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.
 
For queries about this service, please contact Infrastructure at:
users@infra.apache.org


With regards,
Apache Git Services