mirror of
https://github.com/SoftEtherVPN/SoftEtherVPN.git
synced 2024-11-22 17:39:53 +03:00
Merge pull request #165 from micsell/cpupatch
Fixed OSX CPU utilization by replacing broken kevent() with select()
This commit is contained in:
commit
697bff4023
@ -9160,12 +9160,23 @@ void UnixSetSockEvent(SOCK_EVENT *event)
|
||||
}
|
||||
}
|
||||
|
||||
// This is a helper function for select()
|
||||
int safe_fd_set(int fd, fd_set* fds, int* max_fd) {
|
||||
FD_SET(fd, fds);
|
||||
if (fd > *max_fd) {
|
||||
*max_fd = fd;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Execute 'select' for the socket
|
||||
void UnixSelectInner(UINT num_read, UINT *reads, UINT num_write, UINT *writes, UINT timeout)
|
||||
{
|
||||
#ifdef UNIX_MACOS
|
||||
int kq;
|
||||
struct kevent *kevents;
|
||||
fd_set rfds; //read descriptors
|
||||
fd_set wfds; //write descriptors
|
||||
int max_fd = 0; //maximum descriptor id
|
||||
struct timeval tv; //timeval for timeout
|
||||
#else // UNIX_MACOS
|
||||
struct pollfd *p;
|
||||
#endif // UNIX_MACOS
|
||||
@ -9206,8 +9217,8 @@ void UnixSelectInner(UINT num_read, UINT *reads, UINT num_write, UINT *writes, U
|
||||
|
||||
num = num_read_total + num_write_total;
|
||||
#ifdef UNIX_MACOS
|
||||
kq = kqueue();
|
||||
kevents = ZeroMallocFast(sizeof(struct kevent) * (num + num_write_total));
|
||||
FD_ZERO(&rfds); //zero out descriptor set for read descriptors
|
||||
FD_ZERO(&wfds); //same for write
|
||||
#else // UNIX_MACOS
|
||||
p = ZeroMallocFast(sizeof(struct pollfd) * num);
|
||||
#endif // UNIX_MACOS
|
||||
@ -9219,7 +9230,7 @@ void UnixSelectInner(UINT num_read, UINT *reads, UINT num_write, UINT *writes, U
|
||||
if (reads[i] != INVALID_SOCKET)
|
||||
{
|
||||
#ifdef UNIX_MACOS
|
||||
EV_SET(&kevents[n++], reads[i], EVFILT_READ, EV_ADD, 0, 0, NULL);
|
||||
safe_fd_set(reads[i], &rfds, &max_fd);
|
||||
#else // UNIX_MACOS
|
||||
struct pollfd *pfd = &p[n++];
|
||||
pfd->fd = reads[i];
|
||||
@ -9233,8 +9244,7 @@ void UnixSelectInner(UINT num_read, UINT *reads, UINT num_write, UINT *writes, U
|
||||
if (writes[i] != INVALID_SOCKET)
|
||||
{
|
||||
#ifdef UNIX_MACOS
|
||||
EV_SET(&kevents[n++], reads[i], EVFILT_READ, EV_ADD, 0, 0, NULL);
|
||||
EV_SET(&kevents[n++], reads[i], EVFILT_WRITE, EV_ADD, 0, 0, NULL);
|
||||
safe_fd_set(writes[i], &wfds, &max_fd);
|
||||
#else // UNIX_MACOS
|
||||
struct pollfd *pfd = &p[n++];
|
||||
pfd->fd = writes[i];
|
||||
@ -9246,15 +9256,14 @@ void UnixSelectInner(UINT num_read, UINT *reads, UINT num_write, UINT *writes, U
|
||||
if (num != 0)
|
||||
{
|
||||
#ifdef UNIX_MACOS
|
||||
struct timespec kevent_timeout, *p_kevent_timeout;
|
||||
if (timeout == INFINITE) {
|
||||
p_kevent_timeout = NULL;
|
||||
tv.tv_sec = 0;
|
||||
tv.tv_usec = 0;
|
||||
} else {
|
||||
kevent_timeout.tv_sec = timeout / 1000;
|
||||
kevent_timeout.tv_nsec = (timeout % 1000) * 1000000l;
|
||||
p_kevent_timeout = &kevent_timeout;
|
||||
tv.tv_sec = timeout / 1000;
|
||||
tv.tv_usec = (timeout % 1000) * 1000l;
|
||||
}
|
||||
kevent(kq, kevents, n, kevents, n, p_kevent_timeout);
|
||||
select(max_fd + 1, &rfds, &wfds, NULL, &tv);
|
||||
#else // UNIX_MACOS
|
||||
poll(p, num, timeout == INFINITE ? -1 : (int)timeout);
|
||||
#endif // UNIX_MACOS
|
||||
@ -9264,12 +9273,9 @@ void UnixSelectInner(UINT num_read, UINT *reads, UINT num_write, UINT *writes, U
|
||||
SleepThread(timeout);
|
||||
}
|
||||
|
||||
#ifdef UNIX_MACOS
|
||||
Free(kevents);
|
||||
close(kq);
|
||||
#else // UNIX_MACOS
|
||||
#ifndef UNIX_MACOS
|
||||
Free(p);
|
||||
#endif // UNIX_MACOS
|
||||
#endif // not UNIX_MACOS
|
||||
}
|
||||
|
||||
// Clean-up of the socket event
|
||||
|
Loading…
Reference in New Issue
Block a user