Mercurial > hg > Members > menikon > CbC_xv6
changeset 153:49d8aba0002a
switch use sys_pipe_read.cbc
author | anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Wed, 18 Dec 2019 15:55:22 +0900 |
parents | d3f97de63622 |
children | 343f8f3c8f18 |
files | src/file_read.cbc src/impl/SysReadImpl.h src/sys_pipe_read.cbc src/sys_read_impl.cbc |
diffstat | 4 files changed, 69 insertions(+), 80 deletions(-) [+] |
line wrap: on
line diff
--- a/src/file_read.cbc Mon Dec 16 21:55:29 2019 +0900 +++ b/src/file_read.cbc Wed Dec 18 15:55:22 2019 +0900 @@ -22,10 +22,10 @@ return NULL; //Error? } -__code selectReadInstance(struct Context cbc_context, struct file* f, __code ret(int i)) { +__code selectReadInstance(struct Context cbc_context, struct file* f, __code next(int i)) { if (f->readable == 0) { i = -1; - goto ret(i); + goto next(i); } SysRead* read = createFileReadInstFromFile(proc->cbc_context, f); goto read->read(f,addr,n);
--- a/src/impl/SysReadImpl.h Mon Dec 16 21:55:29 2019 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,3 +0,0 @@ -typedef struct SysReadImpl <Type, Isa> impl SysRead { - -} SysReadImpl;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/sys_pipe_read.cbc Wed Dec 18 15:55:22 2019 +0900 @@ -0,0 +1,67 @@ +#include "../context.h" +#interface "SysRead.h" + +// ---- +// typedef struct PipeRead<Type, Isa> impl SysRead { +// struct pipe* p; +// int i; +// int n; +// __code cbc_piperead1(Type* sys_read, struct pipe* p, __code next(...)); +// __code cbc_piperead2(Type* sys_read, int i, int n, struct pipe* p, __code next(...)); +// __code cbc_piperead3(Type* sys_read, int i, struct pipe* p, __code next(...)); +// __code next(...); +// } PipeRead; +// ---- + +SysRead* createPipeRead(struct Context* cbc_context) { + struct SysRead* sys_read = new SysRead(); + struct PipeRead* pipe_read = new PipeRead(); + sys_read->sys_read = (union Data*)pipe_read; + pipe_read->p = NULL; + pipe_read->i = 0; + pipe_read->n = 0; + sys_read->impl = NULL; + sys_read->addr = NULL; + sys_read->n = 0; + pipe_read->cbc_piperead1 = C_cbc_piperead1PipeRead; + pipe_read->cbc_piperead2 = C_cbc_piperead2PipeRead; + pipe_read->cbc_piperead3 = C_cbc_piperead3PipeRead; + sys_read->read = C_readPipeRead; + return sys_read; +} +__code cbc_piperead1PipeRead(struct PipeRead* sys_read, struct pipe* p, __code next(...)) { + if (p->nread == p->nwrite && p->writeopen){ + if(proc->killed){ + release(&p->lock); + goto next(); + } + proc->cbc_arg.cbc_console_arg.p = p; + goto cbc_sleep(&p->nread, &p->lock, cbc_piperead1); + } + goto cbc_piperead2SysReadImpl(sys_read,0,sys_read->n,sys_read->p); +} + +__code cbc_piperead2PipeRead(struct PipeRead* sys_read, int i, int n, struct pipe* p, __code next(...)) { + if (i < n && !(p->nread == p->nwrite)) { + addr[i] = p->data[p->nread++ % PIPESIZE]; + i ++; + goto cbc_piperead2(sys_read,i,n,p,addr); + } + goto cbc_wakeup(&p->nwrite, cbc_piperead3); //DOC: piperead-wakeup +} + +__code cbc_piperead3PipeRead(struct PipeRead* sys_read, int i, struct pipe* p, __code next(...)) { + + goto next(...); +} + +__code nextPipeRead(...) { + +} + +__code readPipeRead(struct PipeRead* sys_read, union Data* impl, char* addr, int n, __code next(int ret,...)) { + + goto next(int ret,...); +} + +
--- a/src/sys_read_impl.cbc Mon Dec 16 21:55:29 2019 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,75 +0,0 @@ -#include "../context.h" -#interface "SysRead.h" - -// ---- -// typedef struct SysReadImpl <Type, Isa> impl SysRead { -// -// } SysReadImpl; -// ---- - -SysRead* createSysReadImpl(struct Context* cbc_context) { - struct SysRead* sys_read = new SysRead(); - struct SysReadImpl* sys_read_impl = new SysReadImpl(); - sys_read->sys_read = (union Data*)sys_read_impl; - sys_read->num = 0; - sys_read->addr = NULL; - sys_read->file = NULL; - sys_read->r = 0; - sys_read->pipe = NULL; - sys_read->read = C_readSysReadImpl; - sys_read->next = C_nextSysReadImpl; - sys_read->cbc_fileread1 = C_cbc_fileread1SysReadImpl; - sys_read->cbc_fileread = C_cbc_filereadSysReadImpl; - sys_read->cbc_piperead1 = C_cbc_piperead1SysReadImpl; - sys_read->cbc_piperead2 = C_cbc_piperead2SysReadImpl; - sys_read->cbc_piperead3 = C_cbc_piperead3SysReadImpl; - return sys_read; -} -__code readSysReadImpl(struct SysReadImpl* sys_read, __code next(...)) { - - goto next(...); -} - -__code nextSysReadImpl(...) { - -} - -__code cbc_fileread1SysReadImpl(struct SysReadImpl* sys_read, int r) { - -} - -__code cbc_filereadSysReadImpl(struct SysReadImpl* sys_read, struct file* file, char* addr, int n, __code (*next)(int ret)) { - - goto (*next); -} - -__code cbc_piperead1SysReadImpl(struct SysReadImpl* sys_read, struct pipe* p) { - __code(*next)(int ret) = proc->cbc_arg.cbc_console_arg.next; - if (p->nread == p->nwrite && p->writeopen){ - if(proc->killed){ - release(&p->lock); - goto next(-1); - } - proc->cbc_arg.cbc_console_arg.p = p; - goto cbc_sleep(&p->nread, &p->lock, cbc_piperead1); - } - goto cbc_piperead2SysReadImpl(sys_read,0,sys_read->n,sys_read->p); -} - -__code cbc_piperead2SysReadImpl(struct SysReadImpl* sys_read, int i, int n,struct pipe* p, char* addr) { - if (i < n && !(p->nread == p->nwrite)) { - addr[i] = p->data[p->nread++ % PIPESIZE]; - i ++; - goto cbc_piperead2(sys_read,i,n,p,addr); - } - goto cbc_wakeup(&p->nwrite, cbc_piperead3); //DOC: piperead-wakeup -} - -__code cbc_piperead3SysReadImpl(struct SysReadImpl* sys_read, struct pipe* p, int i) { - -} - -__code cbc_pipereadSysReadImpl(struct SysReadImpl* sys_read, struct pipe* p, char* addr, int n) { - acquire(&p->lock); - goto cbc_piperead1SysReadImpl(sys_read,p); -}