diff src/pipe.c @ 35:ad1d3b268e2d

update
author mir3636
date Fri, 22 Feb 2019 16:32:51 +0900
parents 83c23a36980d
children d4e5846ddb48
line wrap: on
line diff
--- a/src/pipe.c	Thu Feb 14 23:33:57 2019 +0900
+++ b/src/pipe.c	Fri Feb 22 16:32:51 2019 +0900
@@ -116,6 +116,34 @@
     return n;
 }
 
+int cbc_piperead(struct pipe *p, char *addr, int n, __code (*next)(int ret))
+{
+    int i;
+
+    acquire(&p->lock);
+
+    while(p->nread == p->nwrite && p->writeopen){  //DOC: pipe-empty
+        if(proc->killed){
+            release(&p->lock);
+            goto next(-1);
+        }
+
+        sleep(&p->nread, &p->lock); //DOC: piperead-sleep*/
+    }
+
+    for(i = 0; i < n; i++){  //DOC: piperead-copy
+        if(p->nread == p->nwrite) {
+            break;
+        }
+
+        addr[i] = p->data[p->nread++ % PIPESIZE];
+    }
+
+    goto cbc_wakeup(&p->nwrite);  //DOC: piperead-wakeup
+    release(&p->lock);
+
+    return i;
+}
 int piperead(struct pipe *p, char *addr, int n)
 {
     int i;