1
0
mirror of https://github.com/MariaDB/server.git synced 2025-07-29 05:21:33 +03:00

Threadpool - support changing group on Windows with generic thread pool

This commit is contained in:
Vladislav Vaintroub
2020-05-19 22:55:52 +02:00
parent d8ea11a33f
commit 17437eb259

View File

@ -394,9 +394,38 @@ static int io_poll_associate_fd(TP_file_handle pollfd, TP_file_handle fd, void *
} }
typedef LONG NTSTATUS;
typedef struct _IO_STATUS_BLOCK {
union {
NTSTATUS Status;
PVOID Pointer;
};
ULONG_PTR Information;
} IO_STATUS_BLOCK, * PIO_STATUS_BLOCK;
struct FILE_COMPLETION_INFORMATION {
HANDLE Port;
PVOID Key;
};
enum FILE_INFORMATION_CLASS {
FileReplaceCompletionInformation = 0x3D
};
typedef NTSTATUS(WINAPI* pNtSetInformationFile)(HANDLE, PIO_STATUS_BLOCK, PVOID, ULONG, FILE_INFORMATION_CLASS);
int io_poll_disassociate_fd(TP_file_handle pollfd, TP_file_handle fd) int io_poll_disassociate_fd(TP_file_handle pollfd, TP_file_handle fd)
{ {
/* Not possible to unbind/rebind file descriptor in IOCP. */ static pNtSetInformationFile my_NtSetInformationFile = (pNtSetInformationFile)
GetProcAddress(GetModuleHandle("ntdll"), "NtSetInformationFile");
if (!my_NtSetInformationFile)
return -1; /* unexpected, we only support Windows 8.1+*/
IO_STATUS_BLOCK iosb{};
FILE_COMPLETION_INFORMATION fci{};
if (my_NtSetInformationFile(fd,&iosb,&fci,sizeof(fci),FileReplaceCompletionInformation))
return -1;
return 0; return 0;
} }
@ -1409,7 +1438,6 @@ void TP_connection_generic::set_io_timeout(int timeout_sec)
} }
#ifndef HAVE_IOCP
/** /**
Handle a (rare) special case,where connection needs to Handle a (rare) special case,where connection needs to
migrate to a different group because group_count has changed migrate to a different group because group_count has changed
@ -1444,11 +1472,9 @@ static int change_group(TP_connection_generic *c,
mysql_mutex_unlock(&new_group->mutex); mysql_mutex_unlock(&new_group->mutex);
return ret; return ret;
} }
#endif
int TP_connection_generic::start_io() int TP_connection_generic::start_io()
{ {
#ifndef HAVE_IOCP
/* /*
Usually, connection will stay in the same group for the entire Usually, connection will stay in the same group for the entire
connection's life. However, we do allow group_count to connection's life. However, we do allow group_count to
@ -1467,7 +1493,6 @@ int TP_connection_generic::start_io()
if (change_group(this, thread_group, group)) if (change_group(this, thread_group, group))
return -1; return -1;
} }
#endif
/* /*
Bind to poll descriptor if not yet done. Bind to poll descriptor if not yet done.