diff options
| author | Kim F. Storm | 2006-07-14 14:18:40 +0000 |
|---|---|---|
| committer | Kim F. Storm | 2006-07-14 14:18:40 +0000 |
| commit | 64570b36c56a950c1fd255ba8548aa01674cc62d (patch) | |
| tree | 7f53036433d9c9a305fcfe8c8ac9f541b97f4fe3 /src | |
| parent | 41bab5e373421ffbb8199d560587eb1c9964a19d (diff) | |
| download | emacs-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.c | 58 |
1 files changed, 44 insertions, 14 deletions
| @@ -2701,6 +2701,8 @@ 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_WSAEventSelect) (SOCKET s, HANDLE hEventObject, long lNetworkEvents); |
| 2704 | HANDLE (PASCAL *pfn_WSACreateEvent) (void); | ||
| 2705 | int (PASCAL *pfn_WSACloseEvent) (HANDLE hEvent); | ||
| 2704 | int (PASCAL *pfn_socket) (int af, int type, int protocol); | 2706 | int (PASCAL *pfn_socket) (int af, int type, int protocol); |
| 2705 | int (PASCAL *pfn_bind) (SOCKET s, const struct sockaddr *addr, int namelen); | 2707 | int (PASCAL *pfn_bind) (SOCKET s, const struct sockaddr *addr, int namelen); |
| 2706 | int (PASCAL *pfn_connect) (SOCKET s, const struct sockaddr *addr, int namelen); | 2708 | int (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 | ||
| 3656 | int _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 | |||
| 3656 | int | 3686 | int |
| 3657 | sys_read (int fd, char * buffer, unsigned int count) | 3687 | sys_read (int fd, char * buffer, unsigned int count) |
| 3658 | { | 3688 | { |