From 9aeb6f8ed856e9da99f15a6f7c15242b1343c806 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=91=E9=A3=8E?= Date: Fri, 12 Oct 2012 13:45:40 +0800 Subject: [PATCH] local cast --- Makefile | 8 ++++++++ lualib/skynet.lua | 6 ++++++ service/testgroup.lua | 3 +++ skynet-src/skynet_multicast.c | 2 +- skynet-src/skynet_multicast.h | 2 +- skynet-src/skynet_start.c | 5 +++++ 6 files changed, 24 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 0df05675..35338350 100644 --- a/Makefile +++ b/Makefile @@ -15,9 +15,11 @@ all : \ service/multicast.so \ service/tunnel.so \ service/harbor.so \ + service/localcast.so \ luaclib/skynet.so \ luaclib/socket.so \ luaclib/int64.so \ + luaclib/mcast.so \ client skynet : \ @@ -61,6 +63,9 @@ service/snlua.so : service-src/service_lua.c service/gate.so : gate/mread.c gate/ringbuffer.c gate/main.c gcc $(CFLAGS) $(SHARED) $^ -o $@ -Igate -Iskynet-src +service/localcast.so : service-src/service_localcast.c + gcc $(CFLAGS) $(SHARED) $^ -o $@ -Iservice -Iskynet-src + luaclib/skynet.so : lualib-src/lua-skynet.c lualib-src/lua-seri.c lualib-src/lua-remoteobj.c lualib-src/trace_service.c | luaclib gcc $(CFLAGS) $(SHARED) -Iluacompat $^ -o $@ -Iskynet-src -Ilualib-src @@ -76,6 +81,9 @@ luaclib/socket.so : connection/lua-socket.c | luaclib luaclib/int64.so : lua-int64/int64.c | luaclib gcc $(CFLAGS) $(SHARED) -Iluacompat -O2 $^ -o $@ +luaclib/mcast.so : lualib-src/lua-localcast.c | luaclib + gcc $(CFLAGS) $(SHARED) -Iluacompat $^ -o $@ -Iskynet-src -Iservice-src + client : client-src/client.c gcc $(CFLAGS) $^ -o $@ -lpthread diff --git a/lualib/skynet.lua b/lualib/skynet.lua index 194efdb8..93928f0b 100644 --- a/lualib/skynet.lua +++ b/lualib/skynet.lua @@ -1,4 +1,5 @@ local c = require "skynet.c" +local mc = require "mcast.c" local tostring = tostring local tonumber = tonumber local coroutine = coroutine @@ -175,6 +176,11 @@ function skynet.send(addr, typename, ...) return c.send(addr, p.id, 0 , p.pack(...)) end +function skynet.cast(group, typename, ...) + local p = proto[typename] + return c.send(".cast", p.id, 0, mc(group, p.pack(...))) +end + skynet.genid = assert(c.genid) skynet.forward = assert(c.forward) diff --git a/service/testgroup.lua b/service/testgroup.lua index 7b963cca..009560e3 100644 --- a/service/testgroup.lua +++ b/service/testgroup.lua @@ -5,11 +5,14 @@ local group = require "mcgroup" skynet.start(function() local gid = group.create() local gaddr = group.address(gid) + local g = {} print("=== Create Group ===",gid,skynet.address(gaddr)) for i=1,10 do local address = skynet.newservice("testgroup_c", tostring(i)) + table.insert(g, address) group.enter(gid , address) end + skynet.cast(g,"text","Cast") skynet.sleep(1000) skynet.send(gaddr,"text","Hello World") skynet.exit() diff --git a/skynet-src/skynet_multicast.c b/skynet-src/skynet_multicast.c index 5445d102..12fd24a6 100644 --- a/skynet-src/skynet_multicast.c +++ b/skynet-src/skynet_multicast.c @@ -213,7 +213,7 @@ skynet_multicast_castgroup(struct skynet_context * from, struct skynet_multicast } void -skynet_multicast_cast(struct skynet_context * from, struct skynet_multicast_message *msg, uint32_t *dests, int n) { +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); int i; diff --git a/skynet-src/skynet_multicast.h b/skynet-src/skynet_multicast.h index c29b8e67..f4ec8ab8 100644 --- a/skynet-src/skynet_multicast.h +++ b/skynet-src/skynet_multicast.h @@ -13,7 +13,7 @@ typedef void (*skynet_multicast_func)(void *ud, uint32_t source, const void * ms struct skynet_multicast_message * skynet_multicast_create(const void * msg, size_t sz, uint32_t source); void skynet_multicast_copy(struct skynet_multicast_message *, int copy); void skynet_multicast_dispatch(struct skynet_multicast_message * msg, void * ud, skynet_multicast_func func); -void skynet_multicast_cast(struct skynet_context * from, struct skynet_multicast_message *msg, uint32_t *dests, int n); +void skynet_multicast_cast(struct skynet_context * from, struct skynet_multicast_message *msg, const uint32_t *dests, int n); struct skynet_multicast_group * skynet_multicast_newgroup(); void skynet_multicast_deletegroup(struct skynet_multicast_group * group); diff --git a/skynet-src/skynet_start.c b/skynet-src/skynet_start.c index 28e65781..f593ca87 100644 --- a/skynet-src/skynet_start.c +++ b/skynet-src/skynet_start.c @@ -118,6 +118,11 @@ skynet_start(struct skynet_config * config) { fprintf(stderr,"launch logger error"); exit(1); } + ctx = skynet_context_new("localcast", NULL); + if (ctx == NULL) { + fprintf(stderr,"launch local cast error"); + exit(1); + } ctx = skynet_context_new("snlua", "launcher"); if (ctx) { ctx = skynet_context_new("snlua", config->start);