Commit 4e4b3db4 authored by unknown's avatar unknown
Browse files

Merge mysql.com:/home/wax/mysql/mysql-4.1

into mysql.com:/home/wax/mysql/mysql-4.1smemory


sql/mysqld.cc:
  Auto merged
parents 7901cd30 79a0ed62
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -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;
+11 −1
Original line number Diff line number Diff line
@@ -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 @@ HANDLE create_shared_memory(MYSQL *mysql,NET *net, uint connect_timeout)
    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 @@ HANDLE create_shared_memory(MYSQL *mysql,NET *net, uint connect_timeout)
      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)
+10 −1
Original line number Diff line number Diff line
@@ -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 @@ pthread_handler_decl(handle_connections_shared_memory,arg)
    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;
  }

+3 −1
Original line number Diff line number Diff line
@@ -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;
+23 −8
Original line number Diff line number Diff line
@@ -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");
  if (vio->type != VIO_CLOSED)
  {
    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)
    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__ */