MCPcopy Create free account
hub / github.com/FirebirdSQL/firebird / read

Method read

src/jrd/trace/TraceLog.cpp:95–140  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

93}
94
95FB_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
142FB_SIZE_T TraceLog::write(const void* buf, FB_SIZE_T size)
143{

Callers 1

readSessionMethod · 0.45

Calls 1

getHeaderMethod · 0.45

Tested by

no test coverage detected