From: <cli...@li...> - 2008-08-17 19:02:38
|
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.6440.4.6,1.6440.4.7 (Vladimir Tzankov) 2. clisp/src lispbibl.d, 1.806.2.6, 1.806.2.7 spvw.d, 1.439.2.4, 1.439.2.5 spvw_fault.d, 1.27, 1.27.2.1 spvw_genera1.d, 1.34, 1.34.2.1 spvw_heap.d, 1.14, 1.14.2.1 zthread.d, 1.7.2.6, 1.7.2.7 (Vladimir Tzankov) 3. clisp/modules/syscalls calls.c,1.244,1.245 (Sam Steingold) 4. clisp/modules/syscalls calls.c,1.245,1.246 (Sam Steingold) 5. clisp/src ChangeLog,1.6477,1.6478 (Sam Steingold) ---------------------------------------------------------------------- Message: 1 Date: Sat, 16 Aug 2008 21:51:53 +0000 From: Vladimir Tzankov <vt...@us...> Subject: clisp/src ChangeLog,1.6440.4.6,1.6440.4.7 To: cli...@li... Message-ID: <E1K...@ma...> Update of /cvsroot/clisp/clisp/src In directory sc8-pr-cvs4.sourceforge.net:/tmp/cvs-serv29602/src Modified Files: Tag: threads ChangeLog Log Message: GENERATIONAL_GC support. Thread xrecord changes. Index: ChangeLog =================================================================== RCS file: /cvsroot/clisp/clisp/src/ChangeLog,v retrieving revision 1.6440.4.6 retrieving revision 1.6440.4.7 diff -u -d -r1.6440.4.6 -r1.6440.4.7 --- ChangeLog 14 Aug 2008 14:17:59 -0000 1.6440.4.6 +++ ChangeLog 16 Aug 2008 21:51:48 -0000 1.6440.4.7 @@ -1,3 +1,31 @@ +2008-08-17 Vladimir Tzankov <vtz...@gm...> + GENERATIONAL_GC support. Thread xrecord changes. + + * lispbibl.d + (Thread): the record contains now a pointer (xth_globals) to the + clisp_thread_t structure (instead of separate pointers + to LISP stack, backtrace and TLS). + (push_threads_on_stack): global function to push all active + threads (in allthreads[] array) to the current thread LISP + stack. + * spvw.d + (push_threads_on_stack): implementation. + (delete_thread): big TODO here. See the comment at the end. + * spvw_heap.d + (physpage_state_t): added a cache_lock spinlock. During fault + handling single thread may manipulate the protection and cache. + * spvw_genera1.d + (build_old_generation_cache): initialize the cache_lock of + physpage_state_t structures. + * spvw_fault.d + (handle_fault): implement locking around cache and page protection + changes. PROT_READ_WRITE pages always return success now (it means + other fault has handled it before us). + * zthreads.d + (list_threads): implemented + (thread_yield): added safe for GC point. + (make_thread): initialize the xth_global of the Thread record. + 2008-08-14 Vladimir Tzankov <vtz...@gm...> DEBUG_GCSSAFETY implementation + REPL GC safe point. Builds with GENERATIONAL_GC will experience segfaults. ------------------------------ Message: 2 Date: Sat, 16 Aug 2008 21:54:28 +0000 From: Vladimir Tzankov <vt...@us...> Subject: clisp/src lispbibl.d, 1.806.2.6, 1.806.2.7 spvw.d, 1.439.2.4, 1.439.2.5 spvw_fault.d, 1.27, 1.27.2.1 spvw_genera1.d, 1.34, 1.34.2.1 spvw_heap.d, 1.14, 1.14.2.1 zthread.d, 1.7.2.6, 1.7.2.7 To: cli...@li... Message-ID: <E1K...@ma...> Update of /cvsroot/clisp/clisp/src In directory sc8-pr-cvs4.sourceforge.net:/tmp/cvs-serv30505/src Modified Files: Tag: threads lispbibl.d spvw.d spvw_fault.d spvw_genera1.d spvw_heap.d zthread.d Log Message: GENERATIONAL_GC support. Thread xrecord changes. Index: zthread.d =================================================================== RCS file: /cvsroot/clisp/clisp/src/zthread.d,v retrieving revision 1.7.2.6 retrieving revision 1.7.2.7 diff -u -d -r1.7.2.6 -r1.7.2.7 --- zthread.d 14 Aug 2008 14:18:03 -0000 1.7.2.6 +++ zthread.d 16 Aug 2008 21:54:26 -0000 1.7.2.7 @@ -19,14 +19,6 @@ #endif #define NC_pushSTACK(non_current_stack,obj) (NC_STACK_(non_current_stack,-1) = (obj), non_current_stack skipSTACKop -1) - -/* VTZ: copied from spvw.d for debugging/tracing */ -#if 0 -#define VAROUT(v) printf("[%s:%d] %s=%ld\n",__FILE__,__LINE__,STRING(v),v) -#else -#define VAROUT(v) -#endif - /* VTZ: All newly created threads start here. since we are replacing the C stack here - we do not want compiler to optimize this function in any way */ local /*maygc*/ void *thread_stub(void *arg) @@ -68,6 +60,7 @@ /* VTZ:TODO we have to copy the symvalues as well. */ /* thread creation is done withou begin/end_system_call !!! */ skipSTACK(2); + TheThread(new_thread->_lthread)->xth_globals=new_thread; register_thread(new_thread); if (xthread_create(&TheThread(new_thread->_lthread)->xth_system, &thread_stub,new_thread)) { @@ -160,9 +153,9 @@ LISPFUNN(thread_yield,0) { /* (THREAD-YIELD) */ - begin_system_call(); + begin_blocking_system_call(); xthread_yield(); - end_system_call(); + end_blocking_system_call(); VALUES1(current_thread()->_lthread); } @@ -213,7 +206,7 @@ LISPFUNN(list_threads,0) { /* (LIST-THREADS) */ - NOTREACHED; + VALUES1(listof(push_threads_on_stack())); } #endif /* MULTITHREAD */ Index: spvw_genera1.d =================================================================== RCS file: /cvsroot/clisp/clisp/src/spvw_genera1.d,v retrieving revision 1.34 retrieving revision 1.34.2.1 diff -u -d -r1.34 -r1.34.2.1 --- spvw_genera1.d 6 Jul 2008 22:50:29 -0000 1.34 +++ spvw_genera1.d 16 Aug 2008 21:54:26 -0000 1.34.2.1 @@ -386,6 +386,9 @@ dotimespL(count,physpage_count, { physpage->protection = PROT_READ; physpage->cache_size = 0; physpage->cache = NULL; + #if defined(MULTITHREAD) + spinlock_init(&physpage->cache_lock); + #endif physpage++; }); } Index: spvw_fault.d =================================================================== RCS file: /cvsroot/clisp/clisp/src/spvw_fault.d,v retrieving revision 1.27 retrieving revision 1.27.2.1 diff -u -d -r1.27 -r1.27.2.1 --- spvw_fault.d 6 Jul 2008 22:50:29 -0000 1.27 +++ spvw_fault.d 16 Aug 2008 21:54:26 -0000 1.27.2.1 @@ -24,7 +24,6 @@ #endif #ifdef GENERATIONAL_GC - /* Does the same as mprotect. Aborts if unsuccessful. */ local void xmprotect (aint addr, uintM len, int prot); @@ -83,7 +82,7 @@ } } /* superimpose page read-only: */ - if (mprotect((void*)address, physpagesize, PROT_READ) < 0) + if (mprotect((void*)address, physpagesize, PROT_READ) < 0) return -1; physpage->protection = PROT_READ; return 0; @@ -115,6 +114,7 @@ var uintL heapnr; var object obj = as_object((oint)address << oint_addr_shift); var aint pa_address = address & -physpagesize; /* page aligned address */ + #ifdef SPVW_PURE_BLOCKS heapnr = typecode(obj); #elif defined(SPVW_MIXED_BLOCKS_STAGGERED) @@ -134,23 +134,50 @@ { var uintL pageno = (pa_address>>physpageshift)-(heap->heap_gen0_start>>physpageshift); { + var int ret; var physpage_state_t* physpage = &heap->physpages[pageno]; + #if defined(MULTITHREAD) + spinlock_acquire(&physpage->cache_lock); + #endif switch (physpage->protection) { case PROT_NONE: /* protection: PROT_NONE -> PROT_READ */ - if (handle_read_fault(pa_address,physpage) < 0) - goto error6; - return handler_done; + ret=handle_read_fault(pa_address,physpage); + #if defined(MULTITHREAD) + spinlock_release(&physpage->cache_lock); + #endif + if (ret < 0) goto error6; + return handler_done; case PROT_READ: /* protection: PROT_READ -> PROT_READ_WRITE */ - if (handle_readwrite_fault(pa_address,physpage) < 0) - goto error7; + ret=handle_readwrite_fault(pa_address,physpage); + #if defined(MULTITHREAD) + spinlock_release(&physpage->cache_lock); + #endif + if (ret < 0) goto error7; return handler_done; case PROT_READ_WRITE: - goto error8; + /* it is very unlikely page that has PROT_READ_WRITE to cause + segfault. probably we are here, since a page that has been + PROT_READ or PROT_NONE, has changed to PROT_READ_WRITE while + we were waiting to be executed. + So we just return sucess here - other threads have done + what is required. + */ + #if defined(MULTITHREAD) + spinlock_release(&physpage->cache_lock); + #endif + return handler_done; + /* goto error8; */ default: + #if defined(MULTITHREAD) + spinlock_release(&physpage->cache_lock); + #endif goto error9; } + #if defined(MULTITHREAD) + spinlock_release(&physpage->cache_lock); + #endif error6: /* handle_read_fault() failed */ if (verbose) { var int saved_errno = OS_errno; Index: spvw_heap.d =================================================================== RCS file: /cvsroot/clisp/clisp/src/spvw_heap.d,v retrieving revision 1.14 retrieving revision 1.14.2.1 diff -u -d -r1.14 -r1.14.2.1 --- spvw_heap.d 13 Dec 2007 17:28:27 -0000 1.14 +++ spvw_heap.d 16 Aug 2008 21:54:26 -0000 1.14.2.1 @@ -61,6 +61,11 @@ PROT_READ_WRITE : only the page is valid. */ uintL cache_size; /* number of cached pointers */ old_new_pointer_t* cache; /* cache of all pointers into the new generation */ +#if defined(MULTITHREAD) + /* during fault handling we have to allow a single thread to + change this page cache */ + spinlock_t cache_lock; +#endif } physpage_state_t; #endif Index: spvw.d =================================================================== RCS file: /cvsroot/clisp/clisp/src/spvw.d,v retrieving revision 1.439.2.4 retrieving revision 1.439.2.5 diff -u -d -r1.439.2.4 -r1.439.2.5 --- spvw.d 14 Aug 2008 14:18:02 -0000 1.439.2.4 +++ spvw.d 16 Aug 2008 21:54:26 -0000 1.439.2.5 @@ -444,6 +444,11 @@ nthreads--; xmutex_destroy(&thread->_gc_suspend_lock); /* VTZ: deallocate all stuff (stacks) allocated above */ + TheThread(thread->_lthread)->xth_globals=NULL; + /* VTZ: TODO: hmm, it is not good to free this memory here. Since the LISP Thread + record is still alive (at least till there are references to it and it may + reference the below free memory). It is best to have some kind of finalizer + that will be executed by GC and will free this memory. */ free(THREAD_LISP_STACK_START(thread)); free(thread); unlock_threads(); @@ -455,6 +460,27 @@ { var clisp_thread_t* thread = *--_pthread; statement; } \ } while(0) +/* + Pushes all active LISP thread objects on the current LISP stack. + The function is here since it relies on internal threads representation - + via the allthreads[] array. This may change later - I do not want to make + nthreads and allthreads[] global. returns the items pushed on the stack. + called by (list_threads). +*/ +global uintC push_threads_on_stack() +{ + begin_blocking_system_call(); + lock_threads(); + end_blocking_system_call(); + var uintC count=nthreads; + for_all_threads({pushSTACK(thread->_lthread);});/* push everything on stack */ + /* the unlocking should not be blocking. */ + begin_system_call(); + unlock_threads(); + end_system_call(); + return count; +} + /* Add a new symbol value. > value: the default value in all threads < returns: the index in the every thread's _symvalues[] array */ Index: lispbibl.d =================================================================== RCS file: /cvsroot/clisp/clisp/src/lispbibl.d,v retrieving revision 1.806.2.6 retrieving revision 1.806.2.7 diff -u -d -r1.806.2.6 -r1.806.2.7 --- lispbibl.d 14 Aug 2008 14:18:01 -0000 1.806.2.6 +++ lispbibl.d 16 Aug 2008 21:54:25 -0000 1.806.2.7 @@ -4269,7 +4269,7 @@ #endif /* Algorithm by Morris, that compacts Conses without mixing them up: */ -#if defined(SPVW_BLOCKS) && defined(VIRTUAL_MEMORY) && !defined(NO_MORRIS_GC) && !defined(MULTITHREAD) +#if defined(SPVW_BLOCKS) && defined(VIRTUAL_MEMORY) && !defined(NO_MORRIS_GC) /* && !defined(MULTITHREAD) */ /* Morris-GC is recommended, as it preserves the locality. */ #define MORRIS_GC #endif @@ -6850,14 +6850,15 @@ #include "xthread.c" +/* forward declaration */ +struct clisp_thread_t; + typedef struct { XRECORD_HEADER gcv_object_t xth_name _attribute_aligned_object_; /* name */ gcv_object_t xth_next _attribute_aligned_object_; /* next thread */ gcv_object_t xth_prev _attribute_aligned_object_; /* previous thread */ - gcv_object_t *xth_tlvs; /* thread-local values */ - gcv_object_t *xth_stack; /* the thread stack */ - struct backtrace_t *xth_bt; /* the backtrace */ + struct clisp_thread_t *xth_globals; /* all thread specific things */ xthread_t xth_system; /* OS object */ } * Thread; #define thread_length 3 @@ -16957,13 +16958,16 @@ /* unlocks global thread array */ global void unlock_threads(); /* Suspends all running threads /besides the current/ on GC safe points/regions. - if lock_heap is true the heap is locked first. - (this is needed since GC may be called from allocation or explicitly - when - the heap lock is not held) */ + if lock_heap is true the heap is locked first. + (this is needed since GC may be called from allocation or explicitly - when + the heap lock is not held) */ global void gc_suspend_all_threads(bool lock_heap); /* Resumes all suspended threads /besides the current/ should match a call to suspend_all_threads() */ global void gc_resume_all_threads(bool unlock_heap); +/* pushes all active LISP thread records on the current LISP stack. + returns the items pushed on the stack. */ +global uintC push_threads_on_stack(); #define GC_STOP_WORLD(lock_heap) gc_suspend_all_threads(lock_heap) #define GC_RESUME_WORLD(unlock_heap) gc_resume_all_threads(unlock_heap) ------------------------------ Message: 3 Date: Sun, 17 Aug 2008 01:04:35 +0000 From: Sam Steingold <sd...@us...> Subject: clisp/modules/syscalls calls.c,1.244,1.245 To: cli...@li... Message-ID: <E1K...@ma...> Update of /cvsroot/clisp/clisp/modules/syscalls In directory sc8-pr-cvs4.sourceforge.net:/tmp/cvs-serv1901/modules/syscalls Modified Files: calls.c Log Message: yet another fix for set-file-size on woe32 Index: calls.c =================================================================== RCS file: /cvsroot/clisp/clisp/modules/syscalls/calls.c,v retrieving revision 1.244 retrieving revision 1.245 diff -u -d -r1.244 -r1.245 --- calls.c 15 Aug 2008 21:20:03 -0000 1.244 +++ calls.c 17 Aug 2008 01:04:32 -0000 1.245 @@ -380,7 +380,7 @@ FILE_ATTRIBUTE_NORMAL,NULL); if (fd == INVALID_HANDLE_VALUE) OS_file_error(STACK_0); - if (0 == SetFilePointerEx(fd,length,NULL,FILE_BEGIN)) + if (0 == SetFilePointerEx(fd,*length,NULL,FILE_BEGIN)) OS_file_error(STACK_0); if (0 == SetEndOfFile(fd)) OS_file_error(STACK_0); @@ -400,9 +400,9 @@ begin_system_call(); #if defined(WIN32_NATIVE) LARGE_INTEGER cur_pos; - if (0 == SetFilePointerEx(fd,0,&cur_pos,FILE_CURRENT)) + if (0 == SetFilePointerEx(fd,{0;0},&cur_pos,FILE_CURRENT)) OS_filestream_error(STACK_0); - if (0 == SetFilePointerEx(fd,length,NULL,FILE_BEGIN)) + if (0 == SetFilePointerEx(fd,*length,NULL,FILE_BEGIN)) OS_filestream_error(STACK_0); if (0 == SetEndOfFile(fd)) OS_filestream_error(STACK_0); ------------------------------ Message: 4 Date: Sun, 17 Aug 2008 14:38:40 +0000 From: Sam Steingold <sd...@us...> Subject: clisp/modules/syscalls calls.c,1.245,1.246 To: cli...@li... Message-ID: <E1K...@ma...> Update of /cvsroot/clisp/clisp/modules/syscalls In directory sc8-pr-cvs4.sourceforge.net:/tmp/cvs-serv809/modules/syscalls Modified Files: calls.c Log Message: (path_truncate, stream_truncate): call end_system_call before signaling errors Index: calls.c =================================================================== RCS file: /cvsroot/clisp/clisp/modules/syscalls/calls.c,v retrieving revision 1.245 retrieving revision 1.246 diff -u -d -r1.245 -r1.246 --- calls.c 17 Aug 2008 01:04:32 -0000 1.245 +++ calls.c 17 Aug 2008 14:38:38 -0000 1.246 @@ -376,19 +376,20 @@ static void path_truncate (const char *path, file_offset_t *length) { begin_system_call(); #if defined(WIN32_NATIVE) - HANDLE fd = CreateFile(path,GENERIC_WRITE,0,NULL,OPEN_EXISTING, - FILE_ATTRIBUTE_NORMAL,NULL); - if (fd == INVALID_HANDLE_VALUE) - OS_file_error(STACK_0); - if (0 == SetFilePointerEx(fd,*length,NULL,FILE_BEGIN)) - OS_file_error(STACK_0); - if (0 == SetEndOfFile(fd)) - OS_file_error(STACK_0); - if (0 == CloseHandle(fd)) - OS_file_error(STACK_0); + { HANDLE fd = CreateFile(path,GENERIC_WRITE,0,NULL,OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL,NULL); + if (fd == INVALID_HANDLE_VALUE) + { end_system_call(); OS_file_error(STACK_0); } + if (0 == SetFilePointerEx(fd,*length,NULL,FILE_BEGIN)) + { end_system_call(); OS_file_error(STACK_0); } + if (0 == SetEndOfFile(fd)) + { end_system_call(); OS_file_error(STACK_0); } + if (0 == CloseHandle(fd)) + { end_system_call(); OS_file_error(STACK_0); } + } #elif defined(HAVE_TRUNCATE) if (truncate(path,*length)) - OS_file_error(STACK_0); + { end_system_call(); OS_file_error(STACK_0); } #else #error FILE-SIZE: no truncate and not woe32 #endif @@ -399,18 +400,19 @@ static void stream_truncate (Handle fd, file_offset_t *length) { begin_system_call(); #if defined(WIN32_NATIVE) - LARGE_INTEGER cur_pos; - if (0 == SetFilePointerEx(fd,{0;0},&cur_pos,FILE_CURRENT)) - OS_filestream_error(STACK_0); - if (0 == SetFilePointerEx(fd,*length,NULL,FILE_BEGIN)) - OS_filestream_error(STACK_0); - if (0 == SetEndOfFile(fd)) - OS_filestream_error(STACK_0); - if (0 == SetFilePointerEx(fd,cur_pos,NULL,FILE_BEGIN)) - OS_filestream_error(STACK_0); + { LARGE_INTEGER cur_pos; + if (0 == SetFilePointerEx(fd,{0;0},&cur_pos,FILE_CURRENT)) + { end_system_call(); OS_filestream_error(STACK_0); } + if (0 == SetFilePointerEx(fd,*length,NULL,FILE_BEGIN)) + { end_system_call(); OS_filestream_error(STACK_0); } + if (0 == SetEndOfFile(fd)) + { end_system_call(); OS_filestream_error(STACK_0); } + if (0 == SetFilePointerEx(fd,cur_pos,NULL,FILE_BEGIN)) + { end_system_call(); OS_filestream_error(STACK_0); } + } #elif defined(HAVE_FTRUNCATE) if (ftruncate(fd,*length)) - OS_file_error(STACK_0); + { end_system_call(); OS_file_error(STACK_0); } #else #error FILE-SIZE: no ftruncate and not woe32 #endif ------------------------------ Message: 5 Date: Sun, 17 Aug 2008 14:38:41 +0000 From: Sam Steingold <sd...@us...> Subject: clisp/src ChangeLog,1.6477,1.6478 To: cli...@li... Message-ID: <E1K...@ma...> Update of /cvsroot/clisp/clisp/src In directory sc8-pr-cvs4.sourceforge.net:/tmp/cvs-serv809/src Modified Files: ChangeLog Log Message: (path_truncate, stream_truncate): call end_system_call before signaling errors Index: ChangeLog =================================================================== RCS file: /cvsroot/clisp/clisp/src/ChangeLog,v retrieving revision 1.6477 retrieving revision 1.6478 diff -u -d -r1.6477 -r1.6478 --- ChangeLog 15 Aug 2008 20:17:00 -0000 1.6477 +++ ChangeLog 17 Aug 2008 14:38:38 -0000 1.6478 @@ -1,3 +1,8 @@ +2008-08-17 Sam Steingold <sd...@gn...> + + * modules/syscalls/calls.c (path_truncate, stream_truncate): call + end_system_call(); before signaling errors + 2008-08-15 Sam Steingold <sd...@gn...> * modules/syscalls/calls.c (path_truncate, stream_truncate, FILE-SIZE): ------------------------------ ------------------------------------------------------------------------- This SF.Net email is sponsored by the Moblin Your Move Developer's challenge Build the coolest Linux based applications with Moblin SDK & win great prizes Grand prize is a trip for two to an Open Source event anywhere in the world http://moblin-contest.org/redirect.php?banner_id=100&url=/ ------------------------------ _______________________________________________ clisp-cvs mailing list cli...@li... https://lists.sourceforge.net/lists/listinfo/clisp-cvs End of clisp-cvs Digest, Vol 28, Issue 18 ***************************************** |