CVSROOT:        /cvsroot/lilypond
Module name:    lilypond
Branch:         
Changes by:     Han-Wen Nienhuys <[EMAIL PROTECTED]>    05/07/25 11:21:56

Modified files:
        .              : ChangeLog 
        lily           : ligature-engraver.cc ly-module.cc 
        lily/include   : ly-module.hh 
        scm            : lily.scm 

Log message:
        (lilypond-all): clear anonymous modules after
        processing files.

CVSWeb URLs:
http://savannah.gnu.org/cgi-bin/viewcvs/lilypond/lilypond/ChangeLog.diff?tr1=1.3926&tr2=1.3927&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/lilypond/lilypond/lily/ligature-engraver.cc.diff?tr1=1.46&tr2=1.47&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/lilypond/lilypond/lily/ly-module.cc.diff?tr1=1.43&tr2=1.44&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/lilypond/lilypond/lily/include/ly-module.hh.diff?tr1=1.12&tr2=1.13&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/lilypond/lilypond/scm/lily.scm.diff?tr1=1.372&tr2=1.373&r1=text&r2=text

Patches:
Index: lilypond/ChangeLog
diff -u lilypond/ChangeLog:1.3926 lilypond/ChangeLog:1.3927
--- lilypond/ChangeLog:1.3926   Sun Jul 24 19:54:13 2005
+++ lilypond/ChangeLog  Mon Jul 25 11:21:54 2005
@@ -1,3 +1,8 @@
+2005-07-25  Han-Wen Nienhuys  <[EMAIL PROTECTED]>
+
+       * scm/lily.scm (lilypond-all): clear anonymous modules after
+       processing files.
+
 2005-07-24  Han-Wen Nienhuys  <[EMAIL PROTECTED]>
 
        * flower/include/guile-compatibility.hh (SCM_I_CONSP): add
Index: lilypond/lily/include/ly-module.hh
diff -u lilypond/lily/include/ly-module.hh:1.12 
lilypond/lily/include/ly-module.hh:1.13
--- lilypond/lily/include/ly-module.hh:1.12     Mon Jul 11 12:51:13 2005
+++ lilypond/lily/include/ly-module.hh  Mon Jul 25 11:21:55 2005
@@ -18,7 +18,7 @@
 SCM ly_module_symbols (SCM mod);
 void ly_reexport_module (SCM mod);
 inline bool ly_is_module (SCM x) { return SCM_MODULEP (x); }
-void ly_clear_anonymous_modules ();
+SCM ly_clear_anonymous_modules ();
 SCM ly_use_module (SCM mod, SCM used);
 
 #endif /* LY_MODULE_HH */
Index: lilypond/lily/ligature-engraver.cc
diff -u lilypond/lily/ligature-engraver.cc:1.46 
lilypond/lily/ligature-engraver.cc:1.47
--- lilypond/lily/ligature-engraver.cc:1.46     Sun Jul 24 01:33:35 2005
+++ lilypond/lily/ligature-engraver.cc  Mon Jul 25 11:21:55 2005
@@ -15,6 +15,8 @@
 #include "warn.hh"
 #include "context.hh"
 
+#include "translator.icc"
+
 /*
  * This abstract class provides the general framework for ligatures of
  * any kind.  It cares for handling start/stop ligatures events and
@@ -278,14 +280,15 @@
 void
 Ligature_engraver::acknowledge_rest (Grob_info info)
 {
-  info.music_cause ()->origin ()->warning (_ ("ignoring rest: ligature may not 
contain rest"));
-  prev_start_event_->origin ()->warning (_ ("ligature was started here"));
-  // TODO: maybe better should stop ligature here rather than
-  // ignoring the rest?
+  if (ligature_)
+    {
+      info.music_cause ()->origin ()->warning (_ ("ignoring rest: ligature may 
not contain rest"));
+      prev_start_event_->origin ()->warning (_ ("ligature was started here"));
+      // TODO: maybe better should stop ligature here rather than
+      // ignoring the rest?
+    }
 }
 
-
-#include "translator.icc"
 
 ADD_ACKNOWLEDGER(Ligature_engraver, rest);
 ADD_ACKNOWLEDGER(Ligature_engraver, note_head);
Index: lilypond/lily/ly-module.cc
diff -u lilypond/lily/ly-module.cc:1.43 lilypond/lily/ly-module.cc:1.44
--- lilypond/lily/ly-module.cc:1.43     Fri Jul  1 11:22:42 2005
+++ lilypond/lily/ly-module.cc  Mon Jul 25 11:21:55 2005
@@ -10,9 +10,43 @@
 #include "warn.hh"
 #include "main.hh"
 #include "string.hh"
+#include "protected-scm.hh"
+
+#define MODULE_GC_KLUDGE
 
 #define FUNC_NAME __FUNCTION__
 
+Protected_scm anonymous_modules = SCM_EOL;
+
+LY_DEFINE(ly_clear_anonymous_modules, "ly:clear-anonymous-modules",
+         0,0,0,(),
+         "Plug a GUILE 1.6 and 1.7 memory leak by breaking a weak reference "
+         "pointer cycle explicitly."
+         )
+{
+#ifdef MODULE_GC_KLUDGE
+  for (SCM s = anonymous_modules;
+       scm_is_pair (s);
+       s = scm_cdr (s))
+    {
+      SCM module = scm_car (s);
+      SCM closure = SCM_MODULE_EVAL_CLOSURE(module);
+      SCM prop = scm_procedure_property (closure, ly_symbol2scm ("module")); 
+
+      if (ly_is_module (prop))
+       {
+         scm_set_procedure_property_x (closure, ly_symbol2scm ("module"),
+                                       SCM_BOOL_F);
+       }
+    }
+
+  anonymous_modules = SCM_EOL;
+
+#endif
+
+  return SCM_UNSPECIFIED;
+}
+
 SCM
 ly_make_anonymous_module (bool safe)
 {
@@ -35,6 +69,11 @@
       SCM proc = ly_lily_module_constant ("make-safe-lilypond-module");
       mod = scm_call_0 (proc);
     }
+
+#ifdef MODULE_GC_KLUDGE
+  anonymous_modules = scm_cons (mod, anonymous_modules);
+#endif
+  
   return mod;
 }
 
Index: lilypond/scm/lily.scm
diff -u lilypond/scm/lily.scm:1.372 lilypond/scm/lily.scm:1.373
--- lilypond/scm/lily.scm:1.372 Sun Jul 24 01:33:35 2005
+++ lilypond/scm/lily.scm       Mon Jul 25 11:21:56 2005
@@ -374,8 +374,11 @@
   (let* ((failed '())
         (handler (lambda (key failed-file)
                    (set! failed (append (list failed-file) failed)))))
-    ;;(handler (lambda (key . arg) (set! failed (append arg failed)))))
-    (for-each (lambda (x) (lilypond-file handler x)) files)
+    (for-each
+     (lambda (x)
+       (lilypond-file handler x)
+       (ly:clear-anonymous-modules))
+     files)
     failed))
 
 (define (lilypond-file handler file-name)


_______________________________________________
Lilypond-cvs mailing list
[email protected]
http://lists.gnu.org/mailman/listinfo/lilypond-cvs

Reply via email to