diff Paper/codes/wc/UnixChrisFileImpl.cpp @ 19:2d91b4d2569c

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Wed, 05 May 2021 18:43:47 +0900
parents
children 218abc95edeb
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Paper/codes/wc/UnixChrisFileImpl.cpp	Wed May 05 18:43:47 2021 +0900
@@ -0,0 +1,56 @@
+#include <stdio.h>
+#impl "Wc.h" as "WcChrsImpl.h"
+
+typedef struct UnixFileImpl <> ipml File {
+  int fd;    // unix file descriptor
+  int mode; 
+  Data *fileImpl ;
+  __code setOutput(UnixFileImpl* file, Output *output,__code next(...)) ;
+  __code unixOpen(UnixFileImpl* file,Key *key, Output reader, __code next(...)) ;
+  __code uniAck(UnixFileImpl* file,Ack *ack, Output reader, __code next(...)) ;
+} File;
+
+File* createUnixChrisFileImpl(struct Context* context) {
+    File *file = new File();
+    file->ChrisFileImpl = (union Data*)new ChrisFileImpl();
+    return file;
+}
+
+// Topology manageres determins input / output connection
+// 
+__code setOutput(Wc* wc, Output *output,__code next(...)) {
+   file->reader = output ;
+   goto next(...);
+}
+
+int
+putBlock(UnixFileImpl* file, Output *reader) {
+   Block *block = new Block();
+   int len = read(fd, BUFSIZE, block->data);
+   if (len <=0 ) {
+       block->eof |= BLOCK_FLAG_EOF;
+       return 0;
+   }
+   reader->put(block);
+   return 1 ;
+}
+
+__code unixOpen(UnixFileImpl* file,Key *key, Output reader, __code next(...)) {
+   file->fd = open(key->path,unix_mode(key->modde));
+   if (fd < 0) {
+       goto error("can't open");
+   }
+   if (putBlock(file,reader)) {
+      putBlock(file,reader);
+   }
+   goto next(file,...);
+}
+
+__code uniAck(UnixFileImpl* file,Ack *ack, Output reader, __code next(...)) {
+   if (!ack->isOk) {
+      close(fd);
+      goto next(...);
+   }
+   putBlock(file,reader);
+   goto next(...);   // file is automaticaly put into local dataGearManger/input
+}