Exemple #1
0
  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;
  }
Exemple #2
0
  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_);
  }
Exemple #3
0
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;
}
Exemple #4
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;
}
Exemple #5
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_);
  }