bool RealmSocket::send(const char *buf, size_t len) { if (buf == NULL || len == 0) return true; ACE_Data_Block db( len, ACE_Message_Block::MB_DATA, (const char*)buf, 0, 0, ACE_Message_Block::DONT_DELETE, 0); ACE_Message_Block message_block( &db, ACE_Message_Block::DONT_DELETE, 0); message_block.wr_ptr(len); if (msg_queue()->is_empty()) { // Try to send it directly. ssize_t n = noblk_send(message_block); if (n < 0) return false; size_t un = size_t(n); if (un == len) return true; // fall down message_block.rd_ptr(un); } ACE_Message_Block *mb = message_block.clone(); if (msg_queue()->enqueue_tail(mb, (ACE_Time_Value *) &ACE_Time_Value::zero) == -1) { mb->release(); return false; } if (reactor()->schedule_wakeup(this, ACE_Event_Handler::WRITE_MASK) == -1) return false; return true; }
int RealmSocket::handle_output(ACE_HANDLE) { if (closing_) return -1; ACE_Message_Block* mb = 0; if (msg_queue()->is_empty()) { reactor()->cancel_wakeup(this, ACE_Event_Handler::WRITE_MASK); return 0; } if (msg_queue()->dequeue_head(mb, (ACE_Time_Value *)(&ACE_Time_Value::zero)) == -1) return -1; ssize_t n = noblk_send(*mb); if (n < 0) { mb->release(); return -1; } else if (size_t(n) == mb->length()) { mb->release(); return 1; } else { mb->rd_ptr(n); if (msg_queue()->enqueue_head(mb, (ACE_Time_Value *) &ACE_Time_Value::zero) == -1) { mb->release(); return -1; } return 0; } ACE_NOTREACHED(return -1); }