mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 20:12:31 +01:00
Merge mysql.com:/home/wax/mysql/mysql-4.1
into mysql.com:/home/wax/mysql/mysql-4.1smemory
This commit is contained in:
commit
a3e73fc673
5 changed files with 50 additions and 12 deletions
|
@ -45,7 +45,8 @@ Vio* vio_new_win32shared_memory(NET *net,HANDLE handle_file_map,
|
|||
HANDLE event_server_wrote,
|
||||
HANDLE event_server_read,
|
||||
HANDLE event_client_wrote,
|
||||
HANDLE event_client_read);
|
||||
HANDLE event_client_read,
|
||||
HANDLE event_conn_closed);
|
||||
int vio_read_pipe(Vio *vio, gptr buf, int size);
|
||||
int vio_write_pipe(Vio *vio, const gptr buf, int size);
|
||||
int vio_close_pipe(Vio * vio);
|
||||
|
@ -197,6 +198,7 @@ struct st_vio
|
|||
HANDLE event_server_read;
|
||||
HANDLE event_client_wrote;
|
||||
HANDLE event_client_read;
|
||||
HANDLE event_conn_closed;
|
||||
long shared_memory_remain;
|
||||
char *shared_memory_pos;
|
||||
NET *net;
|
||||
|
|
|
@ -396,6 +396,7 @@ HANDLE create_shared_memory(MYSQL *mysql,NET *net, uint connect_timeout)
|
|||
HANDLE event_server_read = NULL;
|
||||
HANDLE event_client_wrote = NULL;
|
||||
HANDLE event_client_read = NULL;
|
||||
HANDLE event_conn_closed = NULL;
|
||||
HANDLE handle_file_map = NULL;
|
||||
ulong connect_number;
|
||||
char connect_number_char[22], *p;
|
||||
|
@ -508,6 +509,13 @@ HANDLE create_shared_memory(MYSQL *mysql,NET *net, uint connect_timeout)
|
|||
error_allow = CR_SHARED_MEMORY_EVENT_ERROR;
|
||||
goto err2;
|
||||
}
|
||||
|
||||
strmov(suffix_pos, "CONNECTION_CLOSED");
|
||||
if ((event_conn_closed = OpenEvent(EVENT_ALL_ACCESS,FALSE,tmp)) == NULL)
|
||||
{
|
||||
error_allow = CR_SHARED_MEMORY_EVENT_ERROR;
|
||||
goto err2;
|
||||
}
|
||||
/*
|
||||
Set event that server should send data
|
||||
*/
|
||||
|
@ -519,7 +527,7 @@ err2:
|
|||
net->vio= vio_new_win32shared_memory(net,handle_file_map,handle_map,
|
||||
event_server_wrote,
|
||||
event_server_read,event_client_wrote,
|
||||
event_client_read);
|
||||
event_client_read,event_conn_closed);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -532,6 +540,8 @@ err2:
|
|||
CloseHandle(event_client_read);
|
||||
if (event_client_wrote)
|
||||
CloseHandle(event_client_wrote);
|
||||
if (event_conn_closed)
|
||||
CloseHandle(event_conn_closed);
|
||||
if (handle_map)
|
||||
UnmapViewOfFile(handle_map);
|
||||
if (handle_file_map)
|
||||
|
|
|
@ -3822,6 +3822,7 @@ pthread_handler_decl(handle_connections_shared_memory,arg)
|
|||
HANDLE event_client_read= 0; // for transfer data server <-> client
|
||||
HANDLE event_server_wrote= 0;
|
||||
HANDLE event_server_read= 0;
|
||||
HANDLE event_conn_closed= 0;
|
||||
THD *thd= 0;
|
||||
|
||||
p= int10_to_str(connect_number, connect_number_char, 10);
|
||||
|
@ -3875,6 +3876,12 @@ pthread_handler_decl(handle_connections_shared_memory,arg)
|
|||
errmsg= "Could not create server write event";
|
||||
goto errorconn;
|
||||
}
|
||||
strmov(suffix_pos, "CONNECTION_CLOSED");
|
||||
if ((event_conn_closed= CreateEvent(0,TRUE,FALSE,tmp)) == 0)
|
||||
{
|
||||
errmsg= "Could not create closed connection event";
|
||||
goto errorconn;
|
||||
}
|
||||
if (abort_loop)
|
||||
goto errorconn;
|
||||
if (!(thd= new THD))
|
||||
|
@ -3898,7 +3905,8 @@ pthread_handler_decl(handle_connections_shared_memory,arg)
|
|||
event_client_wrote,
|
||||
event_client_read,
|
||||
event_server_wrote,
|
||||
event_server_read)) ||
|
||||
event_server_read,
|
||||
event_conn_closed)) ||
|
||||
my_net_init(&thd->net, thd->net.vio))
|
||||
{
|
||||
close_connection(thd, ER_OUT_OF_RESOURCES, 1);
|
||||
|
@ -3925,6 +3933,7 @@ errorconn:
|
|||
if (event_server_read) CloseHandle(event_server_read);
|
||||
if (event_client_wrote) CloseHandle(event_client_wrote);
|
||||
if (event_client_read) CloseHandle(event_client_read);
|
||||
if (event_conn_closed) CloseHandle(event_conn_closed);
|
||||
delete thd;
|
||||
}
|
||||
|
||||
|
|
|
@ -171,7 +171,8 @@ Vio *vio_new_win32pipe(HANDLE hPipe)
|
|||
#ifdef HAVE_SMEM
|
||||
Vio *vio_new_win32shared_memory(NET *net,HANDLE handle_file_map, HANDLE handle_map,
|
||||
HANDLE event_server_wrote, HANDLE event_server_read,
|
||||
HANDLE event_client_wrote, HANDLE event_client_read)
|
||||
HANDLE event_client_wrote, HANDLE event_client_read,
|
||||
HANDLE event_conn_closed)
|
||||
{
|
||||
Vio *vio;
|
||||
DBUG_ENTER("vio_new_win32shared_memory");
|
||||
|
@ -184,6 +185,7 @@ Vio *vio_new_win32shared_memory(NET *net,HANDLE handle_file_map, HANDLE handle_m
|
|||
vio->event_server_read = event_server_read;
|
||||
vio->event_client_wrote = event_client_wrote;
|
||||
vio->event_client_read = event_client_read;
|
||||
vio->event_conn_closed = event_conn_closed;
|
||||
vio->shared_memory_remain = 0;
|
||||
vio->shared_memory_pos = handle_map;
|
||||
vio->net = net;
|
||||
|
|
|
@ -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__ */
|
||||
|
|
Loading…
Reference in a new issue