| 93 | } |
| 94 | |
| 95 | FB_SIZE_T TraceLog::read(void* buf, FB_SIZE_T size) |
| 96 | { |
| 97 | if (!size) |
| 98 | return 0; |
| 99 | |
| 100 | fb_assert(m_reader); |
| 101 | TraceLogGuard guard(this); |
| 102 | |
| 103 | TraceLogHeader* header = m_sharedMemory->getHeader(); |
| 104 | const char* data = reinterpret_cast<const char*> (header); |
| 105 | char* dest = reinterpret_cast<char*> (buf); |
| 106 | FB_SIZE_T readCnt = 0; |
| 107 | |
| 108 | if (header->readPos > header->writePos) |
| 109 | { |
| 110 | const FB_SIZE_T toRead = MIN(header->allocated - header->readPos, size); |
| 111 | memcpy(dest, data + header->readPos, toRead); |
| 112 | |
| 113 | readCnt += toRead; |
| 114 | header->readPos += toRead; |
| 115 | if (header->readPos == header->allocated) |
| 116 | header->readPos = sizeof(TraceLogHeader); |
| 117 | |
| 118 | dest += toRead; |
| 119 | size -= toRead; |
| 120 | } |
| 121 | |
| 122 | if (size && header->readPos < header->writePos) |
| 123 | { |
| 124 | const FB_SIZE_T toRead = MIN(header->writePos - header->readPos, size); |
| 125 | memcpy(dest, data + header->readPos, toRead); |
| 126 | |
| 127 | readCnt += toRead; |
| 128 | header->readPos += toRead; |
| 129 | if (header->readPos == header->allocated) |
| 130 | header->readPos = sizeof(TraceLogHeader); |
| 131 | } |
| 132 | |
| 133 | if (header->readPos == header->writePos) |
| 134 | header->readPos = header->writePos = sizeof(TraceLogHeader); |
| 135 | |
| 136 | if ((header->flags & FLAG_FULL) && (getFree(true) >= FREE_SPACE_THRESHOLD)) |
| 137 | header->flags &= ~FLAG_FULL; |
| 138 | |
| 139 | return readCnt; |
| 140 | } |
| 141 | |
| 142 | FB_SIZE_T TraceLog::write(const void* buf, FB_SIZE_T size) |
| 143 | { |