int32_t _shutdowns_direct( uint8_t index, struct session_manager * manager, struct sidlist * ids ) { uint32_t i = 0; int32_t count = 0; for ( i = 0; i < sidlist_count(ids); ++i ) { sid_t id = sidlist_get(ids, i); if ( SID_INDEX(id) != index ) { continue; } struct session * session = session_manager_get( manager, id ); if ( session == NULL ) { continue; } // 直接终止 ++count; session_close( session ); session_shutdown( session ); } sidlist_destroy( ids ); return count; }
int32_t _broadcast_direct( struct iolayer * self, uint8_t index, struct session_manager * manager, struct message * msg ) { uint32_t i = 0; int32_t count = 0; // 数据改造 if ( self->transform != NULL ) { // 数据需要改造 char * buffer = NULL; uint32_t nbytes = message_get_length( msg ); buffer = self->transform( self->context, message_get_buffer(msg), &nbytes ); if ( buffer == NULL ) { // 数据改造失败 message_destroy( msg ); return -1; } if ( buffer != message_get_buffer(msg) ) { // 数据改造成功 message_set_buffer( msg, buffer, nbytes ); } } for ( i = 0; i < sidlist_count(msg->tolist); ++i ) { sid_t id = sidlist_get(msg->tolist, i); if ( SID_INDEX(id) != index ) { message_add_failure( msg, id ); continue; } struct session * session = session_manager_get( manager, id ); if ( unlikely(session == NULL) ) { message_add_failure( msg, id ); continue; } if ( session_append(session, msg) >= 0 ) { // 尝试单独发送 // 添加到发送队列成功 ++count; } } // 消息发送完毕, 直接销毁 if ( message_is_complete(msg) ) { message_destroy( msg ); } return count; }
int32_t message_is_complete( struct message * self ) { int32_t totalcount = self->tolist ? sidlist_count(self->tolist) : 0; return ( totalcount == self->nsuccess + self->nfailure ); }