MCPcopy Create free account
hub / github.com/ddnet/ddnet / aio_thread

Function aio_thread

src/base/aio.cpp:78–136  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

76}
77
78static void aio_thread(void *user)
79{
80 ASYNCIO *aio = (ASYNCIO *)user;
81
82 aio->lock.lock();
83 while(true)
84 {
85 struct BUFFERS buffers;
86 int result_io_error;
87 unsigned char local_buffer[ASYNC_LOCAL_BUFSIZE];
88 unsigned int local_buffer_len = 0;
89
90 if(aio->read_pos == aio->write_pos)
91 {
92 if(aio->finish != ASYNCIO_RUNNING)
93 {
94 if(aio->finish == ASYNCIO_CLOSE)
95 {
96 io_close(aio->io);
97 }
98 aio_handle_free_and_unlock(aio);
99 break;
100 }
101 aio->lock.unlock();
102 sphore_wait(&aio->sphore);
103 aio->lock.lock();
104 continue;
105 }
106
107 buffer_ptrs(aio, &buffers);
108 if(buffers.buf1)
109 {
110 if(buffers.len1 > sizeof(local_buffer) - local_buffer_len)
111 {
112 buffers.len1 = sizeof(local_buffer) - local_buffer_len;
113 }
114 mem_copy(local_buffer + local_buffer_len, buffers.buf1, buffers.len1);
115 local_buffer_len += buffers.len1;
116 if(buffers.buf2)
117 {
118 if(buffers.len2 > sizeof(local_buffer) - local_buffer_len)
119 {
120 buffers.len2 = sizeof(local_buffer) - local_buffer_len;
121 }
122 mem_copy(local_buffer + local_buffer_len, buffers.buf2, buffers.len2);
123 local_buffer_len += buffers.len2;
124 }
125 }
126 aio->read_pos = (aio->read_pos + buffers.len1 + buffers.len2) % aio->buffer_size;
127 aio->lock.unlock();
128
129 io_write(aio->io, local_buffer, local_buffer_len);
130 io_flush(aio->io);
131 result_io_error = io_error(aio->io);
132
133 aio->lock.lock();
134 aio->error = result_io_error;
135 }

Callers

nothing calls this directly

Calls 7

io_closeFunction · 0.85
sphore_waitFunction · 0.85
buffer_ptrsFunction · 0.85
mem_copyFunction · 0.85
io_writeFunction · 0.85
io_flushFunction · 0.85
io_errorFunction · 0.85

Tested by

no test coverage detected