X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=src%2FSerialize%2Fserializer.cc;h=35bae4c5559c2c48069b750d81580f7a76d6e377;hb=c8fa49521562e3053876a003ebf3780f260d3dbf;hp=810ece81237929aed77dba5d43c2764d42f7f8c8;hpb=cfbb106cf7c1281029b012c47580c9f14df1014b;p=satune.git diff --git a/src/Serialize/serializer.cc b/src/Serialize/serializer.cc index 810ece8..35bae4c 100644 --- a/src/Serialize/serializer.cc +++ b/src/Serialize/serializer.cc @@ -11,31 +11,81 @@ #include "fcntl.h" #include "boolean.h" -Serializer::Serializer(const char *file) { - filedesc = open(file, O_WRONLY | O_CREAT | O_TRUNC, 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() { + flushBuffer(); if (-1 == close(filedesc)) { exit(-1); } + ourfree(buffer); } void Serializer::mywrite(const void *__buf, size_t __n) { - write (filedesc, __buf, __n); + char *towrite = (char *) __buf; + if (__n > SERIALBUFFERLENGTH * 2) { + if (bufferoffset != 0) + flushBuffer(); + while (__n > 0) { + ssize_t result = write(filedesc, &towrite, __n); + if (result != (ssize_t) __n) + exit(-1); + towrite += result; + __n -= result; + } + } else { + do { + uint spacefree = bufferlength - bufferoffset; + uint datatowrite = spacefree > __n ? __n : spacefree; + memcpy(&buffer[bufferoffset], towrite, datatowrite); + bufferoffset += datatowrite; + + if (spacefree < __n) { + flushBuffer(); + __n -= datatowrite; + towrite += datatowrite; + } else if (spacefree == __n) { + flushBuffer(); + return; + } else { + return; + } + } while (true); + } } -void serializeBooleanEdge(Serializer *serializer, BooleanEdge be) { - if (be == BooleanEdge(NULL)) +void serializeBooleanEdge(Serializer *serializer, BooleanEdge be, bool isTopLevel) { + if (be == BooleanEdge(NULL)) { return; + } be.getBoolean()->serialize(serializer); ASTNodeType type = BOOLEANEDGE; serializer->mywrite(&type, sizeof(ASTNodeType)); Boolean *boolean = be.getRaw(); serializer->mywrite(&boolean, sizeof(Boolean *)); -} \ No newline at end of file + serializer->mywrite(&isTopLevel, sizeof(bool)); +}