]> git.donarmstrong.com Git - lilypond.git/commitdiff
* lily/music-iterator.cc (quit, do_quit): new function: break link
authorHan-Wen Nienhuys <hanwen@xs4all.nl>
Mon, 9 Sep 2002 10:45:20 +0000 (10:45 +0000)
committerHan-Wen Nienhuys <hanwen@xs4all.nl>
Mon, 9 Sep 2002 10:45:20 +0000 (10:45 +0000)
to translator group explicitly. This used to be done from the
destructor of music-iterator. Now that iterators are GC'd, this is
no longer possible.  Add new function do_quit() to all applicable
derived classes.

* lily/lyric-combine-music-iterator.cc (construct_children): don't
unprotect objects.
(Lyric_combine_music_iterator): small typo bugfix.

* lily/sequential-iterator.cc (get_pending_events): don't delete
music-iterator.

25 files changed:
lily/chord-tremolo-iterator.cc
lily/folded-repeat-iterator.cc
lily/include/chord-tremolo-iterator.hh
lily/include/folded-repeat-iterator.hh
lily/include/interpretation-context-handle.hh
lily/include/lyric-combine-music-iterator.hh
lily/include/music-iterator.hh
lily/include/music-wrapper-iterator.hh
lily/include/part-combine-music-iterator.hh
lily/include/percent-repeat-iterator.hh
lily/include/sequential-iterator.hh
lily/include/simple-music-iterator.hh
lily/include/simultaneous-music-iterator.hh
lily/interpretation-context-handle.cc
lily/lily-guile.cc
lily/lyric-combine-music-iterator.cc
lily/music-iterator.cc
lily/music-wrapper-iterator.cc
lily/part-combine-music-iterator.cc
lily/percent-repeat-iterator.cc
lily/score.cc
lily/sequential-iterator.cc
lily/sequential-music-iterator.cc
lily/simultaneous-music-iterator.cc
lily/source-file.cc

index 4c602c891729537fa638638064e6423ca39f765f..b4d769696810ee5258887f2396e5df0bab655855 100644 (file)
@@ -40,6 +40,13 @@ Chord_tremolo_iterator::Chord_tremolo_iterator (Chord_tremolo_iterator const &sr
     scm_gc_unprotect_object (child_iter_->self_scm());
 }
 
+void
+Chord_tremolo_iterator::do_quit()
+{
+  if (child_iter_)
+    child_iter_->quit();
+}
+
 void
 Chord_tremolo_iterator::derived_mark () const
 {
index 92baa19021421014d2e2f3f8cfd9ab646ec6534d..3a90567566a1f53fa92dca8151898e2f3f735cb9 100644 (file)
@@ -30,6 +30,12 @@ Folded_repeat_iterator::ok () const
 {
   return main_iter_ || alternative_iter_;
 }
+void
+Folded_repeat_iterator::do_quit()
+{
+  if (main_iter_)main_iter_->quit();
+  if (alternative_iter_)alternative_iter_->quit();
+}
 
 Folded_repeat_iterator::Folded_repeat_iterator (Folded_repeat_iterator const &src)
   : Music_iterator (src)
@@ -93,6 +99,7 @@ Folded_repeat_iterator::process (Moment m)
       alternative_iter_->process (m - main_length_mom_);
       if (!alternative_iter_->ok ())
        {
+         alternative_iter_->quit();
          alternative_iter_ =0;
        }
     }
@@ -103,6 +110,7 @@ Folded_repeat_iterator::leave_body ()
 {
   Repeated_music *  mus = dynamic_cast<Repeated_music *> (get_music ());
 
+  main_iter_->quit ();
   main_iter_ = 0;
   main_length_mom_ +=  mus->body ()->length_mom ();
 }
index ef8a753cd752b71a78be4ec1a99d344e4fa3eaca..de5344874ac676895a4df2252b9461870e50f6d9 100644 (file)
@@ -22,6 +22,7 @@ public:
 protected:
   virtual void derived_mark () const;
   virtual Moment pending_moment () const;
