1
0
mirror of https://github.com/MariaDB/server.git synced 2025-08-08 11:22:35 +03:00

Added socketpair.c as a replacement for 'pipe()' call for Windows.

This was needed to get semisync to work on Windows.
This commit is contained in:
Monty
2023-12-25 15:30:03 +02:00
parent 7af50e4df4
commit 1ca813bf76
6 changed files with 263 additions and 14 deletions

View File

@@ -20,6 +20,7 @@
#include "my_pthread.h"
#include "sql_class.h"
#include "semisync.h"
#include "socketpair.h"
#include <vector>
struct Slave :public ilink
@@ -127,32 +128,54 @@ private:
};
extern int global_ack_signal_fd;
extern my_socket global_ack_signal_fd;
class Ack_listener
{
public:
int local_read_signal;
my_socket local_read_signal;
const Slave_ilist &m_slaves;
int error;
Ack_listener(const Slave_ilist &slaves)
:m_slaves(slaves)
:local_read_signal(-1), m_slaves(slaves), error(0)
{
int pipes[2];
pipe(pipes);
global_ack_signal_fd= pipes[1];
my_socket pipes[2];
#ifdef _WIN32
error= create_socketpair(pipes);
#else
if (!pipe(pipes))
{
fcntl(pipes[0], F_SETFL, O_NONBLOCK);
fcntl(pipes[1], F_SETFL, O_NONBLOCK);
}
else
{
pipes[0]= pipes[1]= -1;
}
#endif /* _WIN32 */
local_read_signal= pipes[0];
fcntl(pipes[0], F_SETFL, O_NONBLOCK);
fcntl(pipes[1], F_SETFL, O_NONBLOCK);
global_ack_signal_fd= pipes[1];
}
virtual ~Ack_listener()
{
close(global_ack_signal_fd);
close(local_read_signal);
global_ack_signal_fd= -1;
#ifdef _WIN32
my_socket pipes[2];
pipes[0]= local_read_signal;
pipes[1]= global_ack_signal_fd;
close_socketpair(pipes);
#else
if (global_ack_signal_fd >= 0)
close(global_ack_signal_fd);
if (local_read_signal >= 0)
close(local_read_signal);
#endif /* _WIN32 */
global_ack_signal_fd= local_read_signal= -1;
}
int got_error() { return error; }
virtual bool has_signal_data()= 0;
/* Clear data sent by signal_listener() to abort read */
@@ -162,14 +185,22 @@ public:
{
char buff[100];
/* Clear the signal message */
#ifndef _WIN32
read(local_read_signal, buff, sizeof(buff));
#else
recv(local_read_signal, buff, sizeof(buff), 0);
#endif /* _WIN32 */
}
}
};
static inline void signal_listener()
{
#ifndef _WIN32
my_write(global_ack_signal_fd, (uchar*) "a", 1, MYF(0));
#else
send(global_ack_signal_fd, "a", 1, 0);
#endif /* _WIN32 */
}
#ifdef HAVE_POLL