From: <cli...@li...> - 2009-09-25 12:03:46
|
Send clisp-cvs mailing list submissions to cli...@li... To subscribe or unsubscribe via the World Wide Web, visit https://lists.sourceforge.net/lists/listinfo/clisp-cvs or, via email, send a message with subject or body 'help' to cli...@li... You can reach the person managing the list at cli...@li... When replying, please edit your Subject line so it is more specific than "Re: Contents of clisp-cvs digest..." CLISP CVS commits for today Today's Topics: 1. clisp/src ChangeLog,1.7127,1.7128 package.d,1.127,1.128 (Vladimir Tzankov) ---------------------------------------------------------------------- Message: 1 Date: Fri, 25 Sep 2009 08:09:53 +0000 From: Vladimir Tzankov <vt...@us...> Subject: clisp/src ChangeLog,1.7127,1.7128 package.d,1.127,1.128 To: cli...@li... Message-ID: <E1M...@dd...> Update of /cvsroot/clisp/clisp/src In directory ddv4jf1.ch3.sourceforge.com:/tmp/cvs-serv20251/src Modified Files: ChangeLog package.d Log Message: (intern): fix possible races in MT builds. guard both - symtab lookup and insert with package mutex. Index: ChangeLog =================================================================== RCS file: /cvsroot/clisp/clisp/src/ChangeLog,v retrieving revision 1.7127 retrieving revision 1.7128 diff -u -d -r1.7127 -r1.7128 --- ChangeLog 23 Sep 2009 20:57:12 -0000 1.7127 +++ ChangeLog 25 Sep 2009 08:09:51 -0000 1.7128 @@ -1,3 +1,9 @@ +2009-09-25 Vladimir Tzankov <vtz...@gm...> + + * package.d (intern): fix possible races in MT builds. guard both - + symtab lookup and insert with package mutex. it was possible to have + different interned symbols with same print name + 2009-09-23 Sam Steingold <sd...@gn...> * makemake.in (lisp${SHREXT}): only define on with_dynamic_modules Index: package.d =================================================================== RCS file: /cvsroot/clisp/clisp/src/package.d,v retrieving revision 1.127 retrieving revision 1.128 diff -u -d -r1.127 -r1.128 --- package.d 17 Sep 2009 18:16:43 -0000 1.127 +++ package.d 25 Sep 2009 08:09:51 -0000 1.128 @@ -21,11 +21,11 @@ time - first all_package_lock should be obtained - such cases are use-package, unuse-package. -Symbol lookup and deletion are not guarded but are safe due to the way -symtab_insert and rehash_symtab work. On MT rehash_symtab always returns -newly allocated symtab that does not share nor modifies the old one - thus -any thread that may perform lookups on the old one will not be "surpised" by -modified internals (and intern (e.g. symtab_insert) is guarded by package mutex) +Symbol lookups are not guarded but are safe due to the way symtab_insert and +rehash_symtab work. On MT rehash_symtab always returns newly allocated symtab +that does not share nor modifies the old one - thus any thread that may perform +lookups on the old one will not be "surprised" by modified internals (and +intern (e.g. symtab_insert) is guarded by package mutex). This copy semantic on rehashing is slower than previous cons cell reuse but is better than obtaining lock on symbol lookup. @@ -809,36 +809,41 @@ 3, if available as internal symbol can trigger GC */ global maygc uintBWL intern (object string, bool invert, object pack, object* sym_) { - { - var sintBWL result = find_symbol(string,invert,pack,sym_); /* search */ - if (!(result==0)) - return result & 3; /* found -> finished */ - } - pushSTACK(pack); /* save package */ - if (pack_locked_p(pack)) { - /* when STRING comes from READ, it points to a re-usable buffer - that will be overwritten during the CERROR i/o - therefore we must copy and save it */ - pushSTACK(coerce_ss(string)); - cerror_package_locked(S(intern),STACK_1/*pack*/,STACK_0/*string*/); - string = popSTACK(); - } - if (invert) - string = string_invertcase(string); - string = coerce_imm_ss(string); /* string --> immutable simple-string */ - pushSTACK(make_symbol(string)); /* (make-symbol string) */ - var gcv_object_t *newsym_ = &STACK_0; + pushSTACK(string); + pushSTACK(pack); + pushSTACK(NIL); /* place for new symbol */ var gcv_object_t *pack_ = &STACK_1; - /* enter this new symbol into the package: */ - /* TODO: if we have lock free Symbtabs - this lock will not be needed.*/ + var gcv_object_t *string_ = &STACK_2; + var gcv_object_t *newsym_ = &STACK_0; + var uintBWL result = 0; + /* with locked package */ WITH_LISP_MUTEX_LOCK(0,false,&ThePackage(*pack_)->pack_mutex,{ - set_break_sem_2(); /* protect against breaks */ - make_present(*newsym_,*pack_); /* intern into this package */ - clr_break_sem_2(); /* allow breaks */ + result = find_symbol(*string_,invert,*pack_,sym_); /* search */ + if (!(result==0)) { + *newsym_ = *sym_; /* store at gc safe location */ + result &= 3; /* found -> finished */ + } else { + if (pack_locked_p(*pack_)) { + /* when STRING comes from READ, it points to a re-usable buffer + that will be overwritten during the CERROR i/o + therefore we must copy and save it */ + pushSTACK(coerce_ss(*string_)); + cerror_package_locked(S(intern),*pack_,STACK_0); + *string_ = popSTACK(); + } + if (invert) + *string_ = string_invertcase(*string_); + *string_ = coerce_imm_ss(*string_); /* string --> immutable simple-string */ + *newsym_ = make_symbol(*string_); /* (make-symbol string) */ + /* enter this new symbol into the package: */ + set_break_sem_2(); /* protect against breaks */ + make_present(*newsym_,*pack_); /* intern into this package */ + clr_break_sem_2(); /* allow breaks */ + } }); *sym_ = *newsym_; - skipSTACK(2); /* pack & sym */ - return 0; + skipSTACK(3); /* string, pack & newsym */ + return result; } /* UP: Interns a symbol of given printname into the keyword-package. ------------------------------ ------------------------------------------------------------------------------ Come build with us! The BlackBerry® Developer Conference in SF, CA is the only developer event you need to attend this year. Jumpstart your developing skills, take BlackBerry mobile applications to market and stay ahead of the curve. Join us from November 9-12, 2009. Register now! http://p.sf.net/sfu/devconf ------------------------------ _______________________________________________ clisp-cvs mailing list cli...@li... https://lists.sourceforge.net/lists/listinfo/clisp-cvs End of clisp-cvs Digest, Vol 41, Issue 41 ***************************************** |