Added a signal handler to delete temp casefiles on SIGINT and SIGQUIT.
[pspp-builds.git] / src / casefile.c
index 6d74e8e286ee3a8451b90db6951fb2f7599789b1..242fc385c0ca7890e3017d3c239fdf72ebad6f08 100644 (file)
@@ -32,6 +32,7 @@
 #include "misc.h"
 #include "settings.h"
 #include "var.h"
+#include "signal.h"
 
 #ifdef HAVE_VALGRIND_VALGRIND_H
 #include <valgrind/valgrind.h>
@@ -90,6 +91,13 @@ struct casereader
     struct ccase c;                     /* Current case. */
   };
 
+/* Return the case number of the current case */
+unsigned long
+casereader_cnum(const struct casereader *r)
+{
+  return r->case_idx;
+}
+
 /* Doubly linked list of all casefiles. */
 static struct casefile *casefiles;
 
@@ -217,6 +225,7 @@ casefile_sleep (const struct casefile *cf_)
 
   casefile_mode_reader (cf);
   casefile_to_disk (cf);
+  flush_buffer (cf);
 
   if (cf->fd != -1) 
     {
@@ -437,13 +446,14 @@ casefile_get_reader (const struct casefile *cf_)
   cf->mode = READ;
 
   reader = xmalloc (sizeof *reader);
-  reader->cf = cf;
   reader->next = cf->readers;
   if (cf->readers != NULL)
     reader->next->prev = reader;
-  reader->prev = NULL;
   cf->readers = reader;
+  reader->prev = NULL;
+  reader->cf = cf;
   reader->case_idx = 0;
+  reader->destructive = 0;
   reader->fd = -1;
   reader->buffer = NULL;
   reader->buffer_pos = 0;
@@ -726,6 +736,8 @@ register_atexit (void)
   if (!registered) 
     {
       registered = 1;
+      signal (SIGQUIT, (sighandler_t) exit_handler);
+      signal (SIGINT,  (sighandler_t) exit_handler);
       atexit (exit_handler);
     }
 }
@@ -776,7 +788,7 @@ cmd_debug_casefile (void)
   if (token != '.')
     return lex_end_of_command ();
     
-  for (pattern = 0; pattern < 5; pattern++) 
+  for (pattern = 0; pattern < 6; pattern++) 
     {
       const size_t *size;
 
@@ -796,7 +808,6 @@ cmd_debug_casefile (void)
 static void
 test_casefile (int pattern, size_t value_cnt, size_t case_cnt) 
 {
-  int zero = 0;
   struct casefile *cf;
   struct casereader *r1, *r2;
   struct ccase c;
@@ -805,13 +816,18 @@ test_casefile (int pattern, size_t value_cnt, size_t case_cnt)
 
   rng = gsl_rng_alloc (gsl_rng_mt19937);
   cf = casefile_create (value_cnt);
+  if (pattern == 5)
+    casefile_to_disk (cf);
   for (i = 0; i < case_cnt; i++)
     write_random_case (cf, i);
+  if (pattern == 5)
+    casefile_sleep (cf);
   r1 = casefile_get_reader (cf);
   r2 = casefile_get_reader (cf);
   switch (pattern) 
     {
     case 0:
+    case 5:
       for (i = 0; i < case_cnt; i++) 
         {
           read_and_verify_random_case (cf, r1, i);