CVSROOT:        /cvsroot/lilypond
Module name:    lilypond
Branch:         
Changes by:     Han-Wen Nienhuys <[EMAIL PROTECTED]>    05/05/31 15:25:26

Modified files:
        .              : ChangeLog 
        lily           : global-context-scheme.cc global-context.cc 
                         grob.cc music-output.cc paper-score.cc 
                         parser.yy score-context.cc score-engraver.cc 
                         score-performer.cc score-translator.cc score.cc 
        lily/include   : global-context.hh score-context.hh 
                         score-engraver.hh score-performer.hh 
                         score-translator.hh 
        scm            : lily.scm 

Log message:
        * lily/score.cc (Score): unprotect copy of Output_def. Plugs
        memory leak.
        
        * lily/parser.yy (score_body): don't clone Score, that's done in
        Lily_lexer::try_special_identifiers(). This fixes a memory leak.
        
        * lily/score-engraver.cc (derived_mark): new function.
        (initialize): unprotect Paper_score. This fixes a memory leak.
        
        * lily/score-performer.cc (derived_mark): new function.
        
        * lily/score-translator.cc (get_output): use SCM for get_output() call.

CVSWeb URLs:
http://savannah.gnu.org/cgi-bin/viewcvs/lilypond/lilypond/ChangeLog.diff?tr1=1.3692&tr2=1.3693&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/lilypond/lilypond/lily/global-context-scheme.cc.diff?tr1=1.8&tr2=1.9&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/lilypond/lilypond/lily/global-context.cc.diff?tr1=1.31&tr2=1.32&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/lilypond/lilypond/lily/grob.cc.diff?tr1=1.130&tr2=1.131&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/lilypond/lilypond/lily/music-output.cc.diff?tr1=1.3&tr2=1.4&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/lilypond/lilypond/lily/paper-score.cc.diff?tr1=1.84&tr2=1.85&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/lilypond/lilypond/lily/parser.yy.diff?tr1=1.470&tr2=1.471&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/lilypond/lilypond/lily/score-context.cc.diff?tr1=1.10&tr2=1.11&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/lilypond/lilypond/lily/score-engraver.cc.diff?tr1=1.145&tr2=1.146&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/lilypond/lilypond/lily/score-performer.cc.diff?tr1=1.61&tr2=1.62&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/lilypond/lilypond/lily/score-translator.cc.diff?tr1=1.6&tr2=1.7&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/lilypond/lilypond/lily/score.cc.diff?tr1=1.162&tr2=1.163&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/lilypond/lilypond/lily/include/global-context.hh.diff?tr1=1.9&tr2=1.10&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/lilypond/lilypond/lily/include/score-context.hh.diff?tr1=1.5&tr2=1.6&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/lilypond/lilypond/lily/include/score-engraver.hh.diff?tr1=1.31&tr2=1.32&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/lilypond/lilypond/lily/include/score-performer.hh.diff?tr1=1.30&tr2=1.31&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/lilypond/lilypond/lily/include/score-translator.hh.diff?tr1=1.3&tr2=1.4&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/lilypond/lilypond/scm/lily.scm.diff?tr1=1.350&tr2=1.351&r1=text&r2=text

Patches:
Index: lilypond/ChangeLog
diff -u lilypond/ChangeLog:1.3692 lilypond/ChangeLog:1.3693
--- lilypond/ChangeLog:1.3692   Tue May 31 14:09:00 2005
+++ lilypond/ChangeLog  Tue May 31 15:25:25 2005
@@ -1,5 +1,18 @@
 2005-05-31  Han-Wen Nienhuys  <[EMAIL PROTECTED]>
 
+       * lily/score.cc (Score): unprotect copy of Output_def. Plugs
+       memory leak.
+
+       * lily/parser.yy (score_body): don't clone Score, that's done in
+       Lily_lexer::try_special_identifiers(). This fixes a memory leak.
+
+       * lily/score-engraver.cc (derived_mark): new function.
+       (initialize): unprotect Paper_score. This fixes a memory leak.
+
+       * lily/score-performer.cc (derived_mark): new function.
+
+       * lily/score-translator.cc (get_output): use SCM for get_output() call.
+
        * stepmake/aclocal.m4: put FlexLexer.h test in conftest.cc. Fixes
        spurious warning.
 
