Esempio n. 1
0
static int
Packet_AddCallback( Packet                *packet,
                    int                    msg_id,
                    FusionMessageCallback  func,
                    void                  *ctx,
                    int                    param )
{
     MessageCallback *callback;

     FUSION_DEBUG( "%s( %p )\n", __FUNCTION__, packet );

     D_MAGIC_ASSERT( packet, Packet );

     callback = fusion_core_malloc( fusion_core, sizeof(MessageCallback) );
     if (!callback)
          return -ENOMEM;

     callback->msg_id     = msg_id;
     callback->func_index = func;
     callback->ctx        = ctx;
     callback->param      = param;

     fusion_fifo_put( &packet->callbacks, &callback->link );

     return 0;
}
static int
Fusionee_GetPacket( Fusionee  *fusionee,
                    size_t     size,
                    Packet   **ret_packet )
{
     Packet *packet;

     FUSION_DEBUG( "%s( %p )\n", __FUNCTION__, fusionee );

     if (size > FUSION_MAX_PACKET_SIZE)
          return -E2BIG;

     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;
}
Esempio n. 3
0
static void
Fusionee_PutPacket( Fusionee *fusionee,
                    Packet   *packet )
{
     FUSION_DEBUG( "%s( %p )\n", __FUNCTION__, fusionee );

     D_MAGIC_ASSERT( packet, Packet );

     D_ASSERT( packet->link.prev == NULL );
     D_ASSERT( packet->link.next == NULL );

     if (fusionee->free_packets.count > 10)
          Packet_Free( packet );
     else {
          packet->size  = 0;
          packet->flush = false;

          fusion_fifo_reset( &packet->callbacks );

          fusion_fifo_put( &fusionee->free_packets, &packet->link );
     }
}