MCPcopy Create free account
hub / github.com/caozhiyi/CppNet / _Write

Method _Write

base/LoopBuffer.cpp:350–435  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

348}
349
350int CLoopBuffer::_Write(const char* str, int len, bool write) {
351 std::unique_lock<std::mutex> lock(_mutex);
352 if (_read < _write) {
353 if (_write + len <= _buffer_end) {
354 if (write) {
355 memcpy(_write, str, len);
356 }
357 _write += len;
358 return len;
359
360 } else {
361 auto size_end = _buffer_end - _write;
362 auto left = len - size_end;
363 if (write) {
364 memcpy(_write, str, size_end);
365 }
366
367 if (_buffer_start + left <= _read) {
368 if (write) {
369 memcpy(_buffer_start, str + size_end, left);
370 }
371 _write = _buffer_start + left;
372 if (_write == _read) {
373 _can_read = true;
374 }
375 return len;
376
377 } else {
378 auto can_save = _read - _buffer_start;
379 if (can_save > 0 && write) {
380 memcpy(_buffer_start, str + size_end, can_save);
381 }
382 _read = _write;
383 _can_read = true;
384 return (int)(can_save + size_end);
385 }
386 }
387
388 } else if (_read > _write) {
389 auto size = _read - _write;
390 if (len <= size) {
391 if (write) {
392 memcpy(_write, str, len);
393 }
394 _write += len;
395 if (_write == _read) {
396 _can_read = true;
397 }
398 return len;
399
400 } else {
401 if (write) {
402 memcpy(_write, str, size);
403 }
404 _write += size;
405 _can_read = true;
406
407 return (int)size;

Callers

nothing calls this directly

Calls

no outgoing calls

Tested by

no test coverage detected