fix write() and read() calls for in-thread gethostbyname()
This commit is contained in:
parent
39601cedcf
commit
dcda2b60d3
|
@ -453,6 +453,7 @@ static intptr_t getaddrinfo_in_thread(void *_data)
|
||||||
char hn_copy[MZ_MAX_HOSTNAME_LEN], sn_copy[MZ_MAX_SERVNAME_LEN];
|
char hn_copy[MZ_MAX_HOSTNAME_LEN], sn_copy[MZ_MAX_SERVNAME_LEN];
|
||||||
# ifndef USE_WINSOCK_TCP
|
# ifndef USE_WINSOCK_TCP
|
||||||
int fd = data->ready_fd;
|
int fd = data->ready_fd;
|
||||||
|
int cr;
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
if (data->ghbn_result) {
|
if (data->ghbn_result) {
|
||||||
|
@ -467,7 +468,9 @@ static intptr_t getaddrinfo_in_thread(void *_data)
|
||||||
# ifdef USE_WINSOCK_TCP
|
# ifdef USE_WINSOCK_TCP
|
||||||
ReleaseSemaphore(data->ready_sema, 1, NULL);
|
ReleaseSemaphore(data->ready_sema, 1, NULL);
|
||||||
# else
|
# else
|
||||||
write(fd, "?", 1);
|
do {
|
||||||
|
cr = write(fd, "?", 1);
|
||||||
|
} while ((cr == -1) && (errno == EINTR));
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
ok = mz_getaddrinfo(hn_copy[0] ? hn_copy : NULL,
|
ok = mz_getaddrinfo(hn_copy[0] ? hn_copy : NULL,
|
||||||
|
@ -480,8 +483,12 @@ static intptr_t getaddrinfo_in_thread(void *_data)
|
||||||
# ifndef USE_WINSOCK_TCP
|
# ifndef USE_WINSOCK_TCP
|
||||||
{
|
{
|
||||||
long v = 1;
|
long v = 1;
|
||||||
write(fd, &v, sizeof(v));
|
do {
|
||||||
close(fd);
|
cr = write(fd, &v, sizeof(v));
|
||||||
|
} while ((cr == -1) && (errno == EINTR));
|
||||||
|
do {
|
||||||
|
cr = close(fd);
|
||||||
|
} while ((cr == -1) && (errno == EINTR));
|
||||||
}
|
}
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
|
@ -521,7 +528,11 @@ static int ghbn_thread_done(Scheme_Object *_rec)
|
||||||
# else
|
# else
|
||||||
{
|
{
|
||||||
long v;
|
long v;
|
||||||
if (read(rec->pin, &v, sizeof(long)) > 0) {
|
int cr;
|
||||||
|
do {
|
||||||
|
cr = read(rec->pin, &v, sizeof(long));
|
||||||
|
} while ((cr == -1) && (errno == EINTR));
|
||||||
|
if (cr > 0) {
|
||||||
rec->result = ghbn_thread_data->ghbn_result;
|
rec->result = ghbn_thread_data->ghbn_result;
|
||||||
ghbn_thread_data->ghbn_result = NULL;
|
ghbn_thread_data->ghbn_result = NULL;
|
||||||
rec->err = ghbn_thread_data->ghbn_err;
|
rec->err = ghbn_thread_data->ghbn_err;
|
||||||
|
@ -619,8 +630,11 @@ static int MZ_GETADDRINFO(const char *name, const char *svc, struct mz_addrinfo
|
||||||
ok = 0;
|
ok = 0;
|
||||||
} else {
|
} else {
|
||||||
char buf[1];
|
char buf[1];
|
||||||
|
int cr;
|
||||||
pthread_detach(t);
|
pthread_detach(t);
|
||||||
read(rec->pin, buf, 1);
|
do {
|
||||||
|
cr = read(rec->pin, buf, 1);
|
||||||
|
} while ((cr == -1) && (errno == EINTR));
|
||||||
fcntl(rec->pin, F_SETFL, MZ_NONBLOCKING);
|
fcntl(rec->pin, F_SETFL, MZ_NONBLOCKING);
|
||||||
ok = 1;
|
ok = 1;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user