summaryrefslogtreecommitdiff
path: root/sql/threadpool_generic.cc
diff options
context:
space:
mode:
authorVladislav Vaintroub <wlad@mariadb.com>2020-05-19 22:55:52 +0200
committerVladislav Vaintroub <wlad@mariadb.com>2020-05-25 14:54:00 +0200
commit17437eb2597fb9138f0c8ca6a7a4870e9afc937c (patch)
treee6552d7b733d142fcf86ab3e725500a40ec05d8d /sql/threadpool_generic.cc
parentd8ea11a33fba12331c98c04ff44c815a662faccb (diff)
downloadmariadb-git-17437eb2597fb9138f0c8ca6a7a4870e9afc937c.tar.gz
Threadpool - support changing group on Windows with generic thread pool
Diffstat (limited to 'sql/threadpool_generic.cc')
-rw-r--r--sql/threadpool_generic.cc35
1 files changed, 30 insertions, 5 deletions
diff --git a/sql/threadpool_generic.cc b/sql/threadpool_generic.cc
index 7aebd217d68..92ef485680c 100644
--- a/sql/threadpool_generic.cc
+++ b/sql/threadpool_generic.cc
@@ -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)
{
- /* 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;
}
@@ -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
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);
return ret;
}
-#endif
int TP_connection_generic::start_io()
{
-#ifndef HAVE_IOCP
/*
Usually, connection will stay in the same group for the entire
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))
return -1;
}
-#endif
/*
Bind to poll descriptor if not yet done.