]> code.delx.au - gnu-emacs/commitdiff
*** empty log message ***
authorFred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
Fri, 18 Feb 1994 13:24:41 +0000 (13:24 +0000)
committerFred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
Fri, 18 Feb 1994 13:24:41 +0000 (13:24 +0000)
lwlib/lwlib-Xlw.c
lwlib/lwlib.c

index c48d6614b2873700e5c58e586b92775424957dc7..e07ee19c7bfcb302f68932f5267449ff9df7328b 100644 (file)
@@ -71,13 +71,14 @@ pick_hook (w, client_data, call_data)
 }
 
 \f/* creation functions */
+
 static Widget
 xlw_create_menubar (instance)
      widget_instance* instance;
 {
   Widget widget;
 
-  widget_value *tem = (widget_value *) XtMalloc (sizeof (widget_value));
+  widget_value *tem = malloc_widget_value (); 
 
   /* _XtCreate is freeing the object we passed,
      so make a copy that we free later.  */
@@ -89,7 +90,7 @@ xlw_create_menubar (instance)
                      XtNmenu, tem,
                      0);
 
-  XtFree (tem);
+  free_widget_value (tem);
 
   XtAddCallback (widget, XtNopen, pre_hook, (XtPointer)instance);
   XtAddCallback (widget, XtNselect, pick_hook, (XtPointer)instance);
@@ -106,7 +107,7 @@ xlw_create_popup_menu (instance)
   
   Widget widget;
 
-  widget_value *tem = (widget_value *) XtMalloc (sizeof (widget_value));
+  widget_value *tem = malloc_widget_value ();
 
   /* _XtCreate is freeing the object we passed,
      so make a copy that we free later.  */
@@ -119,7 +120,7 @@ xlw_create_popup_menu (instance)
                             XtNhorizontal, False,
                             0);
 
-  XtFree (tem);
+  free_widget_value (tem);
 
   XtAddCallback (widget, XtNselect, pick_hook, (XtPointer)instance);
 
index e6af711e6977a8b5b47858071ca199e8e3d34e35..c2f2f05cba5c92e54215d6ab65d1043ee0f64131 100644 (file)
@@ -112,6 +112,8 @@ safe_free_str (s)
 }
 
 static widget_value *widget_value_free_list = 0;
+static int malloc_cpt = 0;
+static int malloc_cpt_id = 0;
 
 widget_value *
 malloc_widget_value ()
@@ -126,6 +128,7 @@ malloc_widget_value ()
   else
     {
       wv = (widget_value *) malloc (sizeof (widget_value));
+      malloc_cpt++;
     }
   memset (wv, 0, sizeof (widget_value));
   return wv;
@@ -140,8 +143,24 @@ free_widget_value (wv)
 {
   if (wv->free_list)
     abort ();
-  wv->free_list = widget_value_free_list;
-  widget_value_free_list = wv;
+
+  if (malloc_cpt > 20)
+    {
+      /* When the number of already allocated cells is too big,
+        We free it.  */
+      malloc_cpt_id++;
+      free (wv);
+      if (malloc_cpt_id > 20)
+       {
+         malloc_cpt_id = 0;
+         malloc_cpt = 0;
+       }
+    }
+  else
+    {
+      wv->free_list = widget_value_free_list;
+      widget_value_free_list = wv;
+    }
 }
 
 static void