bool clients_t::add(client_t* c) { FUSION_ASSERT(array.size() == size()); if (insert(std::make_pair(c->cid_, c)).second) { array.push_back(c); apmap.insert(std::make_pair(std::make_pair(c->addr_, c->port_), c)); //@@check return true; } return false; }
client_t::~client_t() { FUSION_DEBUG("destroy client=%d", cid_); if (registered_) { result_t e = md_unreg_client(cid_); FUSION_ASSERT(e == ERR_OK); } delete conn_; ::free((void*)address_); }
static int Packet_Write( Packet *packet, int type, int msg_id, int channel, const void *msg_data, int msg_size, const void *extra_data, int extra_size, bool from_user ) { size_t total = sizeof(FusionReadMessage) + msg_size + extra_size; size_t aligned = (total + 3) & ~3; FusionReadMessage *header = (FusionReadMessage *)( packet->buf + packet->size ); FUSION_DEBUG( "%s( %p, msg_id %d, channel %d, size %d, extra %d, total %zu )\n", __FUNCTION__, packet, msg_id, channel, msg_size, extra_size, total ); D_MAGIC_ASSERT( packet, Packet ); FUSION_ASSERT( packet->size + aligned <= FUSION_MAX_PACKET_SIZE ); header->msg_type = type; header->msg_id = msg_id; header->msg_channel = channel; header->msg_size = msg_size + extra_size; if (from_user) { if (copy_from_user( header + 1, msg_data, msg_size )) return -EFAULT; } else memcpy( header + 1, msg_data, msg_size ); if (extra_data && extra_size) { if (copy_from_user( (char*)(header + 1) + msg_size, extra_data, extra_size )) return -EFAULT; } while (total < aligned) packet->buf[packet->size + total++] = 0; packet->size += aligned; return 0; }
static int Fusionee_GetPacket( Fusionee *fusionee, size_t size, Packet **ret_packet ) { Packet *packet; FUSION_DEBUG( "%s( %p )\n", __FUNCTION__, fusionee ); FUSION_ASSERT( size <= FUSION_MAX_PACKET_SIZE ); packet = (Packet*) direct_list_last( fusionee->packets.items ); D_MAGIC_ASSERT_IF( packet, Packet ); if (!packet || packet->size + size > FUSION_MAX_PACKET_SIZE) { if (packet) { packet->flush = true; fusion_core_wq_wake( fusion_core, &fusionee->wait_receive); } if (fusionee->free_packets.count) { packet = (Packet*) fusion_fifo_get( &fusionee->free_packets ); D_MAGIC_ASSERT( packet, Packet ); } else packet = Packet_New(); if (!packet) return -ENOMEM; D_ASSERT( packet->link.prev == NULL ); D_ASSERT( packet->link.next == NULL ); fusion_fifo_put( &fusionee->packets, &packet->link ); } D_MAGIC_ASSERT( packet, Packet ); *ret_packet = packet; return 0; }
client_t::client_t(cid_t cid, conn_t* conn, ULONG addr, USHORT port) : cid_(cid), registered_(false), conn_(conn), addr_(addr), port_(port), address_(0) { FUSION_ASSERT(conn_); ::memset(&uuid_, 0, sizeof uuid_); }