From: Han-Wen Nienhuys Date: Sun, 24 Jul 2005 15:39:03 +0000 (+0000) Subject: (protect_smob): experiment: O(1) GC (un)protection. X-Git-Tag: release/2.7.3~8 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=8536db51578c1d3ba3da834e5a308c2790dd4f87;p=lilypond.git (protect_smob): experiment: O(1) GC (un)protection. --- diff --git a/lily/include/box.hh b/lily/include/box.hh index fc8eda7bec..55da1fb78d 100644 --- a/lily/include/box.hh +++ b/lily/include/box.hh @@ -8,10 +8,10 @@ #include "interval.hh" #include "offset.hh" -struct Box +class Box { Interval interval_a_[NO_AXES]; - +public: Interval &x () {return interval_a_[X_AXIS]; } Interval &y (){ return interval_a_[Y_AXIS]; } Interval x () const{ return interval_a_[X_AXIS]; } diff --git a/lily/include/ly-smobs.icc b/lily/include/ly-smobs.icc index 3a02164952..7497b66d36 100644 --- a/lily/include/ly-smobs.icc +++ b/lily/include/ly-smobs.icc @@ -64,7 +64,7 @@ CL *ptr = new CL (*this); \ SCM s; \ s = scm_cons (SCM_PACK (CL::smob_tag_), SCM_PACK (ptr)); \ - /* scm_gc_register_collectable_memory ((CL *)this, sizeof (CL), #CL " smob");*/ \ + scm_gc_register_collectable_memory ((CL *)this, sizeof (CL), #CL " smob"); \ \ return s; \ } @@ -102,7 +102,7 @@ SCM s; \ SCM_NEWSMOB (s, CL::smob_tag_, this); \ self_scm_ = s; \ - /* scm_gc_register_collectable_memory (this, sizeof (CL), #CL " smob");*/ \ + scm_gc_register_collectable_memory (this, sizeof (CL), #CL " smob"); \ return s; \ } diff --git a/lily/smobs.cc b/lily/smobs.cc new file mode 100644 index 0000000000..63d36f23a5 --- /dev/null +++ b/lily/smobs.cc @@ -0,0 +1,60 @@ +/* + smobs.cc -- implement Smob protection + + source file of the GNU LilyPond music typesetter + + (c) 2005 Han-Wen Nienhuys + +*/ + +#include "smobs.hh" + +static SCM smob_protection_list; + +void +init_smob_protection() +{ + smob_protection_list = scm_cons (SCM_UNDEFINED, SCM_EOL); + scm_permanent_object (smob_protection_list); +} +ADD_SCM_INIT_FUNC(init_smob_protection, init_smob_protection); + +void +protect_smob (SCM smob, SCM *prot_cons) +{ + SCM s = scm_cdr (smob_protection_list); + while (scm_is_pair (s) && scm_car (s) == SCM_UNDEFINED) + { + s = scm_cdr (s); + } + + SCM prot = scm_cons (smob, s); + scm_set_cdr_x (smob_protection_list, + prot); + *prot_cons = prot; +} + +void +unprotect_smob (SCM *prot_cons) +{ + SCM next = scm_cdr (*prot_cons); + + if (next == SCM_EOL) + { + scm_set_car_x (*prot_cons, SCM_UNDEFINED); + } + else + { + scm_set_car_x (*prot_cons, SCM_UNDEFINED); + while (scm_is_pair (next) + && scm_car (next) == SCM_UNDEFINED) + + { + next = scm_cdr (next); + } + + scm_set_cdr_x (*prot_cons, next); + } + + *prot_cons = SCM_EOL; +}