From d3b9baedd7d8626b19f5755e9fa9617e3641f24c Mon Sep 17 00:00:00 2001 From: Han-Wen Nienhuys Date: Mon, 9 Sep 2002 10:45:20 +0000 Subject: [PATCH] * lily/music-iterator.cc (quit, do_quit): new function: break link 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. --- lily/chord-tremolo-iterator.cc | 7 ++++++ lily/folded-repeat-iterator.cc | 8 +++++++ lily/include/chord-tremolo-iterator.hh | 1 + lily/include/folded-repeat-iterator.hh | 1 + lily/include/interpretation-context-handle.hh | 1 + lily/include/lyric-combine-music-iterator.hh | 1 + lily/include/music-iterator.hh | 7 +++++- lily/include/music-wrapper-iterator.hh | 1 + lily/include/part-combine-music-iterator.hh | 1 + lily/include/percent-repeat-iterator.hh | 1 + lily/include/sequential-iterator.hh | 1 + lily/include/simple-music-iterator.hh | 1 + lily/include/simultaneous-music-iterator.hh | 1 + lily/interpretation-context-handle.cc | 18 +++++++++++++-- lily/lily-guile.cc | 2 +- lily/lyric-combine-music-iterator.cc | 20 ++++++++-------- lily/music-iterator.cc | 23 +++++++++++++++++++ lily/music-wrapper-iterator.cc | 6 +++++ lily/part-combine-music-iterator.cc | 8 ++++++- lily/percent-repeat-iterator.cc | 5 ++++ lily/score.cc | 1 + lily/sequential-iterator.cc | 10 +++++++- lily/sequential-music-iterator.cc | 2 +- lily/simultaneous-music-iterator.cc | 9 +++++++- lily/source-file.cc | 2 +- 25 files changed, 120 insertions(+), 18 deletions(-) diff --git a/lily/chord-tremolo-iterator.cc b/lily/chord-tremolo-iterator.cc index 4c602c8917..b4d7696968 100644 --- a/lily/chord-tremolo-iterator.cc +++ b/lily/chord-tremolo-iterator.cc @@ -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 { diff --git a/lily/folded-repeat-iterator.cc b/lily/folded-repeat-iterator.cc index 92baa19021..3a90567566 100644 --- a/lily/folded-repeat-iterator.cc +++ b/lily/folded-repeat-iterator.cc @@ -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 (get_music ()); + main_iter_->quit (); main_iter_ = 0; main_length_mom_ += mus->body ()->length_mom (); } diff --git a/lily/include/chord-tremolo-iterator.hh b/lily/include/chord-tremolo-iterator.hh index ef8a753cd7..de5344874a 100644 --- a/lily/include/chord-tremolo-iterator.hh +++ b/lily/include/chord-tremolo-iterator.hh @@ -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) ; diff --git a/lily/include/folded-repeat-iterator.hh b/lily/include/folded-repeat-iterator.hh index 40fdedafd6..4768ba0b90 100644 --- a/lily/include/folded-repeat-iterator.hh +++ b/lily/include/folded-repeat-iterator.hh @@ -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: diff --git a/lily/include/interpretation-context-handle.hh b/lily/include/interpretation-context-handle.hh index 0dbf9431a5..93786a5203 100644 --- a/lily/include/interpretation-context-handle.hh +++ b/lily/include/interpretation-context-handle.hh @@ -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 (); diff --git a/lily/include/lyric-combine-music-iterator.hh b/lily/include/lyric-combine-music-iterator.hh index be19f67d27..e85fc6ab63 100644 --- a/lily/include/lyric-combine-music-iterator.hh +++ b/lily/include/lyric-combine-music-iterator.hh @@ -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; diff --git a/lily/include/music-iterator.hh b/lily/include/music-iterator.hh index 9db8e9c640..e005bd60d3 100644 --- a/lily/include/music-iterator.hh +++ b/lily/include/music-iterator.hh @@ -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_; diff --git a/lily/include/music-wrapper-iterator.hh b/lily/include/music-wrapper-iterator.hh index d832a59ab9..2d985372e8 100644 --- a/lily/include/music-wrapper-iterator.hh +++ b/lily/include/music-wrapper-iterator.hh @@ -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); diff --git a/lily/include/part-combine-music-iterator.hh b/lily/include/part-combine-music-iterator.hh index a2da0cabfd..fa88a2dc5e 100644 --- a/lily/include/part-combine-music-iterator.hh +++ b/lily/include/part-combine-music-iterator.hh @@ -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; diff --git a/lily/include/percent-repeat-iterator.hh b/lily/include/percent-repeat-iterator.hh index 2d3effda54..a2c420e01f 100644 --- a/lily/include/percent-repeat-iterator.hh +++ b/lily/include/percent-repeat-iterator.hh @@ -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) ; diff --git a/lily/include/sequential-iterator.hh b/lily/include/sequential-iterator.hh index 3962136015..554e3657c2 100644 --- a/lily/include/sequential-iterator.hh +++ b/lily/include/sequential-iterator.hh @@ -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; diff --git a/lily/include/simple-music-iterator.hh b/lily/include/simple-music-iterator.hh index 5fdb418261..d154b14461 100644 --- a/lily/include/simple-music-iterator.hh +++ b/lily/include/simple-music-iterator.hh @@ -29,6 +29,7 @@ public: virtual void process (Moment); virtual bool ok ()const; virtual Moment pending_moment ()const; + virtual void skip (Moment); }; diff --git a/lily/include/simultaneous-music-iterator.hh b/lily/include/simultaneous-music-iterator.hh index 78e7a941b5..198b47152d 100644 --- a/lily/include/simultaneous-music-iterator.hh +++ b/lily/include/simultaneous-music-iterator.hh @@ -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); diff --git a/lily/interpretation-context-handle.cc b/lily/interpretation-context-handle.cc index 3c1e38153a..e1da362bed 100644 --- a/lily/interpretation-context-handle.cc +++ b/lily/interpretation-context-handle.cc @@ -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_; } diff --git a/lily/lily-guile.cc b/lily/lily-guile.cc index 2a3e3f19ef..7a08f7d3f3 100644 --- a/lily/lily-guile.cc +++ b/lily/lily-guile.cc @@ -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 ("]"); diff --git a/lily/lyric-combine-music-iterator.cc b/lily/lyric-combine-music-iterator.cc index cd1b204225..fc4d7c2b41 100644 --- a/lily/lyric-combine-music-iterator.cc +++ b/lily/lyric-combine-music-iterator.cc @@ -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* diff --git a/lily/music-iterator.cc b/lily/music-iterator.cc index a1ee052f06..d4ea1f1b96 100644 --- a/lily/music-iterator.cc +++ b/lily/music-iterator.cc @@ -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() +{ +} diff --git a/lily/music-wrapper-iterator.cc b/lily/music-wrapper-iterator.cc index e2c481ddf0..7798d65eaf 100644 --- a/lily/music-wrapper-iterator.cc +++ b/lily/music-wrapper-iterator.cc @@ -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 { diff --git a/lily/part-combine-music-iterator.cc b/lily/part-combine-music-iterator.cc index 09f019e990..9c7efd35c5 100644 --- a/lily/part-combine-music-iterator.cc +++ b/lily/part-combine-music-iterator.cc @@ -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! */ diff --git a/lily/percent-repeat-iterator.cc b/lily/percent-repeat-iterator.cc index 285d114e93..4e8dac48a9 100644 --- a/lily/percent-repeat-iterator.cc +++ b/lily/percent-repeat-iterator.cc @@ -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) { diff --git a/lily/score.cc b/lily/score.cc index 0378a6f115..ceb327d9ec 100644 --- a/lily/score.cc +++ b/lily/score.cc @@ -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 (); diff --git a/lily/sequential-iterator.cc b/lily/sequential-iterator.cc index 242f8af15d..95bd2729f1 100644 --- a/lily/sequential-iterator.cc +++ b/lily/sequential-iterator.cc @@ -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 diff --git a/lily/sequential-music-iterator.cc b/lily/sequential-music-iterator.cc index 1079706bb6..6b019e7861 100644 --- a/lily/sequential-music-iterator.cc +++ b/lily/sequential-music-iterator.cc @@ -37,5 +37,5 @@ IMPLEMENT_CTOR_CALLBACK (Sequential_music_iterator); SCM Sequential_music_iterator::get_music_list()const { - return dynamic_cast (get_music ())->music_list (); + return dynamic_cast (get_music ())->music_list (); } diff --git a/lily/simultaneous-music-iterator.cc b/lily/simultaneous-music-iterator.cc index 9b6858929d..bb9e9c3489 100644 --- a/lily/simultaneous-music-iterator.cc +++ b/lily/simultaneous-music-iterator.cc @@ -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); diff --git a/lily/source-file.cc b/lily/source-file.cc index 02add4f0cf..a6ec31298d 100644 --- a/lily/source-file.cc +++ b/lily/source-file.cc @@ -159,7 +159,7 @@ Source_file::~Source_file () { delete istream_; istream_ = 0; - delete contents_str0_; + delete[] contents_str0_; } Slice -- 2.39.5