ddd
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

more leaks fixed


From: Arnaud Desitter
Subject: more leaks fixed
Date: Wed, 26 Sep 2001 14:39:49 +0100

Hi,

Here is a patch against the CVS repository that fixes several defects.
I add a description of the changes along with the related files.


o fixed a leak in comm-manag.C. The correction is safe.
  Also fixed a typo in comm-manag.C.
  [DataDisp.C, GDBAgent.C, GDBAgent.h, comm-manag.C ]
o fixed leaks in resources converter.
  The code should be correct with respect to the X Intrinsics
documentation.
  However, the destructors are never called on the Sun/Solaris 2.6 box 
  I used. I don't know why.
  [converters.C, HelpCB.C]
o some clean-up.
  Also, in SourceView.C, position variables are now set in all cases.
  [SourceView.C, fortranize.C]

This patch fixes the last big memory leaks left in ddd.

Cheers,
Arnaud

Index: ddd/DataDisp.C
===================================================================
RCS file: /cvsroot/ddd/ddd/ddd/DataDisp.C,v
retrieving revision 1.390
diff -u -r1.390 DataDisp.C
--- ddd/DataDisp.C      2001/07/30 19:45:32     1.390
+++ ddd/DataDisp.C      2001/09/26 13:21:49
@@ -4420,8 +4420,10 @@
     info.prompt  = do_prompt;
     info.cmds    = cmds;
 
+    bool info_registered;
     bool ok = gdb->send_qu_array(cmds, dummy, cmds.size(), 
-                                refresh_displayOQAC, (void *)&info);
+                                refresh_displayOQAC, (void *)&info,
+                                info_registered);
 
     if (!ok || cmds.size() == 0)
     {
@@ -6440,8 +6442,10 @@
            info.verbose = false;
            info.prompt  = false;
            info.cmds    = cmds;
+           bool info_registered;
            ok = gdb->send_qu_array(cmds, dummy, cmds.size(), 
-                                   refresh_displayOQAC, (void *)&info);
+                                   refresh_displayOQAC, (void *)&info,
+                                   info_registered);
 
            sent = cmds.size() > 0;
        }
Index: ddd/GDBAgent.C
===================================================================
RCS file: /cvsroot/ddd/ddd/ddd/GDBAgent.C,v
retrieving revision 1.221
diff -u -r1.221 GDBAgent.C
--- ddd/GDBAgent.C      2001/07/30 19:45:32     1.221
+++ ddd/GDBAgent.C      2001/09/26 13:21:50
@@ -438,14 +438,17 @@
                           const VoidArray& qu_datas,
                           int      qu_count,
                           OQACProc on_qu_array_completion,
-                          void*    qa_data)
+                          void*    qa_data,
+                          bool&    qa_data_registered)
 {
+    qa_data_registered = false;
     state = BusyOnInitialCmds;
 
     if (qu_count > 0) {
        questions_waiting = true;
        init_qu_array(cmds, qu_datas, qu_count, 
                      on_qu_array_completion, qa_data);
+        qa_data_registered = true;
     }
 
     do_start(on_answer, on_answer_completion, user_data);
@@ -516,9 +519,11 @@
                                   int      qu_count,
                                   OQACProc on_qu_array_completion,
                                   void*    qa_data,
+                                  bool& qa_data_registered,
                                   string   user_cmd,
                                   void* user_data)
 {
+    qa_data_registered = false;
     if (state != ReadyWithPrompt) 
        return false;
 
@@ -529,6 +534,7 @@
        questions_waiting = true;
        init_qu_array(cmds, qu_datas, qu_count,
                      on_qu_array_completion, qa_data);
+        qa_data_registered = true;
     }
 
     // Process command
@@ -547,8 +553,10 @@
                              const VoidArray& qu_datas,
                              int      qu_count,
                              OQACProc on_qu_array_completion,
