From: <cli...@li...> - 2009-05-22 12:03:14
|
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.6866, 1.6867 lispbibl.d, 1.868, 1.869 zthread.d, 1.43, 1.44 (Vladimir Tzankov) ---------------------------------------------------------------------- Message: 1 Date: Thu, 21 May 2009 19:27:08 +0000 From: Vladimir Tzankov <vt...@us...> Subject: clisp/src ChangeLog, 1.6866, 1.6867 lispbibl.d, 1.868, 1.869 zthread.d, 1.43, 1.44 To: cli...@li... Message-ID: <E1M...@dd...> Update of /cvsroot/clisp/clisp/src In directory ddv4jf1.ch3.sourceforge.com:/tmp/cvs-serv18011/src Modified Files: ChangeLog lispbibl.d zthread.d Log Message: [MULITHREAD]: keep mutex records consistent in case of interrupts Index: zthread.d =================================================================== RCS file: /cvsroot/clisp/clisp/src/zthread.d,v retrieving revision 1.43 retrieving revision 1.44 diff -u -d -r1.43 -r1.44 --- zthread.d 20 May 2009 22:28:00 -0000 1.43 +++ zthread.d 21 May 2009 19:27:06 -0000 1.44 @@ -653,10 +653,26 @@ } } else { /* obtain the lock */ - GC_SAFE_MUTEX_LOCK(TheMutex(STACK_0)->xmu_system); - TheMutex(STACK_0)->xmu_owner = current_thread()->_lthread; - ASSERT(TheMutex(STACK_0)->xmu_recurse_count == 0); - TheMutex(STACK_0)->xmu_recurse_count++; + var clisp_thread_t *thr = current_thread(); + var gcv_object_t *mxrec = &STACK_0; /* in case of interrupt */ + var xmutex_t *m = TheMutex(STACK_0)->xmu_system; + + /* following is like GC_SAFE_MUTEX_LOCK() but does not possibly + handle the pending interrupts at the end */ + thr->_wait_mutex = m; + begin_system_call(); GC_SAFE_REGION_BEGIN(); + xmutex_lock(m); + thr->_wait_mutex = NULL; + /* do not (possibly) handle pending interrupts here since on non-local exit + from interrupt we may leave the mutex object in inconsistent state*/ + GC_SAFE_REGION_END_WITHOUT_INTERRUPTS(); end_system_call(); + + TheMutex(*mxrec)->xmu_owner = current_thread()->_lthread; + ASSERT(TheMutex(*mxrec)->xmu_recurse_count == 0); + TheMutex(*mxrec)->xmu_recurse_count++; + /* now the mutex record is in consistent state - handle pending + interrupts (if any) */ + HANDLE_PENDING_INTERRUPTS(thr); } VALUES1(popSTACK()); } @@ -745,22 +761,26 @@ } /* pthread_cond_wait() will release the OS mutex - so clear the owner. */ TheMutex(STACK_0)->xmu_owner = NIL; TheMutex(STACK_0)->xmu_recurse_count = 0; - /* get the pointer before we allow the GC to run :) */ + /* get the pointer before we allow the GC to run */ var xmutex_t *m = TheMutex(STACK_0)->xmu_system; var xcondition_t *c = TheExemption(STACK_1)->xco_system; + var gcv_object_t *mxrec = &STACK_0; /*in case of interrupt STACK_0 != mutex*/ clisp_thread_t *thr = current_thread(); var int res; + thr->_wait_condition = c; - begin_blocking_system_call(); + begin_system_call(); GC_SAFE_REGION_BEGIN(); res = xcondition_wait(c,m); thr->_wait_condition = NULL; - end_blocking_system_call(); + /* do not (possibly) handle pending interrupts here since on non-local exit + from interrupt we may leave the mutex object in inconsistent state*/ + GC_SAFE_REGION_END_WITHOUT_INTERRUPTS(); end_system_call(); + + /* set again the owner. even in case of error - this should be fine. */ + TheMutex(*mxrec)->xmu_owner = current_thread()->_lthread; + TheMutex(*mxrec)->xmu_recurse_count = 1; /* handle (if any) interrupts */ HANDLE_PENDING_INTERRUPTS(thr); - /* TODO: check for pending interrupts !!!*/ - /* set again the owner. even in case of error - this should be fine. */ - TheMutex(STACK_0)->xmu_owner = current_thread()->_lthread; - TheMutex(STACK_0)->xmu_recurse_count = 1; skipSTACK(1); VALUES1(popSTACK()); } Index: lispbibl.d =================================================================== RCS file: /cvsroot/clisp/clisp/src/lispbibl.d,v retrieving revision 1.868 retrieving revision 1.869 diff -u -d -r1.868 -r1.869 --- lispbibl.d 20 May 2009 22:28:00 -0000 1.868 +++ lispbibl.d 21 May 2009 19:27:05 -0000 1.869 @@ -9462,7 +9462,7 @@ }while(0) /* If we cannot get the suspend ack lock again - it means there is/was GC - so try to wait for it's end if it is not already finished. */ - #define GC_SAFE_REGION_END() \ + #define GC_SAFE_REGION_END_i(statement) \ do { \ GCTRIGGER(); \ var clisp_thread_t *thr=current_thread(); \ @@ -9472,9 +9472,13 @@ spinlock_acquire(&thr->_gc_suspend_ack); \ xmutex_raw_unlock(&thr->_gc_suspend_lock); \ thr->_raw_wait_mutex = NULL; \ - HANDLE_PENDING_INTERRUPTS(thr); \ + statement; \ } \ }while(0) + #define GC_SAFE_REGION_END() \ + GC_SAFE_REGION_END_i(HANDLE_PENDING_INTERRUPTS(thr)) + #define GC_SAFE_REGION_END_WITHOUT_INTERRUPTS() \ + GC_SAFE_REGION_END_i(;) #else /* ! MULTITHREAD */ #define GC_SAFE_POINT_IF(gc,no_gc) Index: ChangeLog =================================================================== RCS file: /cvsroot/clisp/clisp/src/ChangeLog,v retrieving revision 1.6866 retrieving revision 1.6867 diff -u -d -r1.6866 -r1.6867 --- ChangeLog 20 May 2009 22:27:59 -0000 1.6866 +++ ChangeLog 21 May 2009 19:27:05 -0000 1.6867 @@ -1,5 +1,18 @@ 2009-05-21 Vladimir Tzankov <vtz...@gm...> + [MULITHREAD]: keep mutex records consistent in case of interrupts + * lispbibl.d (GC_SAFE_REGION_END_i): was GC_SAFE_REGION_END(). added + statement to be executed when the control gets to lisp land + (GC_SAFE_REGION_END): use the above and handle pending interrupts at + the end + (GC_SAFE_REGION_END_WITHOUT_INTERRUPTS): ends GC safe regions and does + not handle pending interrupts + * zthread.d (MUTEX-LOCK): update mutex record before executing (if any) + pending interrupts since there may be non-local exit + (EXEMPTION-WAIT): ditto + +2009-05-21 Vladimir Tzankov <vtz...@gm...> + [MULTITHREAD]: POSIX compliant signal handling (again) * xthread.d: remove SOLARIS_THREADS (on Solaris POSIX_THREADS should be fine) ------------------------------ ------------------------------------------------------------------------------ Register Now for Creativity and Technology (CaT), June 3rd, NYC. CaT is a gathering of tech-side developers & brand creativity professionals. Meet the minds behind Google Creative Lab, Visual Complexity, Processing, & iPhoneDevCamp asthey present alongside digital heavyweights like Barbarian Group, R/GA, & Big Spaceship. http://www.creativitycat.com ------------------------------ _______________________________________________ clisp-cvs mailing list cli...@li... https://lists.sourceforge.net/lists/listinfo/clisp-cvs End of clisp-cvs Digest, Vol 37, Issue 12 ***************************************** |