+  virtual void do_quit(); 
   virtual void construct_children () ;
   virtual bool ok () const;
   virtual void process (Moment) ;
index 40fdedafd6785c01fe6c9f27c6422565291517c9..4768ba0b90c8cc09266436b4f3fd8a5c9277b357 100644 (file)
@@ -27,6 +27,7 @@ public:
   virtual void derived_mark () const;
   virtual void construct_children ();
   virtual Moment pending_moment () const;
+  virtual void do_quit(); 
   virtual bool ok () const;
 
 protected:
index 0dbf9431a5ff70af7ba5402b1d06afce44d73dce..93786a520340b5129d525c51eeeaed23148d7cf0 100644 (file)
@@ -23,6 +23,7 @@ public:
   Interpretation_context_handle (Interpretation_context_handle const&);
   Translator_group * report_to () const;
 
+  void quit ();
 private:
   Translator_group * report_to_;
   void down ();
index be19f67d270e6b4b6c54ad6fd8d5a7ca710453c7..e85fc6ab635f09c9955d84dc5fcf4c5f425281ca 100644 (file)
@@ -23,6 +23,7 @@ public:
 protected:
   virtual void construct_children ();
   virtual Moment pending_moment () const;
+  virtual void do_quit(); 
   virtual void process (Moment);
   virtual Music_iterator *try_music_in_children (Music *) const;
   
index 9db8e9c640177c01e6dde0a08c9e8311d6cf5171..e005bd60d395c5f71bddc6c7a6548721e2f6633f 100644 (file)
@@ -90,19 +90,22 @@ public:
    */
   static SCM get_static_get_iterator (Music * mus);
   void init_translator (Music  *, Translator_group *); 
+void quit ();
 
+  
   virtual Moment pending_moment () const;
   virtual bool ok () const;
   virtual SCM get_pending_events (Moment until)const;
   virtual void process (Moment until);
   virtual void skip (Moment until);
   virtual void derived_mark ()const;
+  virtual void construct_children ();
   
   /**
     Construct sub-iterators, and set the translator to 
     report to.
    */
