int skynet_multicast_castgroup(struct skynet_context * from, struct skynet_multicast_group * group, struct skynet_multicast_message *msg) { combine_queue(from, group); int release = 0; if (group->number > 0) { uint32_t source = skynet_context_handle(from); skynet_multicast_copy(msg, group->number); int i; for (i=0;i<group->number;i++) { uint32_t p = group->data[i]; struct skynet_context * ctx = skynet_handle_grab(p); if (ctx) { skynet_context_send(ctx, msg, 0 , source, PTYPE_MULTICAST , 0); skynet_context_release(ctx); } else { skynet_multicast_leavegroup(group, p); ++release; } } } skynet_multicast_copy(msg, -release); return group->number - release; }
int skynet_multicast_castgroup(struct skynet_context * from, struct skynet_multicast_group * group, struct skynet_multicast_message *msg) { combine_queue(from, group); if (group->number == 0) { skynet_multicast_dispatch(msg, NULL, NULL); return 0; } uint32_t source = skynet_context_handle(from); skynet_multicast_copy(msg, group->number); int i; int release = 0; for (i=0;i<group->number;i++) { struct pair * p = &group->data[i]; skynet_context_send(p->ctx, msg, 0 , source, PTYPE_MULTICAST , 0); int ref = skynet_context_ref(p->ctx); if (ref == 1) { skynet_context_release(p->ctx); struct skynet_context * ctx = skynet_handle_grab(p->handle); if (ctx == NULL) { p->ctx = NULL; skynet_multicast_leavegroup(group, p->handle); ++release; } } } return group->number - release; }
void skynet_multicast_cast(struct skynet_context * from, struct skynet_multicast_message *msg, const uint32_t *dests, int n) { uint32_t source = skynet_context_handle(from); skynet_multicast_copy(msg, n); if (n == 0) return; int i; int release = 0; for (i=0;i<n;i++) { uint32_t p = dests[i]; struct skynet_context * ctx = skynet_handle_grab(p); if (ctx) { skynet_context_send(ctx, msg, 0 , source, PTYPE_MULTICAST , 0); skynet_context_release(ctx); } else { ++release; } } skynet_multicast_copy(msg, -release); }