X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=src%2FSerialize%2Fserializer.cc;h=fe41a39fae91964300180684b02b20e9029e521f;hb=da1157817f232a4c2b6b6e7947ef169e119c91e7;hp=bf894563cdb749ef3bb7108a74107a56d44acd3e;hpb=1615693b51360f548146ef90fd603ca6d1f08ee4;p=satune.git diff --git a/src/Serialize/serializer.cc b/src/Serialize/serializer.cc index bf89456..fe41a39 100644 --- a/src/Serialize/serializer.cc +++ b/src/Serialize/serializer.cc @@ -1,8 +1,8 @@ -/* +/* * File: serializer.cc * Author: hamed - * + * * Created on September 7, 2017, 3:38 PM */ @@ -11,33 +11,74 @@ #include "fcntl.h" #include "boolean.h" -Serializer::Serializer(const char *file) { - filedesc = open(file, O_WRONLY | O_CREAT, 0666); - +#define SERIALBUFFERLENGTH 4096 + +Serializer::Serializer(const char *file) : + buffer((char *) ourmalloc(SERIALBUFFERLENGTH)), + bufferoffset(0), + bufferlength(SERIALBUFFERLENGTH) { + filedesc = open(file, O_WRONLY | O_CREAT | O_TRUNC, 0666); if (filedesc < 0) { exit(-1); } } +void Serializer::flushBuffer() { + ssize_t datatowrite = bufferoffset; + ssize_t index = 0; + while(datatowrite) { + ssize_t byteswritten = write(filedesc, &buffer[index], datatowrite); + if (byteswritten == -1) + exit(-1); + datatowrite -= byteswritten; + index += byteswritten; + } + bufferoffset=0; +} + Serializer::~Serializer() { - if (-1 == close(filedesc)){ + flushBuffer(); + if (-1 == close(filedesc)) { exit(-1); } + ourfree(buffer); } -void Serializer::mywrite(const void *__buf, size_t __n){ - write (1, __buf, __n); - model_print("\n"); - write (filedesc, __buf, __n); +void Serializer::mywrite(const void *__buf, size_t __n) { + if (__n > SERIALBUFFERLENGTH *2) { + if (bufferoffset != 0) + flushBuffer(); + write(filedesc, __buf, __n); + } else { + char *towrite=(char *) __buf; + do { + uint spacefree = bufferlength-bufferoffset; + uint datatowrite = spacefree > __n ? __n : spacefree; + memcpy(&buffer[bufferoffset], towrite, datatowrite); + bufferoffset += datatowrite; + + if (spacefree < __n) { + flushBuffer(); + towrite += datatowrite; + } else if (spacefree == __n) { + flushBuffer(); + return; + } else { + return; + } + } while(true); + } } -void serializeBooleanEdge(Serializer* serializer, BooleanEdge& be){ - if(serializer->isSerialized(be.getRaw())) +void serializeBooleanEdge(Serializer *serializer, BooleanEdge be, bool isTopLevel) { + if (be == BooleanEdge(NULL)) { return; - serializer->addObject(be.getRaw()); + } be.getBoolean()->serialize(serializer); ASTNodeType type = BOOLEANEDGE; serializer->mywrite(&type, sizeof(ASTNodeType)); - serializer->mywrite(be.getRaw(), sizeof(Boolean*)); -} \ No newline at end of file + Boolean *boolean = be.getRaw(); + serializer->mywrite(&boolean, sizeof(Boolean *)); + serializer->mywrite(&isTopLevel, sizeof(bool)); +}