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