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/SMLNJ/src/runtime/c-libs/posix-os/poll.c
ViewVC logotype

Diff of /sml/branches/SMLNJ/src/runtime/c-libs/posix-os/poll.c

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

revision 7, Sun Jan 18 00:59:30 1998 UTC revision 8, Sun Jan 18 01:01:29 1998 UTC
# Line 1  Line 1 
1  /* poll.c  /* poll.c
2   *   *
3   * COPYRIGHT (c) 1994 by AT&T Bell Laboratories.   * COPYRIGHT (c) 1994 by AT&T Bell Laboratories.
4     *
5     * The run-time code for OS.IO.poll.  Note that this implementation should
6     * satisfy the following two properties:
7     *
8     *   1) the list of return items should be in the same order as the
9     *      corresponding list of arguments.
10     *
11     *   2) return items should contain no more information than was queried for
12     *      (this matters when the same descriptor is covered by multiple items).
13   */   */
14    
15  #include "ml-unixdep.h"  #include "ml-unixdep.h"
# Line 98  Line 107 
107    
108      sts = poll (fds, nfds, tout);      sts = poll (fds, nfds, tout);
109    
110        if (sts < 0) {
111      FREE(fds);      FREE(fds);
   
     if (sts < 0)  
112          return RAISE_SYSERR(msp, sts);          return RAISE_SYSERR(msp, sts);
113        }
114      else {      else {
115          for (i = nfds-1, l = LIST_nil;  i >= 0;  i--) {          for (i = nfds-1, l = LIST_nil;  i >= 0;  i--) {
116              fdp = &(fds[i]);              fdp = &(fds[i]);
# Line 117  Line 126 
126                  LIST_cons(msp, l, item, l);                  LIST_cons(msp, l, item, l);
127              }              }
128          }          }
129            FREE(fds);
130          return l;          return l;
131      }      }
132    
# Line 169  Line 179 
179    
180      if (sts < 0)      if (sts < 0)
181          return RAISE_SYSERR(msp, sts);          return RAISE_SYSERR(msp, sts);
182        else if (sts == 0)
183            return LIST_nil;
184      else {      else {
185          for (fd = maxFD, l = LIST_nil;  sts > 0;  fd--) {          ml_val_t        *resVec = NEW_VEC(ml_val_t, sts);
186              flag = 0;          int             i, resFlag;
187              if ((rfds != NIL(fd_set *)) && FD_ISSET(fd, rfds))  
188                  flag |= RD_BIT;          for (i = 0, l = pollList;  l != LIST_nil;  l = LIST_tl(l)) {
189              if ((wfds != NIL(fd_set *)) && FD_ISSET(fd, wfds))              item        = LIST_hd(l);
190                  flag |= WR_BIT;              fd          = REC_SELINT(item, 0);
191              if ((efds != NIL(fd_set *)) && FD_ISSET(fd, efds))              flag        = REC_SELINT(item, 1);
192                  flag |= ERR_BIT;              resFlag     = 0;
193              if (flag != 0) {              if (((flag & RD_BIT) != 0) && FD_ISSET(fd, rfds))
194                  sts--;                  resFlag |= RD_BIT;
195                  REC_ALLOC2 (msp, item, INT_CtoML(fd), INT_CtoML(flag));              if (((flag & WR_BIT) != 0) && FD_ISSET(fd, wfds))
196                  LIST_cons (msp, l, item, l);                  resFlag |= WR_BIT;
197                if (((flag & ERR_BIT) != 0) && FD_ISSET(fd, efds))
198                    resFlag |= ERR_BIT;
199                if (resFlag != 0) {
200                    REC_ALLOC2 (msp, item, INT_CtoML(fd), INT_CtoML(resFlag));
201                    resVec[i++] = item;
202              }              }
203          }          }
204    
205            ASSERT(i == sts);
206    
207            for (i = sts-1, l = LIST_nil;  i >= 0;  i--) {
208                item = resVec[i];
209                LIST_cons (msp, l, item, l);
210            }
211    
212            FREE(resVec);
213    
214          return l;          return l;
215      }      }
216    

Legend:
Removed from v.7  
changed lines
  Added in v.8

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