-                             void*    qa_data)
+                             void*    qa_data,
+                             bool& qa_data_registered)
 {
+    qa_data_registered = false;
     if (qu_count == 0)
        return true;
     if (state != ReadyWithPrompt)
@@ -559,6 +567,7 @@
     callHandlers(ReadyForCmd, (void *)false);
 
     init_qu_array(cmds, qu_datas, qu_count, on_qu_array_completion,
qa_data);
+    qa_data_registered = true;
     
     // Send first question
     write_cmd(cmd_array[0]);
Index: ddd/GDBAgent.h
===================================================================
RCS file: /cvsroot/ddd/ddd/ddd/GDBAgent.h,v
retrieving revision 1.124
diff -u -r1.124 GDBAgent.h
--- ddd/GDBAgent.h      2001/01/26 09:24:09     1.124
+++ ddd/GDBAgent.h      2001/09/26 13:21:50
@@ -249,7 +249,8 @@
                     const VoidArray& user_datas,
                     int      qu_count,
                     OQACProc on_qu_array_completion,
-                    void*    qa_data);
+                    void*    qa_data,
+                    bool&    qa_data_registered);
 
     // true iff command was sent.
     // If user_data == 0, _user_data remains unchanged.
@@ -270,6 +271,7 @@
                             int      qu_count,
                             OQACProc on_qu_array_completion,
                             void*    qa_data,
+                            bool&    qa_data_registered,
                             string user_cmd,
                             void* user_data = 0);
 
@@ -277,7 +279,8 @@
                        const VoidArray& qu_datas,
                        int      qu_count,
                        OQACProc on_qu_array_completion,
-                       void*    qa_data);
+                       void*    qa_data,
+                       bool&    qa_data_registered);
 
 
     // Resources
Index: ddd/HelpCB.C
===================================================================
RCS file: /cvsroot/ddd/ddd/ddd/HelpCB.C,v
retrieving revision 1.124
diff -u -r1.124 HelpCB.C
--- ddd/HelpCB.C        2001/07/30 19:45:32     1.124
+++ ddd/HelpCB.C        2001/09/26 13:21:51
@@ -2452,8 +2452,12 @@
        }
     }
 
-    XmStringFree(tip_values.tipString);
-    XmStringFree(doc_values.documentationString);
+    // CvtStringToXmString and friends should be responsible of
+    // the memory management.
+    // XmStringFree(tip_values.tipString);
+    // tip_values.tipString = 0;
+    // XmStringFree(doc_values.documentationString);
+    // doc_values.documentationString = 0;
 }
 
 
Index: ddd/SourceView.C
===================================================================
RCS file: /cvsroot/ddd/ddd/ddd/SourceView.C,v
retrieving revision 1.466
diff -u -r1.466 SourceView.C
--- ddd/SourceView.C    2001/07/30 19:45:32     1.466
+++ ddd/SourceView.C    2001/09/26 13:21:53
@@ -463,7 +463,7 @@
     if (eol < 0)
        eol = s.length();
 
-    string first_line = ((string&)s).at(pos, eol - pos);
+    const string first_line = ((string&)s).at(pos, eol - pos);
     int i = 0;
     while (i < int(first_line.length()) && isspace(first_line[i]))
        i++;
@@ -562,7 +562,7 @@
                                   XtPointer client_data,
                                   XtPointer)
 {
-    string address = *((string *)client_data);
+    const string address = *((const string *)client_data);
     create_bp(address, w);
 }
 
@@ -570,7 +570,7 @@
                                        XtPointer client_data,
                                        XtPointer)
 {
-    string address = *((string *)client_data);
+    const string address = *((const string *)client_data);
     create_temp_bp(address, w);
 }
 
@@ -791,7 +791,7 @@
                                           XtPointer client_data,
                                           XtPointer)
 {
-    string address = *((string *)client_data);
+    const string address = *((const string *)client_data);
     temp_n_cont(address, w);
 }
 
@@ -846,7 +846,7 @@
                                     XtPointer client_data,
                                     XtPointer)
 {
-    string address = *((string *)client_data);
+    const string address = *((const string *)client_data);
     move_pc(address, w);
 }
 
@@ -1369,7 +1369,7 @@
                                     XtPointer client_data,
                                     XtPointer)
 {
-    string* word_ptr = (string*)client_data;
+    const string* word_ptr = (const string*)client_data;
     create_bp(fortranize(*word_ptr, true), w);
 }
 
