aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorKim F. Storm2006-07-14 14:18:40 +0000
committerKim F. Storm2006-07-14 14:18:40 +0000
commit64570b36c56a950c1fd255ba8548aa01674cc62d (patch)
tree7f53036433d9c9a305fcfe8c8ac9f541b97f4fe3 /src
parent41bab5e373421ffbb8199d560587eb1c9964a19d (diff)
downloademacs-64570b36c56a950c1fd255ba8548aa01674cc62d.tar.gz
emacs-64570b36c56a950c1fd255ba8548aa01674cc62d.zip
(pfn_WSACreateEvent, pfn_WSACloseEvent): New func ptrs.
(init_winsock): Load them. Use ws2_32.dll. (sys_listen): Undo last change. Just set FILE_LISTEN flag. (sys_accept): Undo last change. Instead, set child status to STATUS_READ_ACKNOWLEDGED and reset char_avail event so next sys_select will wakeup the reader thread. (_sys_wait_accept): New function used by reader thread to wait for an incoming connection on a server socket.
Diffstat (limited to 'src')
-rw-r--r--src/w32.c58
1 files changed, 44 insertions, 14 deletions
diff --git a/src/w32.c b/src/w32.c
index 10b912709fc..d01a1022a19 100644
--- a/src/w32.c
+++ b/src/w32.c
@@ -2701,6 +2701,8 @@ int (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_WSAEventSelect) (SOCKET s, HANDLE hEventObject, long lNetworkEvents);
2704HANDLE (PASCAL *pfn_WSACreateEvent) (void);
2705int (PASCAL *pfn_WSACloseEvent) (HANDLE hEvent);
2704int (PASCAL *pfn_socket) (int af, int type, int protocol); 2706int (PASCAL *pfn_socket) (int af, int type, int protocol);
2705int (PASCAL *pfn_bind) (SOCKET s, const struct sockaddr *addr, int namelen); 2707int (PASCAL *pfn_bind) (SOCKET s, const struct sockaddr *addr, int namelen);
2706int (PASCAL *pfn_connect) (SOCKET s, const struct sockaddr *addr, int namelen); 2708int (PASCAL *pfn_connect) (SOCKET s, const struct sockaddr *addr, int namelen);
@@ -2770,7 +2772,7 @@ init_winsock (int load_now)
2770 = (void *) GetProcAddress (GetModuleHandle ("kernel32.dll"), 2772 = (void *) GetProcAddress (GetModuleHandle ("kernel32.dll"),
2771 "SetHandleInformation"); 2773 "SetHandleInformation");
2772 2774
2773 winsock_lib = LoadLibrary ("wsock32.dll"); 2775 winsock_lib = LoadLibrary ("Ws2_32.dll");
2774 2776
2775 if (winsock_lib != NULL) 2777 if (winsock_lib != NULL)
2776 { 2778 {
@@ -2784,6 +2786,8 @@ init_winsock (int load_now)
2784 LOAD_PROC( WSASetLastError ); 2786 LOAD_PROC( WSASetLastError );
2785 LOAD_PROC( WSAGetLastError ); 2787 LOAD_PROC( WSAGetLastError );
2786 LOAD_PROC( WSAEventSelect ); 2788 LOAD_PROC( WSAEventSelect );
2789 LOAD_PROC( WSACreateEvent );
2790 LOAD_PROC( WSACloseEvent );
2787 LOAD_PROC( socket ); 2791 LOAD_PROC( socket );
2788 LOAD_PROC( bind ); 2792 LOAD_PROC( bind );
2789 LOAD_PROC( connect ); 2793 LOAD_PROC( connect );
@@ -3298,10 +3302,7 @@ sys_listen (int s, int backlog)
3298 if (rc == SOCKET_ERROR) 3302 if (rc == SOCKET_ERROR)
3299 set_errno (); 3303 set_errno ();
3300 else 3304 else
3301 { 3305 fd_info[s].flags |= FILE_LISTEN;
3302 fd_info[s].flags |= FILE_LISTEN;
3303 pfn_WSAEventSelect (SOCK_HANDLE (s), fd_info[s].cp->char_avail, FD_ACCEPT);
3304 }
3305 return rc; 3306 return rc;
3306 } 3307 }
3307 h_errno = ENOTSOCK; 3308 h_errno = ENOTSOCK;
@@ -3342,16 +3343,15 @@ sys_accept (int s, struct sockaddr * addr, int * addrlen)
3342 if (fd_info[s].flags & FILE_LISTEN) 3343 if (fd_info[s].flags & FILE_LISTEN)
3343 { 3344 {
3344 SOCKET t = pfn_accept (SOCK_HANDLE (s), addr, addrlen); 3345 SOCKET t = pfn_accept (SOCK_HANDLE (s), addr, addrlen);
3345 if (t != INVALID_SOCKET) 3346 int fd = -1;
3346 { 3347 if (t == INVALID_SOCKET)
3347 int fd = socket_to_fd (t); 3348 set_errno ();
3348 if (fd >= 0) 3349 else
3349 pfn_WSAEventSelect (SOCK_HANDLE (fd), fd_info[fd].cp->char_avail, FD_READ | FD_CLOSE); 3350 fd = socket_to_fd (t);
3350 return fd;
3351 }
3352 3351
3353 set_errno (); 3352 fd_info[s].cp->status = STATUS_READ_ACKNOWLEDGED;
3354 return -1; 3353 ResetEvent (fd_info[s].cp->char_avail);
3354 return fd;
3355 } 3355 }
3356 h_errno = ENOTSOCK; 3356 h_errno = ENOTSOCK;
3357 return -1; 3357 return -1;
@@ -3653,6 +3653,36 @@ _sys_read_ahead (int fd)
3653 return cp->status; 3653 return cp->status;
3654} 3654}
3655 3655
3656int _sys_wait_accept (int fd)
3657{
3658 HANDLE hEv;
3659 child_process * cp;
3660 int rc;
3661
3662 if (fd < 0 || fd >= MAXDESC)
3663 return STATUS_READ_ERROR;
3664
3665 cp = fd_info[fd].cp;
3666
3667 if (cp == NULL || cp->fd != fd || cp->status != STATUS_READ_READY)
3668 return STATUS_READ_ERROR;
3669
3670 cp->status = STATUS_READ_FAILED;
3671
3672 hEv = pfn_WSACreateEvent ();
3673 rc = pfn_WSAEventSelect (SOCK_HANDLE (fd), hEv, FD_ACCEPT);
3674 if (rc != SOCKET_ERROR)
3675 {
3676 rc = WaitForSingleObject (hEv, INFINITE);
3677 pfn_WSAEventSelect (SOCK_HANDLE (fd), NULL, 0);
3678 pfn_WSACloseEvent (hEv);
3679 if (rc == WAIT_OBJECT_0)
3680 cp->status = STATUS_READ_SUCCEEDED;
3681 }
3682
3683 return cp->status;
3684}
3685
3656int 3686int
3657sys_read (int fd, char * buffer, unsigned int count) 3687sys_read (int fd, char * buffer, unsigned int count)
3658{ 3688{