Allow us to stop server (for memory debugging purposes)
[simpleserver-moved-to-github.git] / SimpleServer.xs
index f3cd24b..44f182c 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $Id: SimpleServer.xs,v 1.25 2004-05-14 04:07:50 adam Exp $ 
+ * $Id: SimpleServer.xs,v 1.28 2004-06-05 07:55:05 adam Exp $ 
  * ----------------------------------------------------------------------
  * 
  * Copyright (c) 2000-2004, Index Data.
@@ -64,8 +64,12 @@ typedef struct {
        SV *esrequest_ref;
        SV *delete_ref;
        SV *scan_ref;
+       NMEM nmem;
+       int stop_flag;  /* is used to stop server prematurely .. */
 } Zfront_handle;
 
+#define ENABLE_STOP_SERVER 0
+
 SV *init_ref = NULL;
 SV *close_ref = NULL;
 SV *sort_ref = NULL;
@@ -118,6 +122,7 @@ int tst_clones(void)
 #endif
 
 int simpleserver_clone(void) {
+#ifdef USE_ITHREADS
      nmem_mutex_enter(simpleserver_mutex);
      if (1)
      {
@@ -135,6 +140,7 @@ int simpleserver_clone(void) {
          }
      }
      nmem_mutex_leave(simpleserver_mutex);
+#endif
      return 0;
 }
 
@@ -611,6 +617,12 @@ int bend_search(void *handle, bend_search_rr *rr)
        {
                av_push(aref, newSVpv(*basenames++, 0));
        }
+#if ENABLE_STOP_SERVER
+       if (rr->num_bases == 1 && !strcmp(rr->basenames[0], "XXstop"))
+       {
+               zhandle->stop_flag = 1;
+       }
+#endif
        href = newHV();         
        hv_store(href, "SETNAME", 7, newSVpv(rr->setname, 0), 0);
        hv_store(href, "REPL_SET", 8, newSViv(rr->replace_set), 0);
@@ -665,9 +677,7 @@ int bend_search(void *handle, bend_search_rr *rr)
        ODR_errstr = (char *)odr_malloc(rr->stream, len + 1);
        strcpy(ODR_errstr, ptr);
        rr->errstring = ODR_errstr;
-/*     ODR_point = (SV *)odr_malloc(rr->stream, sizeof(*point));
-       memcpy(ODR_point, point, sizeof(*point));
-       zhandle->handle = ODR_point;*/
+
        zhandle->handle = point;
        handle = zhandle;
        sv_free(hits);
@@ -1169,7 +1179,9 @@ bend_initresult *bend_init(bend_initrequest *q)
        SV *ver;
        SV *err_str;
        SV *status;
-       Zfront_handle *zhandle =  (Zfront_handle *) xmalloc (sizeof(*zhandle));
+       NMEM nmem = nmem_create();
+       Zfront_handle *zhandle =  (Zfront_handle *) nmem_malloc (nmem,
+                       sizeof(*zhandle));
        STRLEN len;
        int n;
        SV *handle;
@@ -1184,6 +1196,8 @@ bend_initresult *bend_init(bend_initrequest *q)
        ENTER;
        SAVETMPS;
 
+       zhandle->nmem = nmem;
+       zhandle->stop_flag = 0;
        /*q->bend_sort = bend_sort;*/
        if (search_ref)
        {
@@ -1275,15 +1289,11 @@ bend_initresult *bend_init(bend_initrequest *q)
        sv_free(err_str);
        r->handle = zhandle;
        ptr = SvPV(id, len);
-       q->implementation_id = (char *)xmalloc(len + 1);
-       strcpy(q->implementation_id, ptr);
+       q->implementation_id = nmem_strdup(nmem, ptr);
        ptr = SvPV(name, len);
-       q->implementation_name = (char *)xmalloc(len + 1);
-       strcpy(q->implementation_name, ptr);
-/*     q->implementation_name = SvPV(name, len);*/
+       q->implementation_name = nmem_strdup(nmem, ptr);
        ptr = SvPV(ver, len);
-       q->implementation_version = (char *)xmalloc(len + 1);
-       strcpy(q->implementation_version, ptr);
+       q->implementation_version = nmem_strdup(nmem, ptr);
        
        return r;
 }
@@ -1295,7 +1305,7 @@ void bend_close(void *handle)
        Zfront_handle *zhandle = (Zfront_handle *)handle;
        SV **temp;
        CV* handler_cv = 0;
-
+       int stop_flag = 0;
 
        if (close_ref)
        {
@@ -1320,9 +1330,12 @@ void bend_close(void *handle)
                FREETMPS;
                LEAVE;
        }
-       xfree(handle);
+       stop_flag = zhandle->stop_flag;
+       nmem_destroy(zhandle->nmem);
        simpleserver_free();
-       
+
+       if (stop_flag)
+               exit(0);
        return;
 }