diff options
| author | Kim F. Storm | 2006-07-14 09:29:32 +0000 |
|---|---|---|
| committer | Kim F. Storm | 2006-07-14 09:29:32 +0000 |
| commit | 26fb7bc42235487b8558e08becccb5e3754a3a6a (patch) | |
| tree | 2db76456c67fbfa860bc94a917c250eac4dfcf84 | |
| parent | d18f316eff288d854148cc09376ac87acd69afe4 (diff) | |
| download | emacs-26fb7bc42235487b8558e08becccb5e3754a3a6a.tar.gz emacs-26fb7bc42235487b8558e08becccb5e3754a3a6a.zip | |
Fix high cpu load for server sockets.
(pfn_WSAEventSelect): New function ptr.
(init_winsock): Load it.
(sys_listen): Set FILE_LISTEN flag. Set event mask for socket's
char_avail event object to FD_ACCEPT.
(sys_accept): Check FILE_LISTEN flag. Set event mask on new
socket's char_avail event object to FD_READ|FD_CLOSE.
| -rw-r--r-- | src/w32.c | 16 |
1 files changed, 14 insertions, 2 deletions
| @@ -2700,6 +2700,7 @@ utime (const char *name, struct utimbuf *times) | |||
| 2700 | int (PASCAL *pfn_WSAStartup) (WORD wVersionRequired, LPWSADATA lpWSAData); | 2700 | int (PASCAL *pfn_WSAStartup) (WORD wVersionRequired, LPWSADATA lpWSAData); |
| 2701 | void (PASCAL *pfn_WSASetLastError) (int iError); | 2701 | void (PASCAL *pfn_WSASetLastError) (int iError); |
| 2702 | int (PASCAL *pfn_WSAGetLastError) (void); | 2702 | int (PASCAL *pfn_WSAGetLastError) (void); |
| 2703 | int (PASCAL *pfn_WSAEventSelect) (SOCKET s, HANDLE hEventObject, long lNetworkEvents); | ||
| 2703 | int (PASCAL *pfn_socket) (int af, int type, int protocol); | 2704 | int (PASCAL *pfn_socket) (int af, int type, int protocol); |
| 2704 | int (PASCAL *pfn_bind) (SOCKET s, const struct sockaddr *addr, int namelen); | 2705 | int (PASCAL *pfn_bind) (SOCKET s, const struct sockaddr *addr, int namelen); |
| 2705 | int (PASCAL *pfn_connect) (SOCKET s, const struct sockaddr *addr, int namelen); | 2706 | int (PASCAL *pfn_connect) (SOCKET s, const struct sockaddr *addr, int namelen); |
| @@ -2782,6 +2783,7 @@ init_winsock (int load_now) | |||
| 2782 | LOAD_PROC( WSAStartup ); | 2783 | LOAD_PROC( WSAStartup ); |
| 2783 | LOAD_PROC( WSASetLastError ); | 2784 | LOAD_PROC( WSASetLastError ); |
| 2784 | LOAD_PROC( WSAGetLastError ); | 2785 | LOAD_PROC( WSAGetLastError ); |
| 2786 | LOAD_PROC( WSAEventSelect ); | ||
| 2785 | LOAD_PROC( socket ); | 2787 | LOAD_PROC( socket ); |
| 2786 | LOAD_PROC( bind ); | 2788 | LOAD_PROC( bind ); |
| 2787 | LOAD_PROC( connect ); | 2789 | LOAD_PROC( connect ); |
| @@ -3295,6 +3297,11 @@ sys_listen (int s, int backlog) | |||
| 3295 | int rc = pfn_listen (SOCK_HANDLE (s), backlog); | 3297 | int rc = pfn_listen (SOCK_HANDLE (s), backlog); |
| 3296 | if (rc == SOCKET_ERROR) | 3298 | if (rc == SOCKET_ERROR) |
| 3297 | set_errno (); | 3299 | set_errno (); |
| 3300 | else | ||
| 3301 | { | ||
| 3302 | fd_info[s].flags |= FILE_LISTEN; | ||
| 3303 | pfn_WSAEventSelect (SOCK_HANDLE (s), fd_info[s].cp->char_avail, FD_ACCEPT); | ||
| 3304 | } | ||
| 3298 | return rc; | 3305 | return rc; |
| 3299 | } | 3306 | } |
| 3300 | h_errno = ENOTSOCK; | 3307 | h_errno = ENOTSOCK; |
| @@ -3332,11 +3339,16 @@ sys_accept (int s, struct sockaddr * addr, int * addrlen) | |||
| 3332 | } | 3339 | } |
| 3333 | 3340 | ||
| 3334 | check_errno (); | 3341 | check_errno (); |
| 3335 | if (fd_info[s].flags & FILE_SOCKET) | 3342 | if (fd_info[s].flags & FILE_LISTEN) |
| 3336 | { | 3343 | { |
| 3337 | SOCKET t = pfn_accept (SOCK_HANDLE (s), addr, addrlen); | 3344 | SOCKET t = pfn_accept (SOCK_HANDLE (s), addr, addrlen); |
| 3338 | if (t != INVALID_SOCKET) | 3345 | if (t != INVALID_SOCKET) |
| 3339 | return socket_to_fd (t); | 3346 | { |
| 3347 | int fd = socket_to_fd (t); | ||
| 3348 | if (fd >= 0) | ||
| 3349 | pfn_WSAEventSelect (SOCK_HANDLE (fd), fd_info[fd].cp->char_avail, FD_READ | FD_CLOSE); | ||
| 3350 | return fd; | ||
| 3351 | } | ||
| 3340 | 3352 | ||
| 3341 | set_errno (); | 3353 | set_errno (); |
| 3342 | return -1; | 3354 | return -1; |