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);
}
Exemple #2
0
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);

}