]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-tcl/tcl_close.c
#unifdef -DSLAP_NVALUES_ON_DISK
[openldap] / servers / slapd / back-tcl / tcl_close.c
index 007bb6c2b61a2f0c66f58ce9350874407c5d992b..4fb893a51e8d29b95f6d74752b4537cfe777a9f4 100644 (file)
@@ -1,5 +1,5 @@
-/*
- * close.c - tcl close routines
+/* $OpenLDAP$ */
+/* close.c - tcl close routines
  *
  * Copyright 1999, Ben Collins <bcollins@debian.org>, All rights reserved.
  *
@@ -21,36 +21,62 @@ tcl_back_close (
        BackendInfo * bi
 )
 {
-       return 0;
+       Tcl_DeleteInterp (global_i->interp);
+
+       return (0);
 }
 
 int
-tcl_back_destroy(
-               BackendInfo *bi
+tcl_back_destroy (
+       BackendInfo * bi
 )
 {
-               ldap_pvt_thread_mutex_destroy( &tcl_interpreter_mutex );
+       free (global_i->interp);
+       free (global_i);
+       ldap_pvt_thread_mutex_destroy (&tcl_interpreter_mutex);
 
-               return 0;
+       return (0);
 }
 
 int
-tcl_back_db_destroy(
-               BackendDB *bd
+tcl_back_db_close (
+       BackendDB * bd
 )
 {
        struct tclinfo *ti = (struct tclinfo *) bd->be_private;
        struct i_info *ti_tmp;
 
+       /* Disable the interp and associated struct */
        ti->ti_ii->count--;
-       if (!ti->ti_ii->count && strcasecmp("default", ti->ti_ii->name)) {
+       if (!ti->ti_ii->count && strcasecmp ("default", ti->ti_ii->name)) {
                /* no more db's using this and it's not the default */
-               for(ti_tmp = global_i; ti_tmp->next != ti->ti_ii; ti_tmp = ti_tmp->next)
-                       ;
+               for (ti_tmp = global_i; ti_tmp->next != ti->ti_ii; ti_tmp
+                       = ti_tmp->next);
+               /* This bypasses this interp struct in the global hash */
                ti_tmp->next = ti->ti_ii->next;
-               free(ti->ti_ii);
-               free(ti);
+               Tcl_DeleteInterp (ti->ti_ii->interp);
+       }
+       return (0);
+}
+
+int
+tcl_back_db_destroy (
+       BackendDB * bd
+)
+{
+       struct tclinfo *ti = (struct tclinfo *) bd->be_private;
+
+       /*
+        * Now free up the allocated memory used
+        */
+       ti->ti_ii->count--;
+       if (!ti->ti_ii->count && strcasecmp ("default", ti->ti_ii->name)) {
+               free (ti->ti_ii->interp);
+               free (ti->ti_ii);
+               free (ti);
        }
-       free( bd->be_private );
+       free (bd->be_private);
        bd->be_private = NULL;
+
+       return (0);
 }