void sslsocket::sendall(const void* buff, int len) { const char* ptr = static_cast<const char*>(buff); int sent = 0; do { sent += sendsome(ptr + sent, len - sent); } while (sent != len); }
void enqueue_message(void* message) { struct message_header* header = (struct message_header*)message; uint32_t bufsize = ((uint32_t*)singleton_screen->tx_buffer)[0]; uint32_t* readoff = &(((uint32_t*)singleton_screen->tx_buffer)[1]); uint32_t* writeoff = &(((uint32_t*)singleton_screen->tx_buffer)[2]); char* writebuf = (char*)&(((uint32_t*)singleton_screen->tx_buffer)[3]); DBG("Sending %s (length %u)\n", optotext(header->opcode), header->length); check_for_asynchronous_failures(); if(last_alloc_is_in_place) { uint32_t newwriteoff = *writeoff + header->length; if(newwriteoff >= bufsize) newwriteoff -= bufsize; *writeoff = newwriteoff; send(singleton_screen->socketfd, "T", 1, 0); return; } int bytesSent = 0; while(bytesSent < header->length) { if(drain_events(singleton_screen->socketfd) == -1) { printf("Socket error draining events\n"); exit(1); } #ifdef DEBUG_RING_WRITE uint32_t base = *readoff; uint32_t limit = *writeoff; int bytes_available_for_readers; if(limit > base) bytes_available_for_readers = limit - base; else bytes_available_for_readers = bufsize - (base - limit); int read_would_wrap = 0; if((base + bytes_available_for_readers) > bufsize) read_would_wrap = 1; printf("Writing with readoff %u, writeoff %u: dumping unread bytes\n", base, limit); if(!read_would_wrap) { debug_print_bytes(writebuf + base, bytes_available_for_readers); } else { int bytes_to_end = bufsize - base; debug_print_bytes(writebuf + base, bytes_to_end); printf("---buffer end---\n"); debug_print_bytes(writebuf, bytes_available_for_readers - bytes_to_end); } #endif // DEBUG_RING_WRITE int sent = sendsome(readoff, writeoff, bufsize, writebuf, ((char*)header + bytesSent), header->length - bytesSent); if(sent == 0) { if(analyse_waits) printf("Wait: transmit buffer full... "); if(wait_for_tx_not_full() == -1) { printf("Socket error waiting for tx-not-full\n"); exit(1); } if(analyse_waits) printf("Woke to find read %u, write %u\n", *readoff, *writeoff); } uint32_t newwriteoff = *writeoff + sent; if(newwriteoff >= bufsize) newwriteoff -= bufsize; *writeoff = newwriteoff; bytesSent += sent; // Notify the remote that we have sent something send(singleton_screen->socketfd, "T", 1, 0); } free(header); }