* Re: emacs-27 d66331a: Don't build the Gnulib 'utimens' module on MinGW [not found] ` <20200323143829.ED56720E43@vcs0.savannah.gnu.org> @ 2020-03-23 15:26 ` Robert Pluim 2020-03-23 15:52 ` Eli Zaretskii 0 siblings, 1 reply; 5+ messages in thread From: Robert Pluim @ 2020-03-23 15:26 UTC (permalink / raw) To: emacs-devel; +Cc: Eli Zaretskii >>>>> On Mon, 23 Mar 2020 10:38:29 -0400 (EDT), eliz@gnu.org (Eli Zaretskii) said: Eli> branch: emacs-27 Eli> commit d66331aea4d86db17da2a4965e020274e623fda0 Eli> Author: Eli Zaretskii <eliz@gnu.org> Eli> Commit: Eli Zaretskii <eliz@gnu.org> Eli> Don't build the Gnulib 'utimens' module on MinGW Eli> * nt/gnulib-cfg.mk (OMIT_GNULIB_MODULE_utimens): Omit the Eli> 'utimens' module in the MinGW build: 'utimens' is not used by Eli> Emacs, and 'fdutimens' is implemented in w32.c. Apropos: we explicitly donʼt use the gnulib 'select' module, even though it looks like on MSWindows it handles both sockets and pipes. What functionality is it missing? Robert ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: emacs-27 d66331a: Don't build the Gnulib 'utimens' module on MinGW 2020-03-23 15:26 ` emacs-27 d66331a: Don't build the Gnulib 'utimens' module on MinGW Robert Pluim @ 2020-03-23 15:52 ` Eli Zaretskii 2020-03-24 17:07 ` Robert Pluim 0 siblings, 1 reply; 5+ messages in thread From: Eli Zaretskii @ 2020-03-23 15:52 UTC (permalink / raw) To: Robert Pluim; +Cc: emacs-devel > From: Robert Pluim <rpluim@gmail.com> > Cc: Eli Zaretskii <eliz@gnu.org> > Date: Mon, 23 Mar 2020 16:26:24 +0100 > > Apropos: we explicitly donʼt use the gnulib 'select' module, even > though it looks like on MSWindows it handles both sockets and > pipes. What functionality is it missing? SIGCHLD and C-g interrupts, I guess. Maybe something else as well, I don't remember. ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: emacs-27 d66331a: Don't build the Gnulib 'utimens' module on MinGW 2020-03-23 15:52 ` Eli Zaretskii @ 2020-03-24 17:07 ` Robert Pluim 2020-03-24 18:56 ` Eli Zaretskii 0 siblings, 1 reply; 5+ messages in thread From: Robert Pluim @ 2020-03-24 17:07 UTC (permalink / raw) To: Eli Zaretskii; +Cc: emacs-devel >>>>> On Mon, 23 Mar 2020 17:52:52 +0200, Eli Zaretskii <eliz@gnu.org> said: >> From: Robert Pluim <rpluim@gmail.com> >> Cc: Eli Zaretskii <eliz@gnu.org> >> Date: Mon, 23 Mar 2020 16:26:24 +0100 >> >> Apropos: we explicitly donʼt use the gnulib 'select' module, even >> though it looks like on MSWindows it handles both sockets and >> pipes. What functionality is it missing? Eli> SIGCHLD and C-g interrupts, I guess. Maybe something else as well, I Eli> don't remember. In that case I should go the other direction. How about the following to remove the 1-char readahead for sockets (which then allows us to enable datagram sockets on MSWindows). modified src/w32.c @@ -8798,6 +8798,43 @@ _sys_wait_accept (int fd) return cp->status; } +int +_sys_wait_readable (int fd) +{ + HANDLE hEv; + child_process * cp; + int rc; + + if (fd < 0 || fd >= MAXDESC) + return STATUS_READ_ERROR; + + cp = fd_info[fd].cp; + + if (cp == NULL || cp->fd != fd || cp->status != STATUS_READ_READY) + return STATUS_READ_ERROR; + + cp->status = STATUS_READ_FAILED; + + hEv = pfn_WSACreateEvent (); + rc = pfn_WSAEventSelect (SOCK_HANDLE (fd), hEv, FD_READ); + if (rc != SOCKET_ERROR) + { + do + { + rc = WaitForSingleObject (hEv, 500); + Sleep (5); + } while (rc == WAIT_TIMEOUT + && cp->status != STATUS_READ_ERROR + && cp->char_avail); + pfn_WSAEventSelect (SOCK_HANDLE (fd), NULL, 0); + if (rc == WAIT_OBJECT_0) + cp->status = STATUS_READ_SUCCEEDED; + } + pfn_WSACloseEvent (hEv); + + return cp->status; +} + int _sys_wait_connect (int fd) { @@ -8923,10 +8960,6 @@ sys_read (int fd, char * buffer, unsigned int count) return -1; case STATUS_READ_SUCCEEDED: - /* consume read-ahead char */ - *buffer++ = cp->chr; - count--; - nchars++; cp->status = STATUS_READ_ACKNOWLEDGED; ResetEvent (cp->char_avail); modified src/w32.h @@ -175,6 +175,7 @@ #define FILE_SERIAL 0x0800 extern int _sys_read_ahead (int fd); extern int _sys_wait_accept (int fd); +extern int _sys_wait_readable (int fd); extern int _sys_wait_connect (int fd); extern HMODULE w32_delayed_load (Lisp_Object); modified src/w32proc.c @@ -1225,7 +1225,10 @@ reader_thread (void *arg) else if (cp->fd >= 0 && (fd_info[cp->fd].flags & FILE_LISTEN) != 0) rc = _sys_wait_accept (cp->fd); else - rc = _sys_read_ahead (cp->fd); + if (fd_info[cp->fd].flags & FILE_SOCKET) + rc = _sys_wait_readable (cp->fd); + else + rc = _sys_read_ahead (cp->fd); /* Don't bother waiting for the event if we already have been told to exit by delete_child. */ ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: emacs-27 d66331a: Don't build the Gnulib 'utimens' module on MinGW 2020-03-24 17:07 ` Robert Pluim @ 2020-03-24 18:56 ` Eli Zaretskii 2020-03-24 20:31 ` Robert Pluim 0 siblings, 1 reply; 5+ messages in thread From: Eli Zaretskii @ 2020-03-24 18:56 UTC (permalink / raw) To: Robert Pluim; +Cc: emacs-devel > From: Robert Pluim <rpluim@gmail.com> > Cc: emacs-devel@gnu.org > Date: Tue, 24 Mar 2020 18:07:13 +0100 > > In that case I should go the other direction. How about the following > to remove the 1-char readahead for sockets (which then allows us to > enable datagram sockets on MSWindows). I have no idea whether and how the result will differ from what we do today. The sheer amount of "remarks" in the MSDN documentation scares me. E.g., what happens if the remote end closes the socket, gracefully or otherwise? IOW, I'd love someone who _really_ knows about Windows socket programming to review this and compare with what we do now. I'm not that person, sorry. ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: emacs-27 d66331a: Don't build the Gnulib 'utimens' module on MinGW 2020-03-24 18:56 ` Eli Zaretskii @ 2020-03-24 20:31 ` Robert Pluim 0 siblings, 0 replies; 5+ messages in thread From: Robert Pluim @ 2020-03-24 20:31 UTC (permalink / raw) To: Eli Zaretskii; +Cc: emacs-devel >>>>> On Tue, 24 Mar 2020 20:56:28 +0200, Eli Zaretskii <eliz@gnu.org> said: >> From: Robert Pluim <rpluim@gmail.com> >> Cc: emacs-devel@gnu.org >> Date: Tue, 24 Mar 2020 18:07:13 +0100 >> >> In that case I should go the other direction. How about the following >> to remove the 1-char readahead for sockets (which then allows us to >> enable datagram sockets on MSWindows). Eli> I have no idea whether and how the result will differ from what we do Eli> today. The sheer amount of "remarks" in the MSDN documentation scares Eli> me. E.g., what happens if the remote end closes the socket, Eli> gracefully or otherwise? We still end up calling read on the socket, just later, so those error conditions should still be handled. Iʼll note that the gnulib implementation of select does essentially the same thing (it uses MsgWaitForMultipleObjects rather than WaitForSingleObject, but I assume they do much the same thing under the covers). Eli> IOW, I'd love someone who _really_ knows about Windows socket Eli> programming to review this and compare with what we do now. I'm not Eli> that person, sorry. Nor am I. Iʼd suggest adding it as a disabled option, but then nobody would ever use it.... Robert ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2020-03-24 20:31 UTC | newest] Thread overview: 5+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- [not found] <20200323143828.31224.77075@vcs0.savannah.gnu.org> [not found] ` <20200323143829.ED56720E43@vcs0.savannah.gnu.org> 2020-03-23 15:26 ` emacs-27 d66331a: Don't build the Gnulib 'utimens' module on MinGW Robert Pluim 2020-03-23 15:52 ` Eli Zaretskii 2020-03-24 17:07 ` Robert Pluim 2020-03-24 18:56 ` Eli Zaretskii 2020-03-24 20:31 ` Robert Pluim
Code repositories for project(s) associated with this public inbox https://git.savannah.gnu.org/cgit/emacs.git This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).