Esempio n. 1
0
void
BinaryOutputStream::writeUInt64(uint64 u)
{
  reserveBytes(8);
  uint8 * convert = (uint8 *)&u;

  if (m_swapBytes)
  {
    m_buffer[m_pos + 0] = convert[7];
    m_buffer[m_pos + 1] = convert[6];
    m_buffer[m_pos + 2] = convert[5];
    m_buffer[m_pos + 3] = convert[4];
    m_buffer[m_pos + 4] = convert[3];
    m_buffer[m_pos + 5] = convert[2];
    m_buffer[m_pos + 6] = convert[1];
    m_buffer[m_pos + 7] = convert[0];
  }
  else
  {
#ifdef DGP_ALLOW_UNALIGNED_WRITES
    *(uint64 *)(m_buffer + m_pos) = u;
#else
    m_buffer[m_pos + 0] = convert[0];
    m_buffer[m_pos + 1] = convert[1];
    m_buffer[m_pos + 2] = convert[2];
    m_buffer[m_pos + 3] = convert[3];
    m_buffer[m_pos + 4] = convert[4];
    m_buffer[m_pos + 5] = convert[5];
    m_buffer[m_pos + 6] = convert[6];
    m_buffer[m_pos + 7] = convert[7];
#endif
  }

  m_pos += 8;
}
Esempio n. 2
0
void
BinaryOutputStream::writeUInt32(uint32 u)
{
  reserveBytes(4);
  uint8 * convert = (uint8 *)&u;
  debugAssertM(m_beginEndBits == 0, getNameStr() + ": Can't write non-bit data within beginBits/endBits block");

  if (m_swapBytes)
  {
    m_buffer[m_pos + 0] = convert[3];
    m_buffer[m_pos + 1] = convert[2];
    m_buffer[m_pos + 2] = convert[1];
    m_buffer[m_pos + 3] = convert[0];
  }
  else
  {
#ifdef DGP_ALLOW_UNALIGNED_WRITES
    *(uint32 *)(m_buffer + m_pos) = u;
#else
    m_buffer[m_pos + 0] = convert[0];
    m_buffer[m_pos + 1] = convert[1];
    m_buffer[m_pos + 2] = convert[2];
    m_buffer[m_pos + 3] = convert[3];
#endif
  }

  m_pos += 4;
}
Esempio n. 3
0
std::size_t TupleOutputStream::startRows(int32_t partitionId)
{
    writeInt(partitionId);
    m_rowCount = 0;
    m_rowCountPosition = reserveBytes(4);
    m_totalBytesSerialized = 0;
    return m_rowCountPosition;
}
Esempio n. 4
0
void BinaryOutput::writeString(const char* s) {
    // +1 is because strlen doesn't count the null
    int len = strlen(s) + 1;

    debugAssert(m_beginEndBits == 0);
    reserveBytes(len);
    System::memcpy(m_buffer + m_pos, s, len);
    m_pos += len;
}
Esempio n. 5
0
void BinaryOutput::writeString32(const char* s) {
    // Write the NULL and count it
    size_t len = strlen(s) + 1;
    writeUInt32((uint32)len);

    debugAssert(m_beginEndBits == 0);
    reserveBytes(len);
    System::memcpy(m_buffer + m_pos, s, len);
    m_pos += len;
}
Esempio n. 6
0
void
BinaryOutputStream::reserveBytesWhenOutOfMemory(size_t bytes)
{
  if (m_path == "<memory>")
  {
    throw Error(getNameStr() + ": Out of memory while writing to memory (no RAM left)");
  }
  else if ((int64)bytes > m_bufferCapacity)
  {
    throw Error("Out of memory while writing to disk (could not create a large enough buffer)");
  }
  else
  {
    // Dump the contents to disk. In order to enable seeking backwards, we keep the last 10 MB in memory.
    int64 bytesToWrite = m_bufferLen - 10 * 1024 * 1024;

    if (bytesToWrite < m_bufferLen / 3)
    {
      // We're going to write less than 1/3 of the file; give up and just write the whole thing.
      bytesToWrite = m_bufferLen;
    }

    debugAssertM(bytesToWrite > 0, getNameStr() + ": No bytes to write");

    // Write to the file
    char const * mode = (m_alreadyWritten > 0) ? "ab" : "wb";
    FILE * file = fopen(m_path.c_str(), mode);
    debugAssertM(file, getNameStr() + ": Could not open file for writing");

    size_t count = fwrite(m_buffer, 1, (size_t)bytesToWrite, file);
    debugAssertM((int64)count == bytesToWrite, getNameStr() + ": All bytes were not written");
    (void)count;  // avoid unused variable warning

    fclose(file);
    file = NULL;

    // Record that we saved this data.
    m_alreadyWritten += bytesToWrite;
    m_bufferLen -= bytesToWrite;
    m_pos -= bytesToWrite;

    debugAssertM(m_bufferLen < m_bufferCapacity, getNameStr() + ": Buffer exceeds maximum size");
    debugAssertM(m_bufferLen >= 0, getNameStr() + ": Buffer has negative size");
    debugAssertM(m_pos >= 0, getNameStr() + ": Write position is negative");
    debugAssertM(m_pos <= m_bufferLen, getNameStr() + ": Write position is beyond end of buffer");

    // Shift the unwritten data back appropriately in the buffer.
    std::memmove(m_buffer, m_buffer + bytesToWrite, (size_t)m_bufferLen);

    // *Now* we allocate bytes (there should presumably be enough space in the buffer; if not, we'll come back through this code
    // and dump the last 10MB to disk as well.  Note that the bytes > maxBufferLen case above would already have triggered if
    // this call couldn't succeed.
    reserveBytes(bytes);
  }
}
Esempio n. 7
0
void BinaryOutput::reserveBytesWhenOutOfMemory(size_t bytes) {
    if (m_filename == "<memory>") {
        throw "Out of memory while writing to memory in BinaryOutput (no RAM left).";
    } else if ((int)bytes > (int)m_maxBufferLen) {
        throw "Out of memory while writing to disk in BinaryOutput (could not create a large enough buffer).";
    } else {

        // Dump the contents to disk.  In order to enable seeking backwards, 
        // we keep the last 10 MB in memory.
        size_t writeBytes = m_bufferLen - 10 * 1024 * 1024;

        if (writeBytes < m_bufferLen / 3) {
            // We're going to write less than 1/3 of the file;
            // give up and just write the whole thing.
            writeBytes = m_bufferLen;
        }
        debugAssert(writeBytes > 0);

        //debugPrintf("Writing %d bytes to disk\n", writeBytes);

        const char* mode = (m_alreadyWritten > 0) ? "ab" : "wb";
        alwaysAssertM(m_filename != "<memory>", "Writing memory file");
        FILE* file = FileSystem::fopen(m_filename.c_str(), mode);
        debugAssert(file);

        size_t count = fwrite(m_buffer, 1, writeBytes, file);
        debugAssert(count == writeBytes); (void)count;

        fclose(file);
        file = NULL;

        // Record that we saved this data.
        m_alreadyWritten += writeBytes;
        m_bufferLen -= writeBytes;
        m_pos -= writeBytes;

        debugAssert(m_bufferLen < m_maxBufferLen);
        debugAssert(m_bufferLen >= 0);
        debugAssert(m_pos >= 0);
        debugAssert(m_pos <= (int64)m_bufferLen);

        // Shift the unwritten data back appropriately in the buffer.
        debugAssert(isValidHeapPointer(m_buffer));
        System::memcpy(m_buffer, m_buffer + writeBytes, m_bufferLen);
        debugAssert(isValidHeapPointer(m_buffer));

        // *now* we allocate bytes (there should presumably be enough 
        // space in the buffer; if not, we'll come back through this 
        // code and dump the last 10MB to disk as well.  Note that the 
        // bytes > maxBufferLen case above would already have triggered
        // if this call couldn't succeed. 
        reserveBytes(bytes);
    }
}
Esempio n. 8
0
void BinaryOutput::writeStringEven(const char* s) {
    // +1 is because strlen doesn't count the null
    int len = strlen(s) + 1;

    reserveBytes(len);
    System::memcpy(m_buffer + m_pos, s, len);
    m_pos += len;

    // Pad with another NULL
    if ((len % 2) == 1) {
        writeUInt8(0);
    }
}
Esempio n. 9
0
void BinaryOutput::writeUInt16(uint16 u) {
    reserveBytes(2);

    uint8* convert = (uint8*)&u;

    if (m_swapBytes) {
        m_buffer[m_pos]     = convert[1];
        m_buffer[m_pos + 1] = convert[0];
    } else {
        *(uint16*)(m_buffer + m_pos) = u;
    }

    m_pos += 2;
}
Esempio n. 10
0
void BinaryOutput::writeUInt32(uint32 u) {
    reserveBytes(4);

    uint8* convert = (uint8*)&u;

    debugAssert(m_beginEndBits == 0);

    if (m_swapBytes) {
        m_buffer[m_pos]     = convert[3];
        m_buffer[m_pos + 1] = convert[2];
        m_buffer[m_pos + 2] = convert[1];
        m_buffer[m_pos + 3] = convert[0];
    } else {
        *(uint32*)(m_buffer + m_pos) = u;
    }

    m_pos += 4;
}
Esempio n. 11
0
void BinaryOutput::writeUInt64(uint64 u) {
    reserveBytes(8);

    uint8* convert = (uint8*)&u;

    if (m_swapBytes) {
        m_buffer[m_pos]     = convert[7];
        m_buffer[m_pos + 1] = convert[6];
        m_buffer[m_pos + 2] = convert[5];
        m_buffer[m_pos + 3] = convert[4];
        m_buffer[m_pos + 4] = convert[3];
        m_buffer[m_pos + 5] = convert[2];
        m_buffer[m_pos + 6] = convert[1];
        m_buffer[m_pos + 7] = convert[0];
    } else {
        *(uint64*)(m_buffer + m_pos) = u;
    }

    m_pos += 8;
}
Esempio n. 12
0
void
BinaryOutputStream::writeUInt16(uint16 u)
{
  reserveBytes(2);
  uint8 * convert = (uint8 *)&u;

  if (m_swapBytes)
  {
    m_buffer[m_pos + 0] = convert[1];
    m_buffer[m_pos + 1] = convert[0];
  }
  else
  {
#ifdef DGP_ALLOW_UNALIGNED_WRITES
    *(uint16 *)(m_buffer + m_pos) = u;
#else
    m_buffer[m_pos + 0] = convert[0];
    m_buffer[m_pos + 1] = convert[1];
#endif
  }

  m_pos += 2;
}
Esempio n. 13
0
bool OctreePacketData::reserveBitMask() {
    return reserveBytes(sizeof(unsigned char));
}
Esempio n. 14
0
	T* reserveType(ArenaLinear& arena){
	  return (T*)reserveBytes(arena, sizeof(T), alignof(T));
	}
Esempio n. 15
0
	T* reserveTypeArray(ArenaLinear& arena, u32 length){
		return (T*)reserveBytes(arena, sizeof(T) * length, alignof(T));
	}