Index: lilypond/lily/global-context-scheme.cc
diff -u lilypond/lily/global-context-scheme.cc:1.8 
lilypond/lily/global-context-scheme.cc:1.9
--- lilypond/lily/global-context-scheme.cc:1.8  Mon Apr 18 00:36:45 2005
+++ lilypond/lily/global-context-scheme.cc      Tue May 31 15:25:26 2005
@@ -24,10 +24,10 @@
   Global_context *g = dynamic_cast<Global_context *> (unsmob_context 
(context));
   SCM_ASSERT_TYPE (g, context, SCM_ARG1, __FUNCTION__, "Global context");
 
-  Music_output *output = g->get_output ();
+  SCM output = g->get_output ();
   progress_indication ("\n");
-  output->process ();
-  return output->self_scm ();
+  unsmob_music_output (output)->process ();
+  return output;
 }
 
 LY_DEFINE (ly_run_translator, "ly:run-translator",
Index: lilypond/lily/global-context.cc
diff -u lilypond/lily/global-context.cc:1.31 
lilypond/lily/global-context.cc:1.32
--- lilypond/lily/global-context.cc:1.31        Wed May 25 10:22:34 2005
+++ lilypond/lily/global-context.cc     Tue May 31 15:25:26 2005
@@ -97,7 +97,7 @@
     : 0;
 }
 
-Music_output *
+SCM
 Global_context::get_output ()
 {
   return get_score_context ()->get_output ();
Index: lilypond/lily/grob.cc
diff -u lilypond/lily/grob.cc:1.130 lilypond/lily/grob.cc:1.131
--- lilypond/lily/grob.cc:1.130 Mon Apr 18 00:36:45 2005
+++ lilypond/lily/grob.cc       Tue May 31 15:25:26 2005
@@ -663,8 +663,8 @@
   if (s->original_)
     scm_gc_mark (s->original_->self_scm ());
 
-  if (s->pscore_ && s->pscore_->layout ())
-    scm_gc_mark (s->pscore_->layout ()->self_scm ());
+  if (s->pscore_)
+    scm_gc_mark (s->pscore_->self_scm ());
 
   s->do_derived_mark ();
   return s->mutable_property_alist_;
Index: lilypond/lily/include/global-context.hh
diff -u lilypond/lily/include/global-context.hh:1.9 
lilypond/lily/include/global-context.hh:1.10
--- lilypond/lily/include/global-context.hh:1.9 Mon Apr 18 00:36:45 2005
+++ lilypond/lily/include/global-context.hh     Tue May 31 15:25:26 2005
@@ -29,7 +29,7 @@
   void apply_finalizations ();
   void add_finalization (SCM);
 
-  virtual Music_output *get_output ();
+  virtual SCM get_output ();
   virtual void prepare (Moment);
   virtual void one_time_step ();
   virtual void finish ();
Index: lilypond/lily/include/score-context.hh
diff -u lilypond/lily/include/score-context.hh:1.5 
lilypond/lily/include/score-context.hh:1.6
--- lilypond/lily/include/score-context.hh:1.5  Thu Mar 10 14:36:12 2005
+++ lilypond/lily/include/score-context.hh      Tue May 31 15:25:26 2005
@@ -15,7 +15,7 @@
 public:
   Score_context (Object_key const *);
 
-  virtual Music_output *get_output ();
+  virtual SCM get_output ();
   virtual void prepare (Moment);
   virtual void finish ();
   virtual void one_time_step ();
Index: lilypond/lily/include/score-engraver.hh
diff -u lilypond/lily/include/score-engraver.hh:1.31 
lilypond/lily/include/score-engraver.hh:1.32
--- lilypond/lily/include/score-engraver.hh:1.31        Thu Mar 10 14:36:12 2005
+++ lilypond/lily/include/score-engraver.hh     Tue May 31 15:25:26 2005
@@ -32,6 +32,7 @@
   virtual void prepare (Moment);
   virtual void one_time_step ();
 
+  
   /* Engraver_group_engraver interface */
   virtual void acknowledge_grob (Grob_info);
   virtual bool try_music (Music *);
@@ -40,10 +41,14 @@
   virtual void announce_grob (Grob_info);
   virtual void stop_translation_timestep ();
 
+  /*
+    Translator interface
+   */
+  virtual void derived_mark () const;
 public:
   TRANSLATOR_DECLARATIONS (Score_engraver);
   void forbid_breaks ();
-  virtual Music_output *get_output ();
+  virtual SCM get_output ();
 };
 
 #endif /* SCORE_ENGRAVER_HH */