@@ -1377,7 +1377,7 @@
                                     XtPointer client_data, 
                                     XtPointer)
 {
-    string* word_ptr = (string*)client_data;
+    const string* word_ptr = (const string*)client_data;
     clear_bp(fortranize(*word_ptr, true), w);
 }
 
@@ -1389,7 +1389,7 @@
                                     XtPointer client_data, 
                                     XtPointer)
 {
-    string* word_ptr = (string*)client_data;
+    const string* word_ptr = (const string*)client_data;
     assert(word_ptr->length() > 0);
 
     gdb_command(gdb->print_command(fortranize(*word_ptr), false), w);
@@ -1398,7 +1398,7 @@
 void SourceView::text_popup_print_refCB (Widget w, 
                                         XtPointer client_data, XtPointer)
 {
-    string* word_ptr = (string*)client_data;
+    const string* word_ptr = (const string*)client_data;
     assert(word_ptr->length() > 0);
 
     gdb_command(gdb->print_command(deref(fortranize(*word_ptr)),
false), w);
@@ -1411,7 +1411,7 @@
                                     XtPointer client_data, 
                                     XtPointer)
 {
-    string* word_ptr = (string*)client_data;
+    const string* word_ptr = (const string*)client_data;
     assert(word_ptr->length() > 0);
 
     gdb_command(gdb->watch_command(fortranize(*word_ptr)), w);
@@ -1420,7 +1420,7 @@
 void SourceView::text_popup_watch_refCB (Widget w, 
                                         XtPointer client_data, XtPointer)
 {
-    string* word_ptr = (string*)client_data;
+    const string* word_ptr = (const string*)client_data;
     assert(word_ptr->length() > 0);
 
     gdb_command(gdb->watch_command(deref(fortranize(*word_ptr))), w);
@@ -1431,7 +1431,7 @@
 //
 void SourceView::text_popup_dispCB (Widget w, XtPointer client_data,
XtPointer)
 {
-    string* word_ptr = (string*)client_data;
+    const string* word_ptr = (const string*)client_data;
     assert(word_ptr->length() > 0);
 
     gdb_command("graph display " + fortranize(*word_ptr), w);
@@ -1440,7 +1440,7 @@
 void SourceView::text_popup_disp_refCB (Widget w, 
                                        XtPointer client_data, XtPointer)
 {
-    string* word_ptr = (string*)client_data;
+    const string* word_ptr = (const string*)client_data;
     assert(word_ptr->length() > 0);
 
     gdb_command("graph display " + deref(fortranize(*word_ptr)), w);
@@ -1451,7 +1451,7 @@
 void SourceView::text_popup_whatisCB (Widget w, XtPointer client_data, 
                                      XtPointer)
 {
-    string* word_ptr = (string*)client_data;
+    const string* word_ptr = (const string*)client_data;
     assert(word_ptr->length() > 0);
 
     gdb_command(gdb->whatis_command(fortranize(*word_ptr)), w);
@@ -1461,7 +1461,7 @@
 //
 void SourceView::text_popup_lookupCB (Widget, XtPointer client_data,
XtPointer)
 {
-    string* word_ptr = (string*)client_data;
+    const string* word_ptr = (const string*)client_data;
     lookup(fortranize(*word_ptr, true));
 }
 
@@ -1598,7 +1598,7 @@
                                  XtPointer client_data, 
                                  XtPointer call_data)
 {
-    string& text = current_text(text_w);
+    const string& text = current_text(text_w);
     if (text == "")
        return;
 
@@ -1863,7 +1863,7 @@
 // Show position POS in TEXT_W, scrolling nicely
 void SourceView::ShowPosition(Widget text_w, XmTextPosition pos, bool
fromTop)
 {
-    string& text = current_text(text_w);
+    const string& text = current_text(text_w);
     if (text.length() == 0)
        return;                 // No position to show
 
@@ -3156,7 +3156,7 @@
 {
     startpos = endpos = pos;
 
-    string& text = current_text(text_w);
+    const string& text = current_text(text_w);
 
     XmTextPosition line_pos = pos;
     if (line_pos < XmTextPosition(text.length()))
@@ -3238,9 +3238,13 @@
                                   XmTextPosition& startpos,
                                   XmTextPosition& endpos)
 {
-    string& text = current_text(text_w);
+    const string& text = current_text(text_w);
     if (text == "")
+      {
+        startpos = 0;
+        endpos = 0;
        return "";
+      }
 
     if (!XmTextGetSelectionPosition(text_w, &startpos, &endpos)
        || pos < startpos
@@ -7822,7 +7826,7 @@
     if (!ok)
        return 0;
 
-    string& text = current_text(text_w);
+    const string& text = current_text(text_w);
     XmTextPosition second = text.index('\n', top) + 1;
     Position second_x, second_y;
     ok = XmTextPosToXY(text_w, second, &second_x, &second_y);
Index: ddd/comm-manag.C
===================================================================
RCS file: /cvsroot/ddd/ddd/ddd/comm-manag.C,v
retrieving revision 1.286
diff -u -r1.286 comm-manag.C
--- ddd/comm-manag.C    2001/07/30 19:45:32     1.286
+++ ddd/comm-manag.C    2001/09/26 13:21:54
@@ -744,6 +744,7 @@
     while (dummy.size() < cmds.size())
        dummy += (void *)0;
 
+    bool extra_registered;
     gdb->start_plus (partial_answer_received,
                     command_completed,
                     cmd_data,
@@ -751,8 +752,12 @@
                     dummy,
                     cmds.size(),
                     extra_completed,
-                    (void *)extra_data);
+                    (void *)extra_data,
+                    extra_registered);
 
+    if (!extra_registered)
+      delete extra_data;
+
     // Enqueue restart and settings commands.  Since we're starting up
     // and don't care for detailed diagnostics, we allow the GDB
     // `source' command.
@@ -1013,7 +1018,6 @@
     command_was_cancelled = false;
     bool next_input_goes_to_debuggee = false;
 
-    // LEAK: Check whether EXTRA_DATA is always deleted
     ExtraData *extra_data = new ExtraData;
     extra_data->command       = cmd;
     extra_data->user_callback = extra_callback;
@@ -1839,18 +1843,23 @@
     extra_data->extra_commands = cmds;
 
     // Send commands
+    bool extra_registered;
     bool send_ok = gdb->send_user_cmd_plus(cmds, dummy, cmds.size(),
                                           extra_completed, (void*)extra_data,
+                                          extra_registered,
                                           cmd, (void *)cmd_data);
-
+    if (!extra_registered)
+      {
+       delete extra_data; 
+      }
+    
     if (!send_ok)
-    {
+      {
        // Deallocate resources
-       delete extra_data;
        delete cmd_data;
 
        post_gdb_busy(origin);
-    }
+      }
 }
 
 
@@ -3192,9 +3201,9 @@
 
     if (extra_data->refresh_user)
     {
-       StringArray answers(((string *)answers) + qu_count,
+       StringArray answers_(((string *)answers) + qu_count,
                            extra_data->n_refresh_user);
-       data_disp->process_user(answers);
+       data_disp->process_user(answers_);
        qu_count += extra_data->n_refresh_user;
     }
 
Index: ddd/converters.C
===================================================================
RCS file: /cvsroot/ddd/ddd/ddd/converters.C,v
retrieving revision 1.47
diff -u -r1.47 converters.C
--- ddd/converters.C    2001/07/30 19:45:32     1.47
+++ ddd/converters.C    2001/09/26 13:21:54
@@ -183,6 +183,25 @@
         return True;                                    \
     } while(0)
 
+#define donef(type,value,failure) \
+    do {                                                \
+        if (toVal->addr != 0) {                         \
+            if (toVal->size < sizeof(type)) {           \
+                toVal->size = sizeof(type);             \
+                failure;                                \
+                return False;                           \
+            }                                           \
+            *(type *)(toVal->addr) = (value);           \
+        }                                               \
+        else {                                          \
+            static type static_val;                     \
+            static_val = (value);                       \
+            toVal->addr = (XPointer)&static_val;        \
+        }                                               \
+                                                        \
+        toVal->size = sizeof(type);                     \
+        return True;                                    \
+    } while(0)
 
 // Return string of value.  If STRIP is set, strip leading and
 // trailing whitespace.
@@ -463,10 +482,15 @@
 }
 
 
-static void XmStringFreeCB(XtPointer client_data, XtIntervalId *)
+static void CvtStringToXmStringDestroy(XtAppContext  /* app */,
+                                      XrmValue*     to,
+                                      XtPointer     /* converter_data */,
+                                      XrmValue*     /* args */,
+                                      Cardinal*     /* num_args */
+                                      )
 {
-    XmString xs = (XmString)client_data;
-    XmStringFree(xs);
+  XmStringFree(*(XmString*)to->addr);
+  return;
 }
 
 // Convert String to XmString, using `@' for font specs: address@hidden TEXT'
@@ -588,17 +612,7 @@
        return False;
     }
 
-#if 0
-    // TARGET is no longer being referenced after its use.  Be sure to
-    // free it at the next occasion.
-    XtAppAddTimeOut(XtDisplayToApplicationContext(display),
-                   0, XmStringFreeCB, (XtPointer)target);
-#else
-    // It seems this applies to all Motif implementations...
-    (void) XmStringFreeCB;     // Use it
-#endif
-    
-    done(XmString, target);
+    donef(XmString,target,XmStringFree(target));
 }
 
 
@@ -662,6 +676,18 @@
     done(XFontStruct *, font);
 }
 
+static void
+CvtStringToXmFontListDestroy(XtAppContext  /* app */,
+                            XrmValue*     to,
+                            XtPointer     /* converter_data */,
+                            XrmValue*     /* args */,
+                            Cardinal*     /* num_args */
+                            )
+{   
+  XmFontListFree( *((XmFontList *) to->addr)) ;
+  return ;
+}
+
 // Convert String to FontList, relacing address@hidden@' by symbolic font
specs.
 static Boolean CvtStringToXmFontList(Display *display, 
                                     XrmValue *, Cardinal *, 
@@ -743,7 +769,7 @@
        return False;
     }
     
-    done(XmFontList, target);
+    donef(XmFontList,target,XmFontListFree(XmFontList));
 }
 
 #endif
@@ -1025,14 +1051,14 @@
 
     // String -> XmString
     XtSetTypeConverter(XmRString, XmRXmString, CvtStringToXmString,
-                      XtConvertArgList(0), 0, XtCacheNone,
-                      XtDestructor(0));
+                      XtConvertArgList(0), 0, (XtCacheNone | XtCacheRefCount),
+                      CvtStringToXmStringDestroy);
 
 #if OWN_FONT_CONVERTERS
     // String -> FontList
     XtSetTypeConverter(XmRString, XmRFontList, CvtStringToXmFontList,
-                      XtConvertArgList(0), 0, XtCacheAll,
-                      XtDestructor(0));
+                      XtConvertArgList(0), 0, (XtCacheAll | XtCacheRefCount),
+                      CvtStringToXmFontList);
 
     // String -> FontStruct
     XtSetTypeConverter(XmRString, XtRFontStruct, CvtStringToFontStruct,
Index: ddd/fortranize.C
===================================================================
RCS file: /cvsroot/ddd/ddd/ddd/fortranize.C,v
retrieving revision 1.8
diff -u -r1.8 fortranize.C
--- ddd/fortranize.C    1999/08/19 11:28:36     1.8
+++ ddd/fortranize.C    2001/09/26 13:21:54
@@ -72,7 +72,7 @@
 
 // Return ID in `fortranized' form -- that is, in lower/upper case and
 // with appended `_'.  If GLOBALS_FIRST is set, try global symbols
first.
-string _fortranize(const string& id, bool globals_first)
+static string _fortranize(const string& id, bool globals_first)
 {
     if (globals_first)
     {

_____________________________________________________________________
This message has been checked for all known viruses by Star Internet
delivered through the MessageLabs Virus Scanning Service. For further
information visit http://www.star.net.uk/stats.asp or alternatively call
Star Internet for details on the Virus Scanning Service.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]