-void Serializer::mywrite(const void *__buf, size_t __n){
- write (filedesc, __buf, __n);
+void Serializer::mywrite(const void *__buf, size_t __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);
+ }