420
size_t vio_read_pipe(Vio * vio, uchar* buf, size_t size)
416
Finish pending IO on pipe. Honor wait timeout
418
static int pipe_complete_io(Vio* vio, char* buf, size_t size, DWORD timeout_millis)
423
DBUG_ENTER("pipe_complete_io");
425
ret= WaitForSingleObject(vio->pipe_overlapped.hEvent, timeout_millis);
427
WaitForSingleObjects will normally return WAIT_OBJECT_O (success, IO completed)
430
if(ret != WAIT_OBJECT_0)
432
CancelIo(vio->hPipe);
433
DBUG_PRINT("error",("WaitForSingleObject() returned %d", ret));
437
if (!GetOverlappedResult(vio->hPipe,&(vio->pipe_overlapped),&length, FALSE))
439
DBUG_PRINT("error",("GetOverlappedResult() returned last error %d",
448
size_t vio_read_pipe(Vio * vio, uchar *buf, size_t size)
423
451
DBUG_ENTER("vio_read_pipe");
424
452
DBUG_PRINT("enter", ("sd: %d buf: 0x%lx size: %u", vio->sd, (long) buf,
427
if (!ReadFile(vio->hPipe, buf, size, &length, NULL))
455
if (!ReadFile(vio->hPipe, buf, (DWORD)size, &bytes_read,
456
&(vio->pipe_overlapped)))
458
if (GetLastError() != ERROR_IO_PENDING)
460
DBUG_PRINT("error",("ReadFile() returned last error %d",
462
DBUG_RETURN((size_t)-1);
464
bytes_read= pipe_complete_io(vio, buf, size,vio->read_timeout_millis);
430
DBUG_PRINT("exit", ("%d", length));
431
DBUG_RETURN((size_t) length);
467
DBUG_PRINT("exit", ("%d", bytes_read));
468
DBUG_RETURN(bytes_read);
435
472
size_t vio_write_pipe(Vio * vio, const uchar* buf, size_t size)
438
475
DBUG_ENTER("vio_write_pipe");
439
476
DBUG_PRINT("enter", ("sd: %d buf: 0x%lx size: %u", vio->sd, (long) buf,
442
if (!WriteFile(vio->hPipe, (char*) buf, size, &length, NULL))
479
if (!WriteFile(vio->hPipe, buf, (DWORD)size, &bytes_written,
480
&(vio->pipe_overlapped)))
482
if (GetLastError() != ERROR_IO_PENDING)
484
DBUG_PRINT("vio_error",("WriteFile() returned last error %d",
486
DBUG_RETURN((size_t)-1);
488
bytes_written = pipe_complete_io(vio, (char *)buf, size,
489
vio->write_timeout_millis);
445
DBUG_PRINT("exit", ("%d", length));
446
DBUG_RETURN((size_t) length);
492
DBUG_PRINT("exit", ("%d", bytes_written));
493
DBUG_RETURN(bytes_written);
449
497
int vio_close_pipe(Vio * vio)
452
500
DBUG_ENTER("vio_close_pipe");
453
#if defined(__NT__) && defined(MYSQL_SERVER)
454
CancelIo(vio->hPipe);
502
CloseHandle(vio->pipe_overlapped.hEvent);
455
503
DisconnectNamedPipe(vio->hPipe);
457
r=CloseHandle(vio->hPipe);
504
r= CloseHandle(vio->hPipe);
460
507
DBUG_PRINT("vio_error", ("close() failed, error: %d",GetLastError()));
469
void vio_ignore_timeout(Vio *vio __attribute__((unused)),
470
uint which __attribute__((unused)),
471
uint timeout __attribute__((unused)))
516
void vio_win32_timeout(Vio *vio, uint which , uint timeout_sec)
518
DWORD timeout_millis;
520
Windows is measuring timeouts in milliseconds. Check for possible int
523
if (timeout_sec > UINT_MAX/1000)
524
timeout_millis= INFINITE;
526
timeout_millis= timeout_sec * 1000;
528
/* which == 1 means "write", which == 0 means "read".*/
530
vio->write_timeout_millis= timeout_millis;
532
vio->read_timeout_millis= timeout_millis;