-  virtual void construct_children ();
+
   DECLARE_SCHEME_CALLBACK(constructor, ());
   
   /**
@@ -113,6 +116,8 @@ public:
   virtual Music_iterator* try_music_in_children (Music *) const;
 
   Music * get_music () const;
+protected:
+  virtual void do_quit();
 private:
   Interpretation_context_handle handle_;
   Music  * music_;
index d832a59ab94867cd083f506c4d70cda0ffd56155..2d985372e85a147f9bfe94495eee7ebf44f13bad 100644 (file)
@@ -29,6 +29,7 @@ public:
   virtual void derived_mark () const;
   virtual void construct_children () ;
   virtual Moment pending_moment () const;
+  virtual void do_quit(); 
   virtual bool ok () const;
   virtual SCM get_pending_events (Moment)const;
   virtual void skip (Moment);
index a2da0cabfd120da0cf8b4b74f7e7d89f7570fd58..fa88a2dc5ef59f1a3c1d25b931ffc3ea9048db3f 100644 (file)
@@ -25,6 +25,7 @@ protected:
   Part_combine_music_iterator (Part_combine_music_iterator const &);
   virtual void construct_children ();
   virtual Moment pending_moment () const;
+  virtual void do_quit(); 
   virtual void process (Moment);
   virtual SCM get_pending_events (Moment)const;
   virtual Music_iterator *try_music_in_children (Music *) const;
index 2d3effda5449f7a5c5416229352f0beab99b757c..a2c420e01f0af3f79c413064f0c1ba7a0fd36556 100644 (file)
@@ -22,6 +22,7 @@ public:
 protected:
   virtual void derived_mark () const;
   virtual Moment pending_moment () const;
+  virtual void do_quit(); 
   virtual void construct_children () ;
   virtual bool ok () const;
   virtual void process (Moment) ;
index 39621360155d0b7a0a60efc615b8ea869ef62bbb..554e3657c2d3d761553aa571c41c0546fbde65af 100644 (file)
@@ -61,6 +61,7 @@ public:
 
   virtual void construct_children ();
   virtual Moment pending_moment () const;
+  virtual void do_quit(); 
   virtual bool ok () const;
   virtual void skip (Moment);
   virtual SCM get_pending_events (Moment)const;
index 5fdb418261d08788c4055b7f1f3746f64c3a2999..d154b144614e4a36c2bfe4d8237fe52d516a36d0 100644 (file)
@@ -29,6 +29,7 @@ public:
   virtual void process (Moment);
   virtual bool ok ()const;
   virtual Moment pending_moment ()const;
+
   virtual void skip (Moment);
 };
 
index 78e7a941b5685d0d0badd809dbc7403172c34a06..198b47152d5b8e8cde0406d5b3e713342f70a459 100644 (file)
@@ -27,6 +27,7 @@ public:
 
   virtual void construct_children ();
   virtual Moment pending_moment () const;
+  virtual void do_quit(); 
   virtual bool ok () const;
   virtual SCM get_pending_events (Moment)const;
   virtual void skip (Moment);
index 3c1e38153ae250b76b472a20570f25e5b3d97a50..e1da362bede56ddd820b44e2c254eb95e3545aaf 100644 (file)
@@ -31,8 +31,14 @@ Interpretation_context_handle::clone () const
 
 Interpretation_context_handle::~Interpretation_context_handle ()
 {
-  if (report_to_)
-    down ();
+  /*
+    Don't do
+
+    if (report_to_)
+      down ();
+
+    with GC, this is asynchronous.
+   */
 }
 
 void
@@ -49,6 +55,13 @@ Interpretation_context_handle::down ()
   report_to_ = 0;
 }
 
+void
+Interpretation_context_handle::quit ()
+{
+  if (report_to_) report_to_->iterator_count_ --;
+}
+
+
 bool
 Interpretation_context_handle::try_music (Music *m)
 {
@@ -75,6 +88,7 @@ Interpretation_context_handle::set_translator (Translator_group*trans)
 Translator_group*
 Interpretation_context_handle::report_to ()const
 {
+  
   return report_to_;
 }
 
index 2a3e3f19ef6ad909b171c9254f4b5630c2f0d5c3..7a08f7d3f30227842b6c5068a2782368c70f2dee 100644 (file)
@@ -98,7 +98,7 @@ gulp_file_to_string (String fn)
   int n;
   char * str = gulp_file (s, &n);
   String result (str);
-  delete str;
+  delete[] str;
   
   if (verbose_global_b)
     progress_indication ("]");
index cd1b2042256d37fffd251246cdb7c843bf77f243..fc4d7c2b4188574e952a8439ecc02bed11c0e768 100644 (file)
@@ -31,9 +31,9 @@ Lyric_combine_music_iterator::Lyric_combine_music_iterator ()
       melisma_playing_req = new Melisma_playing_req;
       melisma_stop_req = new Melisma_req;
       melisma_start_req = new Melisma_req;      
+      melisma_start_req->set_span_dir (START);
+      melisma_stop_req->set_span_dir (STOP);
     }
-  melisma_start_req->set_span_dir (START);
-  melisma_stop_req->set_span_dir (STOP);
   
   music_iter_ =0;
   lyric_iter_ =0;
@@ -68,9 +68,6 @@ Lyric_combine_music_iterator::construct_children ()
   
   music_iter_ = unsmob_iterator (get_iterator (m->get_music ()));
   lyric_iter_ = unsmob_iterator (get_iterator (m->get_lyrics ()));
