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:
@ -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.
|
||||||
|
Reference in New Issue
Block a user