aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKim F. Storm2006-07-14 09:29:32 +0000
committerKim F. Storm2006-07-14 09:29:32 +0000
commit26fb7bc42235487b8558e08becccb5e3754a3a6a (patch)
tree2db76456c67fbfa860bc94a917c250eac4dfcf84
parentd18f316eff288d854148cc09376ac87acd69afe4 (diff)
downloademacs-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.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/src/w32.c b/src/w32.c
index f11ffb7a785..10b912709fc 100644
--- a/src/w32.c
+++ b/src/w32.c
@@ -2700,6 +2700,7 @@ utime (const char *name, struct utimbuf *times)
2700int (PASCAL *pfn_WSAStartup) (WORD wVersionRequired, LPWSADATA lpWSAData); 2700int (PASCAL *pfn_WSAStartup) (WORD wVersionRequired, LPWSADATA lpWSAData);
2701void (PASCAL *pfn_WSASetLastError) (int iError); 2701void (PASCAL *pfn_WSASetLastError) (int iError);
2702int (PASCAL *pfn_WSAGetLastError) (void); 2702int (PASCAL *pfn_WSAGetLastError) (void);
2703int (PASCAL *pfn_WSAEventSelect) (SOCKET s, HANDLE hEventObject, long lNetworkEvents);
2703int (PASCAL *pfn_socket) (int af, int type, int protocol); 2704int (PASCAL *pfn_socket) (int af, int type, int protocol);
2704int (PASCAL *pfn_bind) (SOCKET s, const struct sockaddr *addr, int namelen); 2705int (PASCAL *pfn_bind) (SOCKET s, const struct sockaddr *addr, int namelen);
2705int (PASCAL *pfn_connect) (SOCKET s, const struct sockaddr *addr, int namelen); 2706int (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;