-
-  scm_gc_unprotect_object (music_iter_->self_scm());
-  scm_gc_unprotect_object (lyric_iter_->self_scm());
 }
 
 bool
@@ -127,8 +124,13 @@ Lyric_combine_music_iterator::process (Moment m)
     }
   
 }
-
-
+void
+Lyric_combine_music_iterator::do_quit ()
+{
+  if (music_iter_) music_iter_->quit();
+  if (lyric_iter_) lyric_iter_->quit();
+  
+}
 Lyric_combine_music_iterator::Lyric_combine_music_iterator (Lyric_combine_music_iterator const & src)
     : Music_iterator (src)
 {
@@ -136,9 +138,9 @@ Lyric_combine_music_iterator::Lyric_combine_music_iterator (Lyric_combine_music_
   music_iter_ = src.music_iter_ ? src.music_iter_->clone () : 0;  
 
   if (lyric_iter_)
-    scm_gc_unprotect_object (music_iter_->self_scm());
-  if (music_iter_)
     scm_gc_unprotect_object (lyric_iter_->self_scm());
+  if (music_iter_)
+    scm_gc_unprotect_object (music_iter_->self_scm());
 }
 
 Music_iterator*
index a1ee052f06d43b8710c0ede2a00626d4251c2f37..d4ea1f1b96ffbfe8625edca96b47f28872940e10 100644 (file)
@@ -205,7 +205,18 @@ SCM
 Music_iterator::mark_smob (SCM smob)
 {
   Music_iterator * mus = (Music_iterator *)SCM_CELL_WORD_1 (smob);
+
   mus->derived_mark ();
+  /*
+    Careful with GC, although we intend the following as pointers
+    only, we _must_ mark them.
+   */
+  if (mus->report_to())
+    scm_gc_mark (mus->report_to()->self_scm());
+  if (mus->music_)
+    scm_gc_mark (mus->music_->self_scm());
+  
+
   return SCM_EOL;
 }
 
@@ -220,3 +231,15 @@ void
 Music_iterator::derived_mark()const
 {
 }
+
+void
+Music_iterator::quit ()
+{
+  handle_.quit ();
+  do_quit ();
+}
+
+void
+Music_iterator::do_quit()
+{
+}
index e2c481ddf0957f00bf6480f0db53009ef7f999c8..7798d65eaf001651ccd59417df16d1ed148008e8 100644 (file)
@@ -23,6 +23,12 @@ Music_wrapper_iterator::Music_wrapper_iterator (Music_wrapper_iterator const &sr
     scm_gc_unprotect_object (child_iter_->self_scm());
 }
 
+void
+Music_wrapper_iterator::do_quit()
+{
+  child_iter_->quit();
+}
+
 void
 Music_wrapper_iterator::derived_mark()const
 {
index 09f019e9907e368b8a8d21f588bad9fc7b5960f3..9c7efd35c5c11db67e1ee8a9b7c9187af378f22c 100644 (file)
@@ -31,6 +31,12 @@ Part_combine_music_iterator::derived_mark () const
     scm_gc_mark(second_iter_->self_scm());
 }
 
+void
+Part_combine_music_iterator::do_quit ()
+{
+  if (first_iter_) first_iter_->quit();
+  if (second_iter_) second_iter_->quit();
+}
 
 Part_combine_music_iterator::Part_combine_music_iterator (Part_combine_music_iterator const &src)
   : Music_iterator (src)
@@ -342,7 +348,7 @@ Part_combine_music_iterator::process (Moment m)
 
       **** Tried this, but won't work:
 
-      Consider thread switching: threads "one", "two" and "both".
+s      Consider thread switching: threads "one", "two" and "both".
       User can't pre-set the (most important) stem direction at
       thread level!
    */
index 285d114e93c61a45cbb288f9cc1864226f2de3ff..4e8dac48a9c901a2f63ae7e5024fe812a85595a7 100644 (file)
@@ -19,6 +19,11 @@ Percent_repeat_iterator::Percent_repeat_iterator ()
   
 }
 
