Home My Page Projects Code Snippets Project Openings SML/NJ
Summary Activity Forums Tracker Lists Tasks Docs Surveys News SCM Files

SCM Repository

[smlnj] Diff of /sml/branches/dbm-type-blame/runtime/c-libs/win32-io/poll.c
ViewVC logotype

Diff of /sml/branches/dbm-type-blame/runtime/c-libs/win32-io/poll.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 3593, Wed May 11 03:44:12 2011 UTC revision 3594, Thu May 12 16:06:32 2011 UTC
# Line 14  Line 14 
14    
15  #include "win32-fault.h"  #include "win32-fault.h"
16    
17    /* bit masks for polling descriptors (see src/sml-nj/boot/Unix/os-io.sml) */
18    #define RD_BIT          0x1
19    #define WR_BIT          0x2
20    #define ERR_BIT         0x4
21    
22  /* _ml_win32_OS_poll : word32 list * (Int32.int * int) option -> word32 list  /* _ml_win32_OS_poll : (word32 * word) list * (int * word) list * (Int32.int * int) option
23     *   -> (word32 * word) list * (int * word) list
24   */   */
25  ml_val_t _ml_win32_OS_poll (ml_state_t *msp, ml_val_t arg)  ml_val_t _ml_win32_OS_poll (ml_state_t *msp, ml_val_t arg)
26  {  {
27    DWORD dwMilliseconds;    DWORD dwMilliseconds;
28    ml_val_t pollList = REC_SEL(arg,0);    ml_val_t pollList = REC_SEL(arg,0);
29    ml_val_t timeout = REC_SEL (arg,1);    ml_val_t pollSockList = REC_SEL(arg,1);
30      ml_val_t timeout = REC_SEL (arg,2);
31    int sec,usec;    int sec,usec;
32    ml_val_t l,item;    ml_val_t l,item;
33    ml_val_t resList;    ml_val_t hList, sList, resTuple;
34    HANDLE handle,*hArray;    HANDLE handle,*hArray;
35      fd_set read, write, err;
36      int fd, flag;
37      struct timeval  tv, *tvp;
38    int result;    int result;
39    
40    int count,index;    int count,index;
# Line 50  Line 59 
59    /* initialize the array */    /* initialize the array */
60    for (l=pollList,index=0; l!=LIST_nil; l=LIST_tl(l)) {    for (l=pollList,index=0; l!=LIST_nil; l=LIST_tl(l)) {
61      item = LIST_hd (l);      item = LIST_hd (l);
62      handle = (HANDLE) WORD_MLtoC (item);          handle = (HANDLE) REC_SELWORD(item, 0);
63      hArray[index++] = handle;      hArray[index++] = handle;
64    }    }
65    
66    /* generalized poll to see if anything is available */    /* generalized poll to see if anything is available */
67    result = WaitForMultipleObjects (count,hArray,FALSE,dwMilliseconds);    result = WaitForMultipleObjects (count,hArray,FALSE,dwMilliseconds);
68    if (result==WAIT_FAILED) return LIST_nil;    hList = LIST_nil;
69    else if (result==WAIT_TIMEOUT) return LIST_nil;    if (!((result==WAIT_FAILED)||(result==WAIT_TIMEOUT))) {
   
70    /* at least one handle was ready. Find all that are */    /* at least one handle was ready. Find all that are */
71    for (index = count,resList=LIST_nil; index>0; index--) {            for (l=pollList; l!=LIST_nil; l=LIST_tl(l)) {
72      handle = hArray[index-1];                    item = LIST_hd (l);
73                      handle = (HANDLE) REC_SELWORD(item, 0);
74      result = WaitForSingleObject (handle,0);      result = WaitForSingleObject (handle,0);
75      if (result==WAIT_FAILED || result==WAIT_TIMEOUT) continue;      if (result==WAIT_FAILED || result==WAIT_TIMEOUT) continue;
76      WORD_ALLOC(msp,item,(Word_t)handle);                    LIST_cons (msp,hList,item,hList);
77      LIST_cons (msp,resList,item,resList);            }
78    }    }
79    
80    FREE(hArray);    FREE(hArray);
81    return resList;  
82      /* SOCKETS */
83      /* count number of handles and init the fdsets */
84      FD_ZERO(&read);
85      FD_ZERO(&write);
86      FD_ZERO(&err);
87      for (l=pollSockList,count=0; l!=LIST_nil; l=LIST_tl(l)) {
88              count++;
89              item = LIST_hd (l);
90              fd = REC_SELINT(item, 0);
91              flag = REC_SELINT(item, 1);
92              if ((flag & RD_BIT) != 0) {
93                      FD_SET(fd,&read);
94              }
95              if ((flag & WR_BIT) != 0) {
96                      FD_SET(fd,&write);
97  }  }
98              if ((flag & ERR_BIT) != 0) {
99                      FD_SET(fd,&err);
100              }
101      }
102    
103      if (timeout == OPTION_NONE) {
104              tvp = NIL(struct timeval *);
105      } else {
106              tv.tv_sec     = REC_SELINT32(timeout, 0);
107              tv.tv_usec    = REC_SELINT(timeout, 1);
108              tvp = &tv;
109      }
110    
111      sList = LIST_nil;
112    
113      if (count > 0) {
114              result = select (count, &read, &write, &err, tvp);
115              if (result < 0)
116                      return RAISE_SYSERR(msp, sts);
117              else if (result > 0) {
118                      ml_val_t      *resVec = NEW_VEC(ml_val_t, result);
119                      int           i, resFlag;
120    
121                      for (i = 0, l = pollSockList;  l != LIST_nil;  l = LIST_tl(l)) {
122                              item  = LIST_hd(l);
123                              fd    = REC_SELINT(item, 0);
124                              flag  = REC_SELINT(item, 1);
125                              resFlag       = 0;
126                              if (((flag & RD_BIT) != 0) && FD_ISSET(fd, &read))
127                                      resFlag |= RD_BIT;
128                              if (((flag & WR_BIT) != 0) && FD_ISSET(fd, &write))
129                                      resFlag |= WR_BIT;
130                              if (((flag & ERR_BIT) != 0) && FD_ISSET(fd, &err))
131                                      resFlag |= ERR_BIT;
132                              if (resFlag != 0) {
133                                      REC_ALLOC2 (msp, item, INT_CtoML(fd), INT_CtoML(resFlag));
134                                      resVec[i++] = item;
135                              }
136                      }
137    
138                      ASSERT(i == result);
139    
140                      for (i = result-1, sList = LIST_nil;  i >= 0;  i--) {
141                              item = resVec[i];
142                              LIST_cons (msp, sList, item, sList);
143                      }
144    
145                      FREE(resVec);
146              }
147      }
148    
149    
150      REC_ALLOC2(msp, resTuple, hList, sList)
151      return resTuple;
152    }
153    
154    
155  /* end of poll.c */  /* end of poll.c */
156    

Legend:
Removed from v.3593  
changed lines
  Added in v.3594

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0