[Top][All Lists]
[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.
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- more leaks fixed,
Arnaud Desitter <=