Mercurial > hg > CbC > CbC_xv6
comparison src/impl/file_impl_pipe.cbc @ 187:9d385a07dbfc
aligned API at pipe close...
author | anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 21 Jan 2020 15:30:43 +0900 |
parents | 312f86884606 |
children | 64a1b9b8f08e |
comparison
equal
deleted
inserted
replaced
186:312f86884606 | 187:9d385a07dbfc |
---|---|
2 #interface "file.h" | 2 #interface "file.h" |
3 | 3 |
4 // ---- | 4 // ---- |
5 // typedef struct pipe<Impl, Isa> impl file { | 5 // typedef struct pipe<Impl, Isa> impl file { |
6 // #define PIPESIZE 512 | 6 // #define PIPESIZE 512 |
7 // union Data* file; | |
7 // struct spinlock lock; | 8 // struct spinlock lock; |
8 // char data[PIPESIZE]; | 9 // char data[PIPESIZE]; |
9 // uint nread; // number of bytes read | 10 // uint nread; // number of bytes read |
10 // uint nwrite; // number of bytes written | 11 // uint nwrite; // number of bytes written |
11 // int readopen; // read fd is still open | 12 // int readopen; // read fd is still open |
12 // int writeopen; // write fd is still open | 13 // int writeopen; // write fd is still open |
14 // | |
15 // // interface field | |
16 // int n; | |
17 // char* addr; | |
18 // | |
19 // // private code gear | |
20 // __code piperead1(Impl* pipe, char* addr, int n, __code next(...)); | |
21 // __code piperead2(Impl* pipe, char* addr, int n, __code next(...)); | |
22 // __code cbc_pipeclose(Impl* pipe, Isa* file, __code next(...)); | |
23 // __code cbc_pipeclose2(Impl* pipe, Isa* file, Isa* ff, __code next(...)); | |
24 // __code cbc_pipeclose3(Impl* pipe, Isa* file, Isa* ff, __code next(...)); | |
25 // __code cbc_pipeclose4(Impl* pipe, int writable, __code next(...)); | |
26 // __code cbc_pipe_close_writeopen(Impl* pipe, __code next(...)); | |
27 // __code cbc_pipe_close_readopen(Impl* pipe, __code next(...)); | |
13 // } pipe; | 28 // } pipe; |
14 // ---- | 29 // ---- |
15 | 30 |
16 file* createpipe(struct Context* cbc_context) { | 31 file* createpipe(struct Context* cbc_context) { |
17 struct file* file = new file(); | 32 struct file* file = new file(); |
18 struct pipe* pipe = new pipe(); | 33 struct pipe* pipe = new pipe(); |
19 file->file = (union Data*)pipe; | 34 file->file = (union Data*)pipe; |
20 pipe->file = (union Data*)file; //pipe -> file | 35 pipe->file = NULL; |
21 pipe->lock = 0; | 36 pipe->lock = 0; |
22 pipe->spinlock = 0; | 37 pipe->spinlock = 0; |
23 pipe->data = 0; | 38 pipe->data = 0; |
24 pipe->nread = 0; | 39 pipe->nread = 0; |
25 pipe->nwrite = 0; | 40 pipe->nwrite = 0; |
35 file->inode = 0; | 50 file->inode = 0; |
36 file->n = 0; | 51 file->n = 0; |
37 file->fd = 0; | 52 file->fd = 0; |
38 pipe->piperead1 = C_piperead1pipe; | 53 pipe->piperead1 = C_piperead1pipe; |
39 pipe->piperead2 = C_piperead2pipe; | 54 pipe->piperead2 = C_piperead2pipe; |
40 pipe->cbc_fileclose = C_cbc_fileclosepipe; | 55 pipe->cbc_pipeclose = C_cbc_pipeclosepipe; |
41 pipe->cbc_fileclose2 = C_cbc_fileclose2pipe; | 56 pipe->cbc_pipeclose2 = C_cbc_pipeclose2pipe; |
42 pipe->cbc_fileclose3 = C_cbc_fileclose3pipe; | 57 pipe->cbc_pipeclose3 = C_cbc_pipeclose3pipe; |
43 pipe->cbc_pipe_close = C_cbc_pipe_closepipe; | 58 pipe->cbc_pipeclose4 = C_cbc_pipeclose4pipe; |
44 pipe->cbc_pipe_close_writeopen = C_cbc_pipe_close_writeopenpipe; | 59 pipe->cbc_pipe_close_writeopen = C_cbc_pipe_close_writeopenpipe; |
45 pipe->cbc_pipe_close_readopen = C_cbc_pipe_close_readopenpipe; | 60 pipe->cbc_pipe_close_readopen = C_cbc_pipe_close_readopenpipe; |
46 file->stat = C_statpipe; | 61 file->stat = C_statpipe; |
47 file->read = C_readpipe; | 62 file->read = C_readpipe; |
48 file->write = C_writepipe; | 63 file->write = C_writepipe; |
132 __code cbc_pipeclose3(struct pipe* pipe,struct file* file, struct file* ff,__code next(...)) { | 147 __code cbc_pipeclose3(struct pipe* pipe,struct file* file, struct file* ff,__code next(...)) { |
133 *ff = *f; | 148 *ff = *f; |
134 f->ref = 0; | 149 f->ref = 0; |
135 f->type = FD_NONE; | 150 f->type = FD_NONE; |
136 relsease(&ftable.lock); | 151 relsease(&ftable.lock); |
152 struct pipe* p = ff.pipe; | |
153 int writable = ff.writable; | |
137 | 154 |
138 goto pipe->cbc_pipeclose4(ff.pipe,ff.writable,next); | 155 goto pipe->cbc_pipeclose4(p,writable,next); |
139 } | 156 } |
140 | 157 |
141 __code cbc_pipeclose4(struct pipe* p, int writable, __code next(...)) { | 158 __code cbc_pipeclose4(struct pipe* pipe, int writable, __code next(...)) { |
142 acquire(&p->lock); | 159 acquire(&pipe->lock); |
143 if (writable) { | 160 if (writable) { |
144 goto p->cbc_pipe_close_writeopen(next); | 161 goto pipe->cbc_pipe_close_writeopen(next); |
145 } | 162 } |
146 goto p->cbc_pipe_close_readopen(next); | 163 goto pipe->cbc_pipe_close_readopen(next); |
147 } | 164 } |
148 | 165 |
149 | 166 |
150 __code cbc_pipe_close_writeopen(struct pipe* p, __code next(...)) { | 167 __code cbc_pipe_close_writeopen(struct pipe* pipe, __code next(...)) { |
151 p->writeopen = 0; | 168 pipe->writeopen = 0; |
152 goto cbc_wakeup(&p->nread,p,cbc_pipe_release,next); | 169 goto cbc_wakeup(&pipe->nread,pipe,cbc_pipe_release,next); |
153 } | 170 } |
154 | 171 |
155 __code cbc_pipe_close_readopen(struct pipe* p, __code next(...)) { | 172 __code cbc_pipe_close_readopen(struct pipe* pipe, __code next(...)) { |
156 p->readopen = 0; | 173 pipe->readopen = 0; |
157 goto cbc_context->wakeup(&p->nwrite,p,cbc_pipe_release,next); | 174 goto cbc_context->wakeup(&pipe->nwrite,pipe,cbc_pipe_release,next); |
158 } | 175 } |
159 | 176 |