smp: Add primitive copy-select-registry.
authorMatt Birkholz <puck@birchwood-abbey.net>
Wed, 17 Dec 2014 08:48:39 +0000 (01:48 -0700)
committerMatt Birkholz <puck@birchwood-abbey.net>
Sun, 21 Dec 2014 19:19:09 +0000 (12:19 -0700)
src/microcode/osio.h
src/microcode/prosio.c
src/microcode/uxio.c

index a0e28ae5f680908c2b90fb32611c0896906158f1..ee8d32af4713c25adb1dc38912b6b3ba43224ea3 100644 (file)
@@ -109,6 +109,10 @@ extern int OS_test_select_registry
   (select_registry_t registry, int blockp);
 extern int OS_test_select_descriptor
   (int fd, int blockp, unsigned int mode);
+#ifdef ENABLE_SMP
+extern void OS_copy_select_registry
+  (select_registry_t from, select_registry_t to);
+#endif
 extern int OS_pause (void);
 
 #endif /* SCM_OSIO_H */
index 08389fa70346f6a7bb7b699833047178c094e8d8..ea14020f5d1b601aadb0c5c1e8d0a3e3cbaabab0 100644 (file)
@@ -316,6 +316,18 @@ DEFINE_PRIMITIVE ("SELECT-REGISTRY-LENGTH", Prim_selreg_length, 1, 1, 0)
     (ulong_to_integer (OS_select_registry_length (arg_select_registry (1))));
 }
 
+DEFINE_PRIMITIVE ("COPY-SELECT-REGISTRY", Prim_copy_selreg, 2, 2, 0)
+{
+  PRIMITIVE_HEADER (2);
+#ifdef ENABLE_SMP
+  OS_copy_select_registry ((arg_select_registry (1)),
+                          (arg_select_registry (2)));
+  PRIMITIVE_RETURN (UNSPECIFIC);
+#else
+  signal_error_from_primitive (ERR_UNIMPLEMENTED_PRIMITIVE);
+#endif
+}
+
 DEFINE_PRIMITIVE ("TEST-SELECT-REGISTRY", Prim_test_selreg, 4, 4, 0)
 {
   PRIMITIVE_HEADER (4);
index 8bbb260bc939d9fc66c290c00f442f1031e6c946..c60ce906f5ad9ac1de9785da48b5ec9bdd0d6a64 100644 (file)
@@ -538,6 +538,25 @@ OS_select_registry_length (select_registry_t registry)
   return (SR_N_FDS (r));
 }
 
+#ifdef ENABLE_SMP
+void
+OS_copy_select_registry (select_registry_t from, select_registry_t to)
+{
+  struct select_registry_s * f = from;
+  struct select_registry_s * t = to;
+  int fl = SR_LENGTH (f);
+  int tl = SR_LENGTH (t);
+  if (tl < fl)
+    {
+      free (SR_ENTRIES (t));
+      (SR_ENTRIES (t)) = (UX_malloc (SR_BYTES (fl)));
+      (SR_LENGTH (t)) = fl;
+    }
+  memcpy ((SR_ENTRIES (t)), (SR_ENTRIES (f)), (SR_BYTES (SR_N_FDS (f))));
+  (SR_N_FDS (t)) = (SR_N_FDS (f));
+}
+#endif
+
 void
 OS_select_registry_result (select_registry_t registry,
                           unsigned int index,
@@ -717,6 +736,21 @@ OS_select_registry_length (select_registry_t registry)
   return (SR_N_FDS (r));
 }
 
+#ifdef ENABLE_SMP
+void
+OS_copy_select_registry (select_registry_t from, select_registry_t to)
+{
+  struct select_registry_s * f = from;
+  struct select_registry_s * t = to;
+
+  (* (SR_QREADERS (t))) = (* (SR_QREADERS (f)));
+  (* (SR_QWRITERS (t))) = (* (SR_QWRITERS (f)));
+  (* (SR_RREADERS (t))) = (* (SR_RREADERS (f)));
+  (* (SR_RWRITERS (t))) = (* (SR_RWRITERS (f)));
+  (SR_N_FDS (t)) = (SR_N_FDS (r));
+}
+#endif
+
 void
 OS_select_registry_result (select_registry_t registry,
                           unsigned int index,