Index: lilypond/lily/include/score-performer.hh
diff -u lilypond/lily/include/score-performer.hh:1.30 
lilypond/lily/include/score-performer.hh:1.31
--- lilypond/lily/include/score-performer.hh:1.30       Thu Mar 10 14:36:12 2005
+++ lilypond/lily/include/score-performer.hh    Tue May 31 15:25:26 2005
@@ -29,7 +29,8 @@
   virtual void announce_element (Audio_element_info);
   virtual int get_tempo () const;
   virtual void play_element (Audio_element *p);
-  virtual Music_output *get_output ();
+  virtual SCM get_output ();
+  virtual void derived_mark () const;
 private:
   void header (Midi_stream &);
 
Index: lilypond/lily/include/score-translator.hh
diff -u lilypond/lily/include/score-translator.hh:1.3 
lilypond/lily/include/score-translator.hh:1.4
--- lilypond/lily/include/score-translator.hh:1.3       Thu Mar 10 14:36:12 2005
+++ lilypond/lily/include/score-translator.hh   Tue May 31 15:25:26 2005
@@ -15,7 +15,7 @@
 {
   friend class Score_context;
 protected:
-  virtual Music_output *get_output ();
+  virtual SCM get_output ();
   virtual void prepare (Moment);
   virtual void finish ();
   virtual void one_time_step ();
Index: lilypond/lily/music-output.cc
diff -u lilypond/lily/music-output.cc:1.3 lilypond/lily/music-output.cc:1.4
--- lilypond/lily/music-output.cc:1.3   Mon Apr 18 13:27:48 2005
+++ lilypond/lily/music-output.cc       Tue May 31 15:25:26 2005
@@ -8,7 +8,9 @@
 */
 
 #include "music-output.hh" 
+
 #include "ly-smobs.icc"
+#include "virtual-methods.hh"
 
 Music_output::Music_output ()
 {
@@ -44,9 +46,12 @@
 }
 
 int
-Music_output::print_smob (SCM, SCM p, scm_print_state*)
+Music_output::print_smob (SCM s, SCM p, scm_print_state*)
 {
-  scm_puts ("#<Music_output>", p);
+  Music_output *sc = (Music_output *) SCM_CELL_WORD_1 (s);
+  scm_puts ("#<", p);
+  scm_puts (classname (sc), p);
+  scm_puts (">", p);
 
   return 1;
 }
Index: lilypond/lily/paper-score.cc
diff -u lilypond/lily/paper-score.cc:1.84 lilypond/lily/paper-score.cc:1.85
--- lilypond/lily/paper-score.cc:1.84   Mon Apr 18 13:27:48 2005
+++ lilypond/lily/paper-score.cc        Tue May 31 15:25:26 2005
@@ -39,6 +39,8 @@
 void
 Paper_score::derived_mark () const
 {
+  if (layout_)
+    scm_gc_mark (layout_->self_scm ());
   scm_gc_mark (systems_);
   scm_gc_mark (paper_systems_);
 }
Index: lilypond/lily/parser.yy
diff -u lilypond/lily/parser.yy:1.470 lilypond/lily/parser.yy:1.471
--- lilypond/lily/parser.yy:1.470       Wed May 25 01:16:45 2005
+++ lilypond/lily/parser.yy     Tue May 31 15:25:26 2005
@@ -792,7 +792,7 @@
                $$->set_spot (@$);
        }
        | SCORE_IDENTIFIER {
-               $$ = new Score ( *unsmob_score ($1));
+               $$ = unsmob_score ($1);
                $$->set_spot (@$);
        }
        | score_body object_id_setting {
Index: lilypond/lily/score-context.cc
diff -u lilypond/lily/score-context.cc:1.10 lilypond/lily/score-context.cc:1.11
--- lilypond/lily/score-context.cc:1.10 Thu Mar 10 14:36:13 2005
+++ lilypond/lily/score-context.cc      Tue May 31 15:25:26 2005
@@ -36,7 +36,7 @@
   s->one_time_step ();
 }
 
-Music_output *
+SCM
 Score_context::get_output ()
 {
   Translator *t = implementation ();
Index: lilypond/lily/score-engraver.cc
diff -u lilypond/lily/score-engraver.cc:1.145 
lilypond/lily/score-engraver.cc:1.146
--- lilypond/lily/score-engraver.cc:1.145       Sun May  8 23:30:50 2005
+++ lilypond/lily/score-engraver.cc     Tue May 31 15:25:26 2005
@@ -35,6 +35,15 @@
 }
 
 void