+void
+Percent_repeat_iterator::do_quit()
+{
+  if (child_iter_) child_iter_->quit();
+}
 Percent_repeat_iterator::Percent_repeat_iterator (Percent_repeat_iterator const & p)
   : Music_iterator (p)
 {
index 0378a6f115d44c2dd2c71320e741d3cff7686b5c..ceb327d9ec228e7506adf664793ad5f566604a14 100644 (file)
@@ -107,6 +107,7 @@ Score::run_translator (Music_output_def *odef)
 
   trans->start ();
   trans->run_iterator_on_me (iter);
+  iter->quit();
   scm_remember_upto_here_1 (protected_iter);
   trans->finish ();
 
index 242f8af15d8b8533fc9f931bef89151bf3fce457..95bd2729f181d453617286f7ef6d86debfa1f761 100644 (file)
@@ -49,6 +49,13 @@ Sequential_iterator::get_music_list () const
   return SCM_EOL;
 }
 
+void
+Sequential_iterator::do_quit ()
+{
+  if (iter_) iter_->quit();
+}
+
+
 Sequential_iterator::Sequential_iterator (Sequential_iterator const &src)
   : Music_iterator (src)
 {
@@ -138,7 +145,7 @@ Sequential_iterator::construct_children ()
   if (gh_pair_p (cursor_))
     {
       Music *m  =unsmob_music (ly_car (cursor_));
-      iter_ = unsmob_iterator ( get_iterator (m));
+      iter_ = unsmob_iterator (get_iterator (m));
     }
   
   while (iter_ && !iter_->ok ())
@@ -195,6 +202,7 @@ Sequential_iterator::next_element (bool side_effect)
   
   cursor_ = ly_cdr (cursor_);
 
+  iter_->quit();
   if (gh_pair_p (cursor_))
     iter_ = unsmob_iterator (get_iterator (unsmob_music (ly_car (cursor_))));
   else
index 1079706bb6afb57df3722ed3cd4ed8c80a0456af..6b019e7861d2fd5323ed179e067a6daa735644e7 100644 (file)
@@ -37,5 +37,5 @@ IMPLEMENT_CTOR_CALLBACK (Sequential_music_iterator);
 SCM
 Sequential_music_iterator::get_music_list()const
 {
-  return  dynamic_cast<Music_sequence const*> (get_music ())->music_list ();
+  return dynamic_cast<Music_sequence const*> (get_music ())->music_list ();
 }
index 9b6858929db2af7738873d4605ff1269a0b7cd08..bb9e9c348979b549da481e283fab22deac87dc5a 100644 (file)
@@ -90,10 +90,11 @@ Simultaneous_music_iterator::construct_children ()
          *tail = scm_cons (scm_iter, *tail);
          tail = SCM_CDRLOC (*tail);
        }
+      else
+       mi->set_translator (0);
     }
 }
 
-
 void
 Simultaneous_music_iterator::process (Moment until)
 {
@@ -166,6 +167,12 @@ Simultaneous_music_iterator::try_music_in_children (Music *m) const
   return b;
 }
 
+void
+Simultaneous_music_iterator::do_quit ()
+{
+  for (SCM s = children_list_; gh_pair_p (s); s = gh_cdr(s))
+    unsmob_iterator (gh_car (s))->quit();
+}
 
 
 IMPLEMENT_CTOR_CALLBACK (Simultaneous_music_iterator);
index 02add4f0cf8853436fa1f3ad826e41aa76cc5887..a6ec31298d7e38bb2184f24ec138496a155d01e5 100644 (file)
@@ -159,7 +159,7 @@ Source_file::~Source_file ()
 {
   delete istream_;
   istream_ = 0;
-  delete contents_str0_;
+  delete[] contents_str0_;
 }
 
 Slice