| 167 return NULL; |
167 return NULL; |
| 168 } |
168 } |
| 169 |
169 |
| 170 void* uic_simple_msg_handler_out_thread(void *data) { |
170 void* uic_simple_msg_handler_out_thread(void *data) { |
| 171 UiSimpleMessageHandler *handler = data; |
171 UiSimpleMessageHandler *handler = data; |
| |
172 CxBuffer *buffer = handler->outbuf; |
| |
173 |
| |
174 pthread_mutex_lock(&handler->queue_lock); |
| |
175 |
| |
176 for(;;) { |
| |
177 if(buffer->pos == 0) { |
| |
178 pthread_cond_wait(&handler->available, &handler->queue_lock); |
| |
179 continue; |
| |
180 } else { |
| |
181 size_t n = buffer->pos; |
| |
182 size_t pos = 0; |
| |
183 while(n > 0) { |
| |
184 ssize_t w = write(handler->out, buffer->space + pos, n); |
| |
185 if(w <= 0) { |
| |
186 fprintf(stderr, "Error: output error\n"); |
| |
187 break; |
| |
188 } |
| |
189 n -= w; |
| |
190 pos += w; |
| |
191 } |
| |
192 if(n > 0) { |
| |
193 break; // error |
| |
194 } |
| |
195 buffer->pos = 0; |
| |
196 } |
| |
197 } |
| |
198 |
| |
199 pthread_mutex_unlock(&handler->queue_lock); |
| 172 |
200 |
| 173 return NULL; |
201 return NULL; |
| 174 } |
202 } |