summaryrefslogtreecommitdiff
path: root/vio/viosocket.c
diff options
context:
space:
mode:
authorwax@mysql.com <>2004-12-23 14:44:21 +0500
committerwax@mysql.com <>2004-12-23 14:44:21 +0500
commita3e73fc67308c7ddcb0296cc19a5fd5ab47d900a (patch)
tree78717d3b2092219426f050aac2033a79f44148be /vio/viosocket.c
parented3e1bb0065d2b694bb220517084771d29163b89 (diff)
parent0c8a78cca1ec1a8a93d80dd7355eba4123ccbe2c (diff)
downloadmariadb-git-a3e73fc67308c7ddcb0296cc19a5fd5ab47d900a.tar.gz
Merge mysql.com:/home/wax/mysql/mysql-4.1
into mysql.com:/home/wax/mysql/mysql-4.1smemory
Diffstat (limited to 'vio/viosocket.c')
-rw-r--r--vio/viosocket.c31
1 files changed, 23 insertions, 8 deletions
diff --git a/vio/viosocket.c b/vio/viosocket.c
index 48a9058480a..caf9451df7a 100644
--- a/vio/viosocket.c
+++ b/vio/viosocket.c
@@ -381,10 +381,21 @@ int vio_read_shared_memory(Vio * vio, gptr buf, int size)
{
if (vio->shared_memory_remain == 0)
{
- if (WaitForSingleObject(vio->event_server_wrote,vio->net->read_timeout*1000) != WAIT_OBJECT_0)
+ HANDLE events[2];
+ events[0]= vio->event_server_wrote;
+ events[1]= vio->event_conn_closed;
+ /*
+ WaitForMultipleObjects can return next values:
+ WAIT_OBJECT_0+0 - event from vio->event_server_wrote
+ WAIT_OBJECT_0+1 - event from vio->event_conn_closed. We can't read anything
+ WAIT_ABANDONED_0 and WAIT_TIMEOUT - fail. We can't read anything
+ */
+ if (WaitForMultipleObjects(2,(HANDLE*)&events,FALSE,
+ vio->net->read_timeout*1000) != WAIT_OBJECT_0)
{
DBUG_RETURN(-1);
};
+
vio->shared_memory_pos = vio->handle_map;
vio->shared_memory_remain = uint4korr((ulong*)vio->shared_memory_pos);
vio->shared_memory_pos+=4;
@@ -454,17 +465,21 @@ int vio_close_shared_memory(Vio * vio)
{
int r;
DBUG_ENTER("vio_close_shared_memory");
- r=UnmapViewOfFile(vio->handle_map) || CloseHandle(vio->event_server_wrote) ||
- CloseHandle(vio->event_server_read) || CloseHandle(vio->event_client_wrote) ||
- CloseHandle(vio->event_client_read) || CloseHandle(vio->handle_file_map);
- if (r)
+ if (vio->type != VIO_CLOSED)
{
- DBUG_PRINT("vio_error", ("close() failed, error: %d",r));
- /* FIXME: error handling (not critical for MySQL) */
+ SetEvent(vio->event_conn_closed);
+ r=UnmapViewOfFile(vio->handle_map) || CloseHandle(vio->event_server_wrote) ||
+ CloseHandle(vio->event_server_read) || CloseHandle(vio->event_client_wrote) ||
+ CloseHandle(vio->event_client_read) || CloseHandle(vio->handle_file_map);
+ if (!r)
+ {
+ DBUG_PRINT("vio_error", ("close() failed, error: %d",r));
+ /* FIXME: error handling (not critical for MySQL) */
+ }
}
vio->type= VIO_CLOSED;
vio->sd= -1;
- DBUG_RETURN(r);
+ DBUG_RETURN(!r);
}
#endif /* HAVE_SMEM */
#endif /* __WIN__ */