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; }
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 ); } }