| 348 | } |
| 349 | |
| 350 | int 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; |
nothing calls this directly
no outgoing calls
no test coverage detected