New macro STD_FD_VOID_SYSTEM_CALL to be used after system calls that
authorTaylor R. Campbell <net/mumble/campbell>
Wed, 15 Apr 2009 13:33:41 +0000 (13:33 +0000)
committerTaylor R. Campbell <net/mumble/campbell>
Wed, 15 Apr 2009 13:33:41 +0000 (13:33 +0000)
create file descriptors but yield them in some way other than as
their return values, such as pipe(2).  Use this in OS_make_pipe so
that the file exhaustion state is maintained correctly.

v7/src/microcode/ux.h
v7/src/microcode/uxio.c

index 62d3e20642565c04b04938f480041a6f5999d3d1..3673b02d7017bee62f7c7d3842f29173d53e36a4 100644 (file)
@@ -1,6 +1,6 @@
 /* -*-C-*-
 
-$Id: ux.h,v 1.92 2009/04/15 13:09:20 riastradh Exp $
+$Id: ux.h,v 1.93 2009/04/15 13:33:40 riastradh Exp $
 
 Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994,
     1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
@@ -880,4 +880,11 @@ extern bool UX_out_of_files_p;
     UX_out_of_files_p = false;                          \
   } while (0)
 
+#define STD_FD_VOID_SYSTEM_CALL(name, expression)       \
+  do {                                                  \
+    while ((expression) < 0)                            \
+      UX_prim_check_fd_errno (name);                    \
+    UX_out_of_files_p = false;                          \
+  } while (0)
+
 #endif /* SCM_UX_H */
index 61de04d21b08261d7b8ada0b09e2551c6cc7d9f1..9d6739dbdf4a713b127e00c0441eeb700c4afeea 100644 (file)
@@ -1,6 +1,6 @@
 /* -*-C-*-
 
-$Id: uxio.c,v 1.64 2009/04/15 13:00:32 riastradh Exp $
+$Id: uxio.c,v 1.65 2009/04/15 13:33:41 riastradh Exp $
 
 Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994,
     1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
@@ -333,8 +333,7 @@ OS_make_pipe (Tchannel * readerp, Tchannel * writerp)
 {
   int pv [2];
   transaction_begin ();
-  while ((UX_pipe (pv)) < 0)
-    UX_prim_check_fd_errno (syscall_pipe);
+  STD_FD_VOID_SYSTEM_CALL (syscall_pipe, (UX_pipe (pv)));
   MAKE_CHANNEL ((pv[0]), channel_type_unix_pipe, (*readerp) =);
   OS_channel_close_on_abort (*readerp);
   MAKE_CHANNEL ((pv[1]), channel_type_unix_pipe, (*writerp) =);