+Score_engraver::derived_mark () const
+{
+  if (pscore_)
+    scm_gc_mark (pscore_->self_scm ());
+  Score_translator::derived_mark ();
+  Engraver_group_engraver::derived_mark ();
+}
+
+void
 Score_engraver::make_columns ()
 {
   /*
@@ -106,6 +115,7 @@
     }
 
   pscore_ = new Paper_score (dynamic_cast<Output_def *> (get_output_def ()));
+  scm_gc_unprotect_object (pscore_->self_scm ()); 
 
   SCM props = updated_grob_properties (context (), ly_symbol2scm ("System"));
 
@@ -217,12 +227,11 @@
   system_->add_column (musical_column_);
 }
 
-Music_output *
+SCM
 Score_engraver::get_output ()
 {
   Music_output *o = pscore_;
-  ///FIXME WTF ? pscore_ = 0;
-  return o;
+  return o->self_scm ();
 }
 
 bool
Index: lilypond/lily/score-performer.cc
diff -u lilypond/lily/score-performer.cc:1.61 
lilypond/lily/score-performer.cc:1.62
--- lilypond/lily/score-performer.cc:1.61       Thu Mar 10 14:36:13 2005
+++ lilypond/lily/score-performer.cc    Tue May 31 15:25:26 2005
@@ -78,18 +78,29 @@
   return ::get_tempo (performance_->midi_, Moment (Rational (1, 4)));
 }
 
-Music_output *
+SCM
 Score_performer::get_output ()
 {
   Music_output *o = performance_;
   performance_ = 0;
-  return o;
+  return o->self_scm ();
+}
+
+void
+Score_performer::derived_mark () const
+{
+  if (performance_)
+    scm_gc_mark (performance_->self_scm ());
+
+  Score_translator::derived_mark ();
+  Performer_group_performer::derived_mark ();
 }
 
 void
 Score_performer::initialize ()
 {
   performance_ = new Performance;
+  scm_gc_unprotect_object (performance_->self_scm ());
   performance_->midi_ = get_output_def ();
 
   Translator_group::initialize ();
Index: lilypond/lily/score-translator.cc
diff -u lilypond/lily/score-translator.cc:1.6 
lilypond/lily/score-translator.cc:1.7
--- lilypond/lily/score-translator.cc:1.6       Thu Mar 10 14:36:13 2005
+++ lilypond/lily/score-translator.cc   Tue May 31 15:25:26 2005
@@ -14,10 +14,10 @@
 {
 }
 
-Music_output *
+SCM
 Score_translator::get_output ()
 {
-  return 0;
+  return SCM_EOL;
 }
 
 void
Index: lilypond/lily/score.cc
diff -u lilypond/lily/score.cc:1.162 lilypond/lily/score.cc:1.163
--- lilypond/lily/score.cc:1.162        Mon Apr 18 12:53:17 2005
+++ lilypond/lily/score.cc      Tue May 31 15:25:26 2005
@@ -78,8 +78,11 @@
   scm_gc_unprotect_object (music_);
 
   for (int i = 0, n = s.defs_.size (); i < n; i++)
-    defs_.push (s.defs_[i]->clone ());
-
+    {
+      Output_def * copy = s.defs_[i]->clone ();
+      defs_.push (copy);
+      scm_gc_unprotect_object (copy->self_scm ());
+    }
   header_ = ly_make_anonymous_module (false);
   if (ly_c_module_p (s.header_))
     ly_module_copy (header_, s.header_);
Index: lilypond/scm/lily.scm
diff -u lilypond/scm/lily.scm:1.350 lilypond/scm/lily.scm:1.351
--- lilypond/scm/lily.scm:1.350 Mon May 30 23:38:46 2005
+++ lilypond/scm/lily.scm       Tue May 31 15:25:26 2005
@@ -274,7 +274,7 @@
                         ".scm"))
         (outfile    (open-file  out-file-name  "w")))
 
-    (display "Dumping gc protected objs to ...\n")
+    (display (format "Dumping gc protected objs to ~a...\n" out-file-name))
     (display
      (filter
       (lambda (x) (not (symbol? x))) 
@@ -326,8 +326,8 @@
   (catch 'ly-file-failed
         (lambda () (ly:parse-file file-name))
         (lambda (x . args) (handler x file-name)))
-  ;;(lambda (x) (handler x f)))
-  (if #f
+
+  (if #t
       (dump-gc-protects)))
 
 (use-modules (scm editor))


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

Reply via email to