stream: New function pstream_accept_block().
authorBen Pfaff <blp@nicira.com>
Thu, 12 Nov 2009 20:52:12 +0000 (12:52 -0800)
committerBen Pfaff <blp@nicira.com>
Thu, 12 Nov 2009 20:57:26 +0000 (12:57 -0800)
lib/stream.c
lib/stream.h

index 1a0ea7ba7466699ca80f1318e16a963e8ad1277c..23b25f22173b4ee4e5f41ce4fa71fb21a67fc39a 100644 (file)
@@ -422,6 +422,27 @@ pstream_accept(struct pstream *pstream, struct stream **new_stream)
     return retval;
 }
 
+/* Tries to accept a new connection on 'pstream'.  If successful, stores the
+ * new connection in '*new_stream' and returns 0.  Otherwise, returns a
+ * positive errno value.
+ *
+ * pstream_accept_block() blocks until a connection is ready or until an error
+ * occurs.  It will not return EAGAIN. */
+int
+pstream_accept_block(struct pstream *pstream, struct stream **new_stream)
+{
+    int error;
+
+    while ((error = pstream_accept(pstream, new_stream)) == EAGAIN) {
+        pstream_wait(pstream);
+        poll_block();
+    }
+    if (error) {
+        *new_stream = NULL;
+    }
+    return error;
+}
+
 void
 pstream_wait(struct pstream *pstream)
 {
index 76c9e6c67238ec46920f1b2ec54142ee2fdf4014..7a62a5a374d0284ac0142832b35941e160c92353 100644 (file)
@@ -57,6 +57,7 @@ int pstream_open(const char *name, struct pstream **);
 const char *pstream_get_name(const struct pstream *);
 void pstream_close(struct pstream *);
 int pstream_accept(struct pstream *, struct stream **);
+int pstream_accept_block(struct pstream *, struct stream **);
 void pstream_wait(struct pstream *);
 
 #endif /* stream.h */