on master help sign in
Change return type of checkMessages
f79498dEdwin Brady
libs/base/System/Concurrency/Raw.idr+16−4
@@ -14,16 +14,28 @@ sendToThread {a} dest val
14
14
15||| Check for messages in the process inbox
15||| Check for messages in the process inbox
16checkMsgs : IO Bool
16checkMsgs : 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)
18 prim__vm
18 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)
20
31
21||| Check for messages from a specific sender in the process inbox
32||| Check for messages from a specific sender in the process inbox
22checkMsgsFrom : Ptr -> IO Bool
33checkMsgsFrom : Ptr -> IO Bool
23checkMsgsFrom sender
34checkMsgsFrom 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)
25 prim__vm sender
36 prim__vm sender
26− return (intToBool msgs)
37+ null <- nullPtr msgs
38+ return (not null)
27
39
28||| Check inbox for messages. If there are none, blocks until a message
40||| Check inbox for messages. If there are none, blocks until a message
29||| arrives.
41||| arrives.
rts/idris_rts.c+3−3
@@ -1112,16 +1112,16 @@ void idris_sendMessage(VM* sender, VM* dest, VAL msg) {
1112// printf("Sending [unlock]...\n");
1112// printf("Sending [unlock]...\n");
1113}
1113}
1114
1114
1115−int idris_checkMessages(VM* vm) {
1115+VM* idris_checkMessages(VM* vm) {
1116 return idris_checkMessagesFrom(vm, NULL);
1116 return idris_checkMessagesFrom(vm, NULL);
1117}
1117}
1118
1118
1119−int idris_checkMessagesFrom(VM* vm, VM* sender) {
1119+VM* idris_checkMessagesFrom(VM* vm, VM* sender) {
1120 Msg* msg;
1120 Msg* msg;
1121
1121
1122 for (msg = vm->inbox; msg < vm->inbox_end && msg->msg != NULL; ++msg) {
1122 for (msg = vm->inbox; msg < vm->inbox_end && msg->msg != NULL; ++msg) {
1123 if (sender == NULL || msg->sender == sender) {
1123 if (sender == NULL || msg->sender == sender) {
1124− return 1;
1124+ return msg->sender;
1125 }
1125 }
1126 }
1126 }
1127 return 0;
1127 return 0;
rts/idris_rts.h+4−3
@@ -286,10 +286,11 @@ VAL copyTo(VM* newVM, VAL x);
286
286
287// Add a message to another VM's message queue
287// Add a message to another VM's message queue
288void idris_sendMessage(VM* sender, VM* dest, VAL msg);
288void 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);
289// Check whether there are any messages in the queue
292// 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);
293// block until there is a message in the queue
294// block until there is a message in the queue
294Msg* idris_recvMessage(VM* vm);
295Msg* idris_recvMessage(VM* vm);
295// block until there is a message in the queue
296// block until there is a message in the queue