On Mon, Mar 22, 2010 at 11:12 PM, Elliott Slaughter <span dir="ltr"><<a href="mailto:elliottslaughter@gmail.com">elliottslaughter@gmail.com</a>></span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div class="im">On Mon, Mar 22, 2010 at 5:18 PM, Elliott Slaughter <span dir="ltr"><<a href="mailto:elliottslaughter@gmail.com" target="_blank">elliottslaughter@gmail.com</a>></span> wrote:<div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<div class="gmail_quote">2010/3/22 Chun Tian (binghe) <span dir="ltr"><<a href="mailto:binghe.lisp@gmail.com" target="_blank">binghe.lisp@gmail.com</a>></span><div><div>
<br><div class="gmail_quote">
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Strange ... for long time I thought there's no "select()" on win32, and I do see Erik (USOCKET author) use "WSAEventSelect" to implement the LispWorks version of WAIT-FOR-INTPUT-INTERNAL on win32. Now it seems that I was confused by another the speciality of "select()" function on win32:<br>




<br>
* On UNIX, select() can be used to wait for both networking sockets and disk file handlers,<br>
* On Windows, select() can only be used on networking sockets, so it's implemented by winsock library.<br>
<br>
What you found, seems show me a very direct way to have all you want done immediately: just use SB-ALIEN to export the "select()" for win32, and remove the reader macro around exist Unix version of WAIT-FOR-INPUT-INTERNAL for SBCL.<br>




<br>
Would you like a try on this approach?<br></blockquote></div><div><br></div></div></div><div>I'll give it a shot.</div></div></blockquote></div><div><br></div></div><div>I've got a couple of updates:</div><div><br>
</div>
<div>First, sbcl/win32 apparently includes sb-unix, which means that the existing implementation of wait-for-input-internal which calls sb-unix:unix-fast-select works without modification on sbcl/win32.</div><div><br></div>

<div>That said, it doesn't seem to work correctly: in my tests, wait-for-input returns immediately even when no input is available, causing my call to socket-receive to block. This happens for any value of timeout, including nil, 0, and non-zero values.</div>

<div><br></div><div>I even replaced the call to sb-unix:unix-fast-select to a hand-coded call to winsock's select via sb-alien, and got exactly the same result. No errors are produced, select just returns that the socket is ready when it is not actually ready.</div>

<div><br></div><div>I'm not sure what could be causing this to happen, and I don't see anything in the documentation indicating that select would return a socket which would block on a call to recvfrom (which is what sb-bsd-sockets seems to be calling internally). Google has not provided any helpful answers.</div>
</blockquote></div><div><br></div><div>I started porting the version of wait-for-input-internal from LispWorks, since I don't know what's going wrong with any of the above. It was going fine, until I hit a call to system:wait-for-single-object, which I'm not sure how to emulate in SBCL. Presumably I'll need to manually call the winsock api to do it, but I'm not sure what calls to make.</div>
<div><br></div><div>Suggestions? Thanks in advance.</div><br>-- <br>Elliott Slaughter<br><br>"Don't worry about what anybody else is going to do. The best way to predict the future is to invent it." - Alan Kay<br>