on master help sign in
Change return type of checkMessages

Useful to know who the next waiting message is from, as well as whether there is one

commitf79498dc854a94258ee833b08dc79495b04ea054 authorEdwin Brady <ecb10@st-andrews.ac.uk> dateTue 17 Feb 2015, 23:55 (12 years ago) parent297b3e2
3 files changed+23−10
libs/base/System/Concurrency/Raw.idr+16−4 rts/idris_rts.c+3−3 rts/idris_rts.h+4−3
libs/base/System/Concurrency/Raw.idr+16−4
@@ -14,16 +14,28 @@ sendToThread {a} dest val
1414
1515||| Check for messages in the process inbox
1616checkMsgs : IO Bool
17−checkMsgs = do msgs <- foreign FFI_C "idris_checkMessages" (Ptr -> IO Int)
17+checkMsgs = do msgs <- foreign FFI_C "idris_checkMessages" (Ptr -> IO Ptr)
1818 prim__vm
19− return (intToBool msgs)
19+ null <- nullPtr msgs
20+ return (not null)
21+
22+||| Check for messages in the process inbox.
23+||| Returns either 'Nothing', if none, or 'Just pid' as pid of sender.
24+listenMsgs : IO (Maybe Ptr)
25+listenMsgs = do sender <- foreign FFI_C "idris_checkMessages" (Ptr -> IO Ptr)
26+ prim__vm
27+ null <- nullPtr sender
28+ return (if null
29+ then Nothing
30+ else Just sender)
2031
2132||| Check for messages from a specific sender in the process inbox
2233checkMsgsFrom : Ptr -> IO Bool
2334checkMsgsFrom sender
24− = do msgs <- foreign FFI_C "idris_checkMessagesFrom" (Ptr -> Ptr -> IO Int)
35+ = do msgs <- foreign FFI_C "idris_checkMessagesFrom" (Ptr -> Ptr -> IO Ptr)
2536 prim__vm sender
26− return (intToBool msgs)
37+ null <- nullPtr msgs
38+ return (not null)
2739
2840||| Check inbox for messages. If there are none, blocks until a message
2941||| arrives.
rts/idris_rts.c+3−3
@@ -1112,16 +1112,16 @@ void idris_sendMessage(VM* sender, VM* dest, VAL msg) {
11121112// printf("Sending [unlock]...\n");
11131113}
11141114
1115−int idris_checkMessages(VM* vm) {
1115+VM* idris_checkMessages(VM* vm) {
11161116 return idris_checkMessagesFrom(vm, NULL);
11171117}
11181118
1119−int idris_checkMessagesFrom(VM* vm, VM* sender) {
1119+VM* idris_checkMessagesFrom(VM* vm, VM* sender) {
11201120 Msg* msg;
11211121
11221122 for (msg = vm->inbox; msg < vm->inbox_end && msg->msg != NULL; ++msg) {
11231123 if (sender == NULL || msg->sender == sender) {
1124− return 1;
1124+ return msg->sender;
11251125 }
11261126 }
11271127 return 0;
rts/idris_rts.h+4−3
@@ -286,10 +286,11 @@ VAL copyTo(VM* newVM, VAL x);
286286
287287// Add a message to another VM's message queue
288288void idris_sendMessage(VM* sender, VM* dest, VAL msg);
289+// Check whether there are any messages in the queue and return PID of
290+// sender if so (null if not)
291+VM* idris_checkMessages(VM* vm);
289292// Check whether there are any messages in the queue
290−int idris_checkMessages(VM* vm);
291−// Check whether there are any messages in the queue
292−int idris_checkMessagesFrom(VM* vm, VM* sender);
293+VM* idris_checkMessagesFrom(VM* vm, VM* sender);
293294// block until there is a message in the queue
294295Msg* idris_recvMessage(VM* vm);
295296// block until there is a message in the queue