[INTERPRETER]
* BUG: Disable read watch when reading a stream fails for any reason: i/o error, end-of-file... git-svn-id: svn://localhost/gambas/trunk@5811 867c0c6c-44f3-4631-809d-bfa615b0a4ec
This commit is contained in:
parent
3d820edb15
commit
4830af856b
1 changed files with 30 additions and 15 deletions
|
@ -256,18 +256,21 @@ void STREAM_release(STREAM *stream)
|
||||||
STREAM_cancel(stream);
|
STREAM_cancel(stream);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void stop_watching(STREAM *stream, int mode)
|
||||||
|
{
|
||||||
|
int fd = STREAM_handle(stream);
|
||||||
|
if (fd >= 0)
|
||||||
|
GB_Watch(fd, mode, NULL, 0);
|
||||||
|
}
|
||||||
|
|
||||||
void STREAM_close(STREAM *stream)
|
void STREAM_close(STREAM *stream)
|
||||||
{
|
{
|
||||||
int fd;
|
|
||||||
|
|
||||||
STREAM_release(stream);
|
STREAM_release(stream);
|
||||||
|
|
||||||
if (!stream->type)
|
if (!stream->type)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
fd = STREAM_handle(stream);
|
stop_watching(stream, GB_WATCH_NONE);
|
||||||
if (fd >= 0)
|
|
||||||
GB_Watch(fd, GB_WATCH_NONE, NULL, 0);
|
|
||||||
|
|
||||||
if (stream->common.standard || !(*(stream->type->close))(stream))
|
if (stream->common.standard || !(*(stream->type->close))(stream))
|
||||||
stream->type = NULL;
|
stream->type = NULL;
|
||||||
|
@ -319,10 +322,13 @@ void STREAM_read(STREAM *stream, void *addr, int len)
|
||||||
|
|
||||||
while ((*(stream->type->read))(stream, addr, len))
|
while ((*(stream->type->read))(stream, addr, len))
|
||||||
{
|
{
|
||||||
|
if (errno == EINTR)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
stop_watching(stream, GB_WATCH_READ);
|
||||||
|
|
||||||
switch(errno)
|
switch(errno)
|
||||||
{
|
{
|
||||||
case EINTR:
|
|
||||||
break;
|
|
||||||
case 0:
|
case 0:
|
||||||
case EAGAIN:
|
case EAGAIN:
|
||||||
THROW(E_EOF);
|
THROW(E_EOF);
|
||||||
|
@ -355,10 +361,13 @@ char STREAM_getchar(STREAM *stream)
|
||||||
if (!ret)
|
if (!ret)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
if (errno == EINTR)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
stop_watching(stream, GB_WATCH_READ);
|
||||||
|
|
||||||
switch(errno)
|
switch(errno)
|
||||||
{
|
{
|
||||||
case EINTR:
|
|
||||||
continue;
|
|
||||||
case 0:
|
case 0:
|
||||||
case EAGAIN:
|
case EAGAIN:
|
||||||
THROW(E_EOF);
|
THROW(E_EOF);
|
||||||
|
@ -418,10 +427,13 @@ int STREAM_read_max(STREAM *stream, void *addr, int len)
|
||||||
if (!err)
|
if (!err)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
if (errno == EINTR)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
stop_watching(stream, GB_WATCH_READ);
|
||||||
|
|
||||||
switch(errno)
|
switch(errno)
|
||||||
{
|
{
|
||||||
case EINTR:
|
|
||||||
continue;
|
|
||||||
case 0:
|
case 0:
|
||||||
case EAGAIN:
|
case EAGAIN:
|
||||||
return STREAM_eff_read;
|
return STREAM_eff_read;
|
||||||
|
@ -550,10 +562,13 @@ static void fill_buffer(STREAM *stream, char *addr)
|
||||||
if (!err)
|
if (!err)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
if (errno == EINTR)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
stop_watching(stream, GB_WATCH_READ);
|
||||||
|
|
||||||
switch(errno)
|
switch(errno)
|
||||||
{
|
{
|
||||||
case EINTR:
|
|
||||||
continue;
|
|
||||||
case 0:
|
case 0:
|
||||||
case EAGAIN:
|
case EAGAIN:
|
||||||
case EINPROGRESS:
|
case EINPROGRESS:
|
||||||
|
|
Loading…
Reference in a new issue