nobody at rubyforge.org
2007-May-22 21:40 UTC
[Wxruby-development] [1032] trunk/wxruby2/swig: Preserve Sizers associated with Windows from GC; fix several sample
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type"
content="text/html; charset=utf-8" /><style
type="text/css"><!--
#msg dl { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:'':'';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer { font-family:
verdana,arial,helvetica,sans-serif; font-size: 10pt; }
#msg dl a { font-weight: bold}
#msg dl a:link { color:#fc3; }
#msg dl a:active { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;
font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fc0 solid; padding:
6px; }
#msg ul, pre { overflow: auto; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid;
padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family:
verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch
.binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<title>[1032] trunk/wxruby2/swig: Preserve Sizers associated with Windows
from GC; fix several sample</title>
</head>
<body>
<div id="msg">
<dl>
<dt>Revision</dt> <dd>1032</dd>
<dt>Author</dt> <dd>brokentoy</dd>
<dt>Date</dt> <dd>2007-05-22 17:40:09 -0400 (Tue, 22 May
2007)</dd>
</dl>
<h3>Log Message</h3>
<pre>Preserve Sizers associated with Windows from GC; fix several sample
crashes on resizing.</pre>
<h3>Modified Paths</h3>
<ul>
<li><a
href="#trunkwxruby2swigmemory_managementi">trunk/wxruby2/swig/memory_management.i</a></li>
<li><a
href="#trunkwxruby2swigwxi">trunk/wxruby2/swig/wx.i</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkwxruby2swigmemory_managementi"></a>
<div class="modfile"><h4>Modified:
trunk/wxruby2/swig/memory_management.i (1031 => 1032)</h4>
<pre class="diff"><span>
<span class="info">---
trunk/wxruby2/swig/memory_management.i        2007-05-22
17:21:51 UTC (rev 1031)
+++
trunk/wxruby2/swig/memory_management.i        2007-05-22
21:40:09 UTC (rev 1032)
</span><span class="lines">@@ -22,6 +22,7 @@
</span><span class="cx"> // This is implemented in
swig/wx.i
</span><span class="cx"> %{
</span><span class="cx"> extern void GcNullFreeFunc(void
*);
</span><ins>+extern void GC_mark_wxWindow(void *);
</ins><span class="cx"> %}
</span><span class="cx">
</span><span class="cx"> // Macro definitions.
</span><span class="lines">@@ -33,27 +34,39 @@
</span><span class="cx"> %feature("freefunc")
kls "GcNullFreeFunc";
</span><span class="cx"> %enddef
</span><span class="cx">
</span><del>-// Strategy for windows that aren''t top-level
windows.
-// Here, the C++ objects are destroyed automatically by WxWidgets when the
-// frame that contains them is closed and destroyed
</del><ins>+// Strategy for windows that aren''t top-level
windows. Here, the C++
+// objects are destroyed automatically by WxWidgets when the frame that
+// contains them is closed and destroyed.
</ins><span class="cx"> %define GC_MANAGE_AS_WINDOW(kls)
</span><span class="cx"> GC_NEVER(kls);
</span><ins>+
+// Any sizer associated with the frame will be preserved by the default
+// function. If subclasse of Wx::Window need to implement their own
+// markfuncs (eg controls with ItemData), they probably need to call
+// this function in their own mark routine if they may have a sizer
+// associated with them.
+%feature("markfunc") kls "GC_mark_wxWindow";
</ins><span class="cx"> %enddef
</span><span class="cx">
</span><span class="cx"> // Strategy for top-level frames
- these are destroyed automatically.
</span><span class="cx"> %define GC_MANAGE_AS_FRAME(kls)
</span><span class="cx"> GC_NEVER(kls);
</span><ins>+// Mark any associated sizer
+%feature("markfunc") kls "GC_mark_wxWindow";
</ins><span class="cx"> %enddef
</span><span class="cx">
</span><span class="cx"> // Strategy for dialogs - these
are destroyed automatically
</span><span class="cx"> %define GC_MANAGE_AS_DIALOG(kls)
</span><span class="cx"> GC_NEVER(kls);
</span><ins>+// Mark any associated sizer
+%feature("markfunc") kls "GC_mark_wxWindow";
</ins><span class="cx"> %enddef
</span><span class="cx">
</span><span class="cx"> // Events - cleaned up by
WxWidgets when handling is complete, shouldn''t
</span><span class="cx"> // be stored so not tracked.
</span><span class="cx"> %define GC_MANAGE_AS_EVENT(kls)
</span><span class="cx"> %feature("freefunc")
kls "GcNullFreeFunc";
</span><ins>+%feature("nodirector") kls;
</ins><span class="cx"> %enddef
</span><span class="cx">
</span><span class="cx"> // Other descendants of
Wx::Object - eg Colour, Pen, Bitmap - that Wx
</span></span></pre></div>
<a id="trunkwxruby2swigwxi"></a>
<div class="modfile"><h4>Modified: trunk/wxruby2/swig/wx.i
(1031 => 1032)</h4>
<pre class="diff"><span>
<span class="info">---
trunk/wxruby2/swig/wx.i        2007-05-22
17:21:51 UTC (rev 1031)
+++
trunk/wxruby2/swig/wx.i        2007-05-22
21:40:09 UTC (rev 1032)
</span><span class="lines">@@ -22,6 +22,37 @@
</span><span class="cx"> {
</span><span class="cx"> SWIG_RubyRemoveTracking(ptr);
</span><span class="cx"> }
</span><ins>+
+static VALUE wx_destroyed_sym = rb_intern("@__wx_destroyed__");
+bool GC_IsWindowDeleted(void *ptr)
+{
+ VALUE rb_win = SWIG_RubyInstanceFor(ptr);
+ return ( rb_ivar_defined(rb_win, wx_destroyed_sym ) == Qtrue );
+}
+
+// Default mark routine for Windows - preserve sizers
+void GC_mark_wxWindow(void *ptr)
+{
+
+ if ( GC_IsWindowDeleted(ptr) ) return;
+
+ wxWindow* wx_win = (wxWindow*)ptr;
+ wxSizer* wx_sizer = wx_win->GetSizer();
+ if ( wx_sizer )
+        {
+         VALUE
rb_sizer = SWIG_RubyInstanceFor(wx_sizer);
+        
rb_gc_mark(rb_sizer);
+        }
+
+ wxCaret* wx_caret = wx_win->GetCaret();
+ if ( wx_caret )
+        {
+         VALUE
rb_caret = SWIG_RubyInstanceFor(wx_caret);
+        
rb_gc_mark(rb_caret);
+        }
+}
+
+
</ins><span class="cx"> %}
</span><span class="cx">
</span><span class="cx"> %init %{
</span></span></pre>
</div>
</div>
</body>
</html>
Apparently Analagous Threads
- [1108] trunk/wxruby2/swig: Revised mem mgmt for Sizers to address more GC crashes in Sizers demo
- [1109] trunk/wxruby2/swig: Move marking of MenuBar from direct %markfunc to via mark_wxFrame, so
- [1024] trunk/wxruby2/swig: Memory mgmt: defs and implementation of new memory management; strip
- [1135] trunk/wxruby2/swig/mark_free_impl.i: Convert from DOS to Unix newlines
- [1127] trunk/wxruby2: Move shared C++ GC functions into separate file included into wx.i
