Skip to content

Commit d6a0818

Browse files
committed
ccs communication working
1 parent dcf2f3d commit d6a0818

File tree

3 files changed

+36
-46
lines changed

3 files changed

+36
-46
lines changed

charm4py/charm.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,9 @@ def __init__(self):
153153
# TODO: maybe implement this buffer in c++
154154
self.future_get_buffer = {}
155155

156+
#registered methods for ccs
157+
self.ccs_methods = {}
158+
156159
def __init_profiling__(self):
157160
# these are attributes used only in profiling mode
158161
# list of Chare types that are registered and used internally by the runtime
@@ -1094,14 +1097,21 @@ def LBTurnInstrumentOff(self):
10941097

10951098
#functions for ccs
10961099
def CcsRegisterHandler(self, handlername, handler):
1100+
self.ccs_methods[handlername] = handler
10971101
self.lib.CcsRegisterHandler(handlername, handler)
10981102

10991103
def CcsIsRemoteRequest(self):
1100-
self.lib.CcsIsRemoteRequest()
1104+
self.lib.isRemoteRequest()
11011105

11021106
def CcsSendReply(self, message):
11031107
self.lib.CcsSendReply(message)
11041108

1109+
def callHandler(self, handlername, data):
1110+
if handlername in self.ccs_methods:
1111+
self.ccs_methods[handlername](data)
1112+
else:
1113+
raise Charm4PyError('Handler ' + handlername + ' not registered')
1114+
11051115

11061116

11071117
class CharmRemote(Chare):

charm4py/charmlib/charmlib_cython.pyx

Lines changed: 17 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -316,44 +316,27 @@ cdef object times = [0.0] * 3 # track time in [charm reduction callbacks, custom
316316
cdef bytes localMsg = b'L:' + (b' ' * sizeof(int))
317317
cdef char* localMsg_ptr = <char*>localMsg
318318

319-
#cdef const int CmiReservedHeaderSize = getCmiReservedHeaderSize()
319+
#cdef const int CmiReservedHeaderSize s= getCmiReservedHeaderSize()
320320

321321
cdef struct remoteMsg:
322-
char[CmiReservedHeaderSize] reservedHeader
323-
#char[32] reservedHeader
324-
CcsImplHeader header
325-
void* data
326-
327-
cdef void recvRemoteMessage(void *msg):
328-
329-
cdef void *shiftedMsg = msg + CmiReservedHeaderSize
330-
cdef remoteMsg *incomingMsgPtr = <remoteMsg*> shiftedMsg
331-
cdef remoteMsg incomingMsg = dereference(incomingMsgPtr)
332-
cdef char *handler_name = incomingMsg.header.handler
333-
334-
cdef object handler
335-
cdef bytes payload
336-
# call correct handler
337-
338-
cdef int payload_length = (<unsigned char *>incomingMsg.header.len.data)[0] | \
339-
(<unsigned char *>incomingMsg.header.len.data)[1] << 8 | \
340-
(<unsigned char *>incomingMsg.header.len.data)[2] << 16 | \
341-
(<unsigned char *>incomingMsg.header.len.data)[3] << 24
342-
if payload_length <= 0:
343-
print("Error: Payload Length is <= 0")
344-
return
345-
346-
payload = bytes(<char*>incomingMsg.data, payload_length)
322+
int a
323+
int b
324+
char handler_name[32] # we know it can't be longer
325+
char data[1024] #assume generous length at end
326+
327+
cdef void recvRemoteMessage(void *msg) noexcept:
347328

329+
cdef void *shiftedMsg = msg + CmiReservedHeaderSize #move past reserved header
330+
cdef remoteMsg* incomingMsgPtr = <remoteMsg*> shiftedMsg
331+
cdef int handler_length = incomingMsgPtr.a
332+
cdef int data_length = incomingMsgPtr.b
348333

349-
python_handlername = handler_name.decode('utf-8')
350-
handler_func = _ccs_handlers.get(python_handlername)
351-
if handler_func is None:
352-
print(f"Error: Could not find handler assocaited with name : {python_handlername}")
353-
return
334+
# turn char arrays into strings
335+
336+
handler_name = incomingMsgPtr.handler_name[:handler_length].decode('utf-8')
337+
data = incomingMsgPtr.data[:data_length].decode('utf-8')
354338

355-
handler_func(payload)
356-
return
339+
charm.callHandler(handler_name, data)
357340

358341

359342
class CharmLib(object):
@@ -872,14 +855,12 @@ class CharmLib(object):
872855
def CcsRegisterHandler(self, str handlername, object handler):
873856
cdef bytes handler_bytes = handlername.encode("utf-8")
874857
cdef const char* c_handlername = handler_bytes
875-
876-
_ccs_handlers[handlername] = handler
877858
CcsRegisterHandlerExt(c_handlername, <void *>recvRemoteMessage)
878859

879860
def isRemoteRequest(self):
880861
return bool(CcsIsRemoteRequest())
881862

882-
def CcsSendReply(str message):
863+
def CcsSendReply(self, str message):
883864
cdef bytes message_bytes = message.encode("utf-8")
884865
cdef const char* replyData = message_bytes
885866

examples/ccs/ccs_server.py

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,24 @@
11
from charm4py import charm, Chare, Array, Future, Reducer, Group
22

3+
def handler(msg):
4+
print("CCS Ping handler called on " + str(charm.myPe()))
5+
answer = "Hello to sender " + str(msg) + "from PE " + str(charm.myPe())
6+
# send the answer back to the client
7+
charm.CcsSendReply(answer)
8+
39
class RegisterPerChare(Chare):
410

5-
def register(self, return_future):
11+
def register(self, return_future, handler):
612
charm.CcsRegisterHandler("ping2", handler)
713
charm.CcsRegisterHandler("ping", handler)
814
self.reduce(return_future, Reducer.nop)
915

10-
def handler(msg):
11-
if charm.CcsIsRemoteRequest():
12-
answer = "Hello to sender " + msg.payload + "from PE " + str(charm.myPe())
13-
# send the answer back to the client
14-
print("CCS Ping handler called on " + str(charm.myPe()))
15-
charm.CcsSendReply(answer)
16-
1716
def main(args):
1817
# No need to initialize converse, because charm.start does this
1918
# just register the handler
2019
reg_wait = Future()
2120
registers = Group(RegisterPerChare)
22-
registers.register(reg_wait)
21+
registers.register(reg_wait, handler)
2322
reg_wait.get()
2423
print("CCS Handlers registered . Waiting for net requests...")
2524

0 commit comments

Comments
 (0)