mirror of
https://sourceware.org/git/glibc.git
synced 2025-08-08 17:42:12 +03:00
hurd: handle EINTR during critical sections
During critical sections, signal handling is deferred and thus RPCs return EINTR, even if SA_RESTART is set. We thus have to restart the whole critical section in that case. This also adds HURD_CRITICAL_UNLOCK in the cases where one wants to break the section in the middle.
This commit is contained in:
@@ -123,6 +123,7 @@ _hurd_exec_paths (task_t task, file_t file,
|
||||
|
||||
ss = _hurd_self_sigstate ();
|
||||
|
||||
retry:
|
||||
assert (! __spin_lock_locked (&ss->critical_section_lock));
|
||||
__spin_lock (&ss->critical_section_lock);
|
||||
|
||||
@@ -429,6 +430,9 @@ _hurd_exec_paths (task_t task, file_t file,
|
||||
|
||||
/* Safe to let signals happen now. */
|
||||
_hurd_critical_section_unlock (ss);
|
||||
if (err == EINTR)
|
||||
/* Got a signal while inside an RPC of the critical section, retry again */
|
||||
goto retry;
|
||||
|
||||
outargs:
|
||||
free (args);
|
||||
|
Reference in New Issue
Block a user