This is the mail archive of the
mailing list for the Cygwin project.
Re: [PATCH] to_slave pipe is full fix
On Mon, Dec 16, 2002 at 04:47:04PM -0600, Steve O wrote:
>On Mon, Dec 16, 2002 at 02:36:29PM -0500, Christopher Faylor wrote:
>> On Mon, Dec 16, 2002 at 01:15:54PM -0600, Steve O wrote:
>> - SetEvent (input_available_event);
>> - ReleaseMutex (input_mutex);
>> - Sleep (10);
>> - rc = WaitForSingleObject (input_mutex, INFINITE);
>> + puts_readahead (p, bytes_left);
>> + ret = 0;
>> + break;
>> Won't this introduce a spinning situation since you are no longer
>The 'break;' should pop us out of the loop. Did I miss a control
>structure? The idea of the patch at least, was to bail out of a write
>if the pipe is full.
Ok. I see what you're doing now. The puts_readahead is taking the
"overfill" to the pipe.
>> Were we really inappropriately waiting for the input_mutex in
>> this case?
>For the case where the application expects the write to not block,
>it seems inappropriate to wait. For the case where the application
>does a blocking write, the WriteFile should do the blocking and, unless
>there is a problem, write all the bytes.
>In fact, looking at it some more, the accept_input while loop is
>superfluous. Sorry I missed that.
Hmm. You're right. I didn't notice that. I was still getting my
head around your changes. I've applied your patch and reorganized it.
One more question, though. In accept_input, shouldn't ret be set to
something besides 1 when there is an "error writing to pipe"?
I wonder if there is some other way to do this other than pulling
everything out of the read ahead buffer and then putting it back on
failure. I guess it doesn't matter since this is an edge condition.
Hmm. I wonder if the WaitForSingleObject (input_mutex,...) is enough to
make this code thread safe. I always meant to revisit thread issues here
but maybe Egor helped me out with the introduction of the input_mutex.