mirror of
git://sourceware.org/git/newlib-cygwin.git
synced 2025-01-31 19:40:33 +08:00
Cygwin: pipe: Fix notification timing of select_sem.
- Make select_sem notify even when read/write partially.
This commit is contained in:
parent
597f87294d
commit
08b8534d0a
@ -311,6 +311,9 @@ fhandler_pipe::raw_read (void *ptr, size_t& len)
|
|||||||
{
|
{
|
||||||
status = STATUS_THREAD_SIGNALED;
|
status = STATUS_THREAD_SIGNALED;
|
||||||
nbytes += io.Information;
|
nbytes += io.Information;
|
||||||
|
if (select_sem && io.Information > 0)
|
||||||
|
ReleaseSemaphore (select_sem,
|
||||||
|
get_obj_handle_count (select_sem), NULL);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
status = io.Status;
|
status = io.Status;
|
||||||
@ -365,6 +368,8 @@ fhandler_pipe::raw_read (void *ptr, size_t& len)
|
|||||||
|
|
||||||
if (nbytes_now == 0)
|
if (nbytes_now == 0)
|
||||||
break;
|
break;
|
||||||
|
else if (select_sem)
|
||||||
|
ReleaseSemaphore (select_sem, get_obj_handle_count (select_sem), NULL);
|
||||||
}
|
}
|
||||||
ReleaseMutex (read_mtx);
|
ReleaseMutex (read_mtx);
|
||||||
if (evt)
|
if (evt)
|
||||||
@ -376,8 +381,6 @@ fhandler_pipe::raw_read (void *ptr, size_t& len)
|
|||||||
}
|
}
|
||||||
else if (status == STATUS_THREAD_CANCELED)
|
else if (status == STATUS_THREAD_CANCELED)
|
||||||
pthread::static_cancel_self ();
|
pthread::static_cancel_self ();
|
||||||
if (select_sem && nbytes)
|
|
||||||
ReleaseSemaphore (select_sem, get_obj_handle_count (select_sem), NULL);
|
|
||||||
len = nbytes;
|
len = nbytes;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -472,6 +475,9 @@ fhandler_pipe_fifo::raw_write (const void *ptr, size_t len)
|
|||||||
{
|
{
|
||||||
status = STATUS_THREAD_SIGNALED;
|
status = STATUS_THREAD_SIGNALED;
|
||||||
nbytes += io.Information;
|
nbytes += io.Information;
|
||||||
|
if (select_sem && io.Information > 0)
|
||||||
|
ReleaseSemaphore (select_sem,
|
||||||
|
get_obj_handle_count (select_sem), NULL);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
status = io.Status;
|
status = io.Status;
|
||||||
@ -502,6 +508,8 @@ fhandler_pipe_fifo::raw_write (const void *ptr, size_t len)
|
|||||||
|
|
||||||
if (nbytes_now == 0)
|
if (nbytes_now == 0)
|
||||||
break;
|
break;
|
||||||
|
else if (select_sem)
|
||||||
|
ReleaseSemaphore (select_sem, get_obj_handle_count (select_sem), NULL);
|
||||||
}
|
}
|
||||||
if (evt)
|
if (evt)
|
||||||
CloseHandle (evt);
|
CloseHandle (evt);
|
||||||
@ -509,8 +517,6 @@ fhandler_pipe_fifo::raw_write (const void *ptr, size_t len)
|
|||||||
set_errno (EINTR);
|
set_errno (EINTR);
|
||||||
else if (status == STATUS_THREAD_CANCELED)
|
else if (status == STATUS_THREAD_CANCELED)
|
||||||
pthread::static_cancel_self ();
|
pthread::static_cancel_self ();
|
||||||
if (select_sem && nbytes)
|
|
||||||
ReleaseSemaphore (select_sem, get_obj_handle_count (select_sem), NULL);
|
|
||||||
return nbytes ?: -1;
|
return nbytes ?: -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user