Function nmem_exit calls oid_exit (when reference is 0).
[yaz-moved-to-github.git] / util / oid.c
index a37d65a..d5c193d 100644 (file)
@@ -3,7 +3,17 @@
  * See the file LICENSE for details.
  *
  * $Log: oid.c,v $
- * Revision 1.45  2001-05-16 07:25:59  adam
+ * Revision 1.48  2001-09-27 12:09:18  adam
+ * Function nmem_exit calls oid_exit (when reference is 0).
+ *
+ * Revision 1.47  2001/09/24 21:51:55  adam
+ * New Z39.50 OID utilities: yaz_oidval_to_z3950oid, yaz_str_to_z3950oid
+ * and yaz_z3950oid_to_str.
+ *
+ * Revision 1.46  2001/06/26 14:11:27  adam
+ * Added MUTEX functions for NMEM module (used by OID utility).
+ *
+ * Revision 1.45  2001/05/16 07:25:59  adam
  * Modified oid_ent_to_oid so that if proto is general, then class
  * is ignored (only oid value is compared).
  *
@@ -190,11 +200,13 @@ struct oident_list {
 static struct oident_list *oident_table = NULL;
 static int oid_value_dynamic = VAL_DYNAMIC;
 static int oid_init_flag = 0;
+static NMEM_MUTEX oid_mutex = 0;
+static NMEM oid_nmem = 0;
 
 /*
  * OID database
  */
-static oident oids[] =
+static oident standard_oids[] =
 {
     /* General definitions */
     {PROTO_GENERAL, CLASS_TRANSYN, VAL_BER,          {2,1,1,-1},
@@ -584,28 +596,32 @@ void oid_transfer (struct oident *oident)
 
 void oid_init (void)
 {
-    if (oid_init_flag)
-       return;
-    /* oid_transfer is thread safe, so there's nothing wrong in having
-       two threads calling it simultaniously. On the other hand
-       no thread may exit oid_init before all OID's bave been
-       transferred - which is why checked is set after oid_transfer... 
-    */
-    oid_transfer (oids);
-    oid_init_flag = 1;
+    if (oid_init_flag == 0)
+    {
+       /* oid_transfer is thread safe, so there's nothing wrong in having
+          two threads calling it simultaniously. On the other hand
+          no thread may exit oid_init before all OID's bave been
+          transferred - which is why checked is set after oid_transfer... 
+       */
+       nmem_mutex_create (&oid_mutex);
+       nmem_mutex_enter (oid_mutex);
+       if (!oid_nmem)
+           oid_nmem = nmem_create ();
+       nmem_mutex_leave (oid_mutex);
+       oid_transfer (standard_oids);
+       oid_init_flag = 1;
+    }
 }
 
 void oid_exit (void)
 {
-    while (oident_table)
+    if (oid_init_flag)
     {
-       struct oident_list *this_p = oident_table;
-       oident_table = oident_table->next;
-
-       xfree (this_p->oident.desc);
-       xfree (this_p);
+        oid_init_flag = 0;
+        nmem_mutex_destroy (&oid_mutex);
+        nmem_destroy (oid_nmem);
+        oid_nmem = 0;
     }
-    oid_init_flag = 0;
 }
 
 static struct oident *oid_getentbyoid_x(int *o)
@@ -678,13 +694,14 @@ struct oident *oid_addent (int *oid, enum oid_proto proto,
 {
     struct oident *oident;
 
-    nmem_critical_enter ();
+    nmem_mutex_enter (oid_mutex);
     oident = oid_getentbyoid_x (oid);
     if (!oident)
     {
        char desc_str[200];
        struct oident_list *oident_list;
-       oident_list = (struct oident_list *) xmalloc (sizeof(*oident_list));
+       oident_list = (struct oident_list *)
+           nmem_malloc (oid_nmem, sizeof(*oident_list));
        oident = &oident_list->oident;
        oident->proto = proto;
        oident->oclass = oclass;
@@ -698,8 +715,7 @@ struct oident *oid_addent (int *oid, enum oid_proto proto,
                sprintf (desc_str+strlen(desc_str), ".%d", oid[i]);
            desc = desc_str;
        }
-       oident->desc = (char *) xmalloc (strlen(desc)+1);
-       strcpy (oident->desc, desc);
+       oident->desc = nmem_strdup (oid_nmem, desc);
        if (value == VAL_DYNAMIC)
            oident->value = (enum oid_value) (++oid_value_dynamic);
        else
@@ -708,7 +724,7 @@ struct oident *oid_addent (int *oid, enum oid_proto proto,
        oident_list->next = oident_table;
        oident_table = oident_list;
     }
-    nmem_critical_leave ();
+    nmem_mutex_leave (oid_mutex);
     return oident;
 }