about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--091socket.cc10
-rw-r--r--092socket.mu12
2 files changed, 16 insertions, 6 deletions
diff --git a/091socket.cc b/091socket.cc
index 4ea0d2b6..2aebbed8 100644
--- a/091socket.cc
+++ b/091socket.cc
@@ -321,6 +321,14 @@ case _CLOSE_SOCKET: {
     raise << maybe(get(Recipe, r).name) << "first ingredient of '$close-socket' should be a number, but got '" << to_string(inst.ingredients.at(0)) << "'\n" << end();
     break;
   }
+  if (SIZE(inst.products) != 1) {
+    raise << maybe(get(Recipe, r).name) << "'$close-socket' requires exactly one product, but got '" << inst.original_string << "'\n" << end();
+    break;
+  }
+  if (inst.products.at(0).name != inst.ingredients.at(0).name) {
+    raise << maybe(get(Recipe, r).name) << "product of '$close-socket' must be first ingredient '" << inst.ingredients.at(0).original_string << "', but got '" << inst.products.at(0).original_string << "'\n" << end();
+    break;
+  }
   break;
 }
 :(before "End Primitive Recipe Implementations")
@@ -329,6 +337,8 @@ case _CLOSE_SOCKET: {
   socket_t* socket = reinterpret_cast<socket_t*>(x);
   close(socket->fd);
   delete socket;
+  products.resize(1);
+  products.at(0).push_back(0);  // make sure we can't reuse the socket
   break;
 }
 
diff --git a/092socket.mu b/092socket.mu
index 57c8120d..803c6557 100644
--- a/092socket.mu
+++ b/092socket.mu
@@ -20,7 +20,7 @@ F - example-server-test: $open-server-socket failed]
   memory-should-contain [
     10:array:character <- [abc]
   ]
-  $close-socket socket
+  socket <- $close-socket socket
 ]
 # helper just for this scenario
 def example-handler query:text -> response:text [
@@ -52,7 +52,7 @@ scenario example-client-test [
 
 type request-handler = (recipe text -> text)
 
-def serve-one-request socket:num, request-handler:request-handler [
+def serve-one-request socket:num, request-handler:request-handler -> socket:num [
   local-scope
   load-ingredients
   session:num <- $accept socket
@@ -63,7 +63,7 @@ F - example-server-test: $accept failed]
   query:text <- drain contents
   response:text <- call request-handler, query
   write-to-socket session, response
-  $close-socket session
+  session <- $close-socket session
 ]
 
 def start-reading-from-network resources:&:resources, uri:text -> contents:&:source:char [
@@ -101,7 +101,7 @@ def request-socket socket:num, s:text -> socket:num [
   $write-to-socket socket, 10/lf
 ]
 
-def receive-from-socket socket:num, sink:&:sink:char -> sink:&:sink:char [
+def receive-from-socket socket:num, sink:&:sink:char -> sink:&:sink:char, socket:num [
   local-scope
   load-ingredients
   {
@@ -128,11 +128,11 @@ def receive-from-socket socket:num, sink:&:sink:char -> sink:&:sink:char [
   sink <- close sink
 ]
 
-def receive-from-client-socket-and-close socket:num, sink:&:sink:char -> sink:&:sink:char [
+def receive-from-client-socket-and-close socket:num, sink:&:sink:char -> sink:&:sink:char, socket:num [
   local-scope
   load-ingredients
   sink <- receive-from-socket socket, sink
-  $close-socket socket
+  socket <- $close-socket socket
 ]
 
 def write-to-socket socket:num, s:text [