--- /mio_wsasync.h	Thu Jan 24 14:12:11 2008
+++ mio_wsasync.h	Thu Jan 24 14:13:07 2008
@@ -28,12 +28,20 @@
 #define MIO_FUNCS \
     static ATOM mio_class = NULL;                                       \
                                                                         \
+    static void _mio_free_fd_real(mio_t m, mio_priv_fd_t priv_fd)       \
+    {                                                                   \
+        priv_fd->next_free = MIO(m)->next_free;                         \
+        priv_fd->mio_fd.fd = 0;                                         \
+        MIO(m)->next_free = priv_fd;                                    \
+    }                                                                   \
+																		\
     LONG CALLBACK _mio_wnd_proc(HWND hwnd, UINT msg, WPARAM wParam, LONG lParam) \
     {                                                                   \
         if(msg == WM_TIMER) {                                           \
             return 1;                                                   \
         } else if(msg >= WM_MIO_EVENT) {                                \
             mio_priv_t m = (mio_priv_t)(GetWindowLongPtr(hwnd, GWLP_USERDATA)); \
+			if (WSAGETSELECTEVENT(lParam) & FD_CLOSE) _mio_free_fd_real(m, &(m->fds[msg - WM_MIO_EVENT])); \
             if(!m->fds[msg - WM_MIO_EVENT].event & WSAGETSELECTEVENT(lParam)) { \
                 mio_debug(ZONE, "unmatched mio event %d on socket #%d", WSAGETSELECTEVENT(lParam), m->fds[msg - WM_MIO_EVENT].mio_fd.fd); \
                 return 0;                                               \
@@ -65,11 +73,8 @@
         return (mio_fd_t)priv_fd;                                       \
     }                                                                   \
                                                                         \
-    static void _mio_free_fd(mio_t m, mio_priv_fd_t priv_fd)            \
+	static void _mio_free_fd(mio_t m, mio_priv_fd_t priv_fd)            \
     {                                                                   \
-        priv_fd->next_free = MIO(m)->next_free;                         \
-        priv_fd->mio_fd.fd = 0;                                         \
-        MIO(m)->next_free = priv_fd;                                    \
     }                                                                   \
                                                                         \
     static int _mio_select(mio_priv_t m, int t)                         \
