From: <cli...@li...> - 2009-06-30 19:31:00
|
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.6933,1.6934 makemake.in,1.823,1.824 (Sam Steingold) 2. clisp/src ChangeLog,1.6934,1.6935 makemake.in,1.824,1.825 (Sam Steingold) 3. clisp/src ChangeLog, 1.6935, 1.6936 lispbibl.d, 1.876, 1.877 spvw.d, 1.499, 1.500 spvw_global.d, 1.36, 1.37 spvw_memfile.d, 1.143, 1.144 zthread.d, 1.63, 1.64 (Vladimir Tzankov) 4. clisp/tests mt.tst,1.16,1.17 (Vladimir Tzankov) 5. clisp/src ChangeLog,1.6936,1.6937 zthread.d,1.64,1.65 (Sam Steingold) 6. clisp/src ChangeLog,1.6937,1.6938 spvw.d,1.500,1.501 (Sam Steingold) 7. clisp/src ChangeLog,1.6938,1.6939 (Sam Steingold) ---------------------------------------------------------------------- Message: 1 Date: Tue, 30 Jun 2009 15:14:16 +0000 From: Sam Steingold <sd...@us...> Subject: clisp/src ChangeLog,1.6933,1.6934 makemake.in,1.823,1.824 To: cli...@li... Message-ID: <E1M...@dd...> Update of /cvsroot/clisp/clisp/src In directory ddv4jf1.ch3.sourceforge.com:/tmp/cvs-serv3554/src Modified Files: ChangeLog makemake.in Log Message: (cflags.h.stamp): fix a typo in CPPFLAGS Index: makemake.in =================================================================== RCS file: /cvsroot/clisp/clisp/src/makemake.in,v retrieving revision 1.823 retrieving revision 1.824 diff -u -d -r1.823 -r1.824 --- makemake.in 29 Jun 2009 17:58:39 -0000 1.823 +++ makemake.in 30 Jun 2009 15:14:14 -0000 1.824 @@ -2318,7 +2318,7 @@ echol echol "cflags.h.stamp : Makefile" echotab "echo $ARGQ/* generated from Makefile */$ARGQ > cflags.h.new" -for x in CC CFLAGS CPP CPPLAGS CLFLAGS LIBS X_LIBS; do +for x in CC CFLAGS CPP CPPFLAGS CLFLAGS LIBS X_LIBS; do echotab "echo $ARGQ#define $x \"\$($x)\"$ARGQ >> cflags.h.new" done if [ $TSYS = win32msvc ] ; then Index: ChangeLog =================================================================== RCS file: /cvsroot/clisp/clisp/src/ChangeLog,v retrieving revision 1.6933 retrieving revision 1.6934 diff -u -d -r1.6933 -r1.6934 --- ChangeLog 29 Jun 2009 20:54:10 -0000 1.6933 +++ ChangeLog 30 Jun 2009 15:14:14 -0000 1.6934 @@ -1,8 +1,12 @@ +2009-06-30 Reini Urban <ru...@x-...> + + * makemake.in (cflags.h.stamp): fix a typo in CPPFLAGS + 2009-06-29 Sam Steingold <sd...@gn...> * modules/rawsock/rawsock.c (parse_buffer_arg): set arg_ to the object to be pinned - (with_buffer_arg): add; ping and unpit arg + (with_buffer_arg): add; pin and unpin arg (RECV, RECVFROM, SOCK-READ, SEND, SENDTO, SOCK-WRITE) (IPCSUM, ICMPCSUM, TCPCSUM, UDPCSUM): use it instead of calling parse_buffer_arg directly ------------------------------ Message: 2 Date: Tue, 30 Jun 2009 16:27:01 +0000 From: Sam Steingold <sd...@us...> Subject: clisp/src ChangeLog,1.6934,1.6935 makemake.in,1.824,1.825 To: cli...@li... Message-ID: <E1M...@dd...> Update of /cvsroot/clisp/clisp/src In directory ddv4jf1.ch3.sourceforge.com:/tmp/cvs-serv16345/src Modified Files: ChangeLog makemake.in Log Message: (PRECIOUS_VARS): list all vars for cflags.h and anymodule in one place, keep in sync with ac_precious_vars Index: makemake.in =================================================================== RCS file: /cvsroot/clisp/clisp/src/makemake.in,v retrieving revision 1.824 retrieving revision 1.825 diff -u -d -r1.824 -r1.825 --- makemake.in 30 Jun 2009 15:14:14 -0000 1.824 +++ makemake.in 30 Jun 2009 16:26:59 -0000 1.825 @@ -2310,6 +2310,8 @@ QQUOT="\"" fi +# cf. ac_precious_vars in configure +PRECIOUS_VARS='CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP CXX CXXFLAGS X_LIBS' # Do not touch cflags.h when the changes to Makefile do not modify it. # Cost: maybe a few extra "echo"s on each make # Benefit: lispinit.mem is not re-dumped when we add something to MODULES @@ -2318,7 +2320,7 @@ echol echol "cflags.h.stamp : Makefile" echotab "echo $ARGQ/* generated from Makefile */$ARGQ > cflags.h.new" -for x in CC CFLAGS CPP CPPFLAGS CLFLAGS LIBS X_LIBS; do +for x in ${PRECIOUS_VARS}; do echotab "echo $ARGQ#define $x \"\$($x)\"$ARGQ >> cflags.h.new" done if [ $TSYS = win32msvc ] ; then @@ -3277,7 +3279,7 @@ echotab "if ${NEED_RECONFIGURE} ; then cd \$@ ; \\" echotab " ( cache="'`'"echo \$@/ | sed -e 's,[^/][^/]*//*,../,g'"'`'"config.cache; \\" echotab " if test -f \$\${cache} ; then . \$\${cache}; \\" -for var in CC CFLAGS CPPFLAGS CXXFLAGS LDFLAGS; do +for var in ${PRECIOUS_VARS}; do echotab " if test \"\$\${ac_cv_env_${var}_set}\" = set; then ${var}=\"\$\${ac_cv_env_${var}_value}\"; export ${var}; fi; \\" done # we must use $(SHELL) for sub-configures because when the top CONFIG_SHELL Index: ChangeLog =================================================================== RCS file: /cvsroot/clisp/clisp/src/ChangeLog,v retrieving revision 1.6934 retrieving revision 1.6935 diff -u -d -r1.6934 -r1.6935 --- ChangeLog 30 Jun 2009 15:14:14 -0000 1.6934 +++ ChangeLog 30 Jun 2009 16:26:59 -0000 1.6935 @@ -1,6 +1,7 @@ -2009-06-30 Reini Urban <ru...@x-...> +2009-06-30 Sam Steingold <sd...@gn...> - * makemake.in (cflags.h.stamp): fix a typo in CPPFLAGS + * makemake.in (PRECIOUS_VARS): list all vars for cflags.h and + anymodule in one place, keep in sync with ac_precious_vars 2009-06-29 Sam Steingold <sd...@gn...> ------------------------------ Message: 3 Date: Tue, 30 Jun 2009 16:47:23 +0000 From: Vladimir Tzankov <vt...@us...> Subject: clisp/src ChangeLog, 1.6935, 1.6936 lispbibl.d, 1.876, 1.877 spvw.d, 1.499, 1.500 spvw_global.d, 1.36, 1.37 spvw_memfile.d, 1.143, 1.144 zthread.d, 1.63, 1.64 To: cli...@li... Message-ID: <E1M...@dd...> Update of /cvsroot/clisp/clisp/src In directory ddv4jf1.ch3.sourceforge.com:/tmp/cvs-serv18829/src Modified Files: ChangeLog lispbibl.d spvw.d spvw_global.d spvw_memfile.d zthread.d Log Message: [MULTITHREAD]: remove the 128 active threads limit Index: spvw_memfile.d =================================================================== RCS file: /cvsroot/clisp/clisp/src/spvw_memfile.d,v retrieving revision 1.143 retrieving revision 1.144 diff -u -d -r1.143 -r1.144 --- spvw_memfile.d 15 Jun 2009 13:45:29 -0000 1.143 +++ spvw_memfile.d 30 Jun 2009 16:47:21 -0000 1.144 @@ -445,7 +445,7 @@ WRITE(thread->_ptr_symvalues,num_symvalues*sizeof(gcv_object_t)); }); we will use: */ - WRITE(allthreads[0]->_ptr_symvalues,num_symvalues*sizeof(gcv_object_t)); + WRITE(allthreads.head->_ptr_symvalues,num_symvalues*sizeof(gcv_object_t)); #endif { /* write module name: */ var DYNAMIC_ARRAY(module_names_buffer,char,module_names_size); @@ -1121,7 +1121,7 @@ maxnum_symvalues = max_symvalues; } /* read the thread symvalues for the only thread */ - READ(allthreads[0]->_ptr_symvalues,num_symvalues*sizeof(gcv_object_t)); + READ(allthreads.head->_ptr_symvalues,num_symvalues*sizeof(gcv_object_t)); #endif #ifdef SPVW_MIXED_BLOCKS_OPPOSITE @@ -1583,7 +1583,7 @@ for_all_constobjs( update(objptr); ); /* update object_tab */ #ifdef MULTITHREAD /* and now the per thread symbol bindings of the thread */ - var gcv_object_t* objptr = allthreads[0]->_ptr_symvalues; + var gcv_object_t* objptr = allthreads.head->_ptr_symvalues; var uintC count; dotimespC(count,num_symvalues,{ update(objptr); objptr++; }); #endif Index: zthread.d =================================================================== RCS file: /cvsroot/clisp/clisp/src/zthread.d,v retrieving revision 1.63 retrieving revision 1.64 diff -u -d -r1.63 -r1.64 --- zthread.d 28 Jun 2009 11:14:03 -0000 1.63 +++ zthread.d 30 Jun 2009 16:47:21 -0000 1.64 @@ -250,7 +250,9 @@ new_thread=create_thread(vstack_size); if (!new_thread) { unlock_threads(); - skipSTACK(5); VALUES1(NIL); return; + pushSTACK(NIL); /* CELL-ERROR Slot NAME */ + pushSTACK(S(make_thread)); + error(control_error,GETTEXT("~S: thread resource allocation failed")); } /* push 2 null objects in the thread stack to mark it's end (bottom) */ NC_pushSTACK(new_thread->_STACK,nullobj); @@ -260,14 +262,6 @@ /* push the initial bindings alist */ NC_pushSTACK(new_thread->_STACK,STACK_2); - if (register_thread(new_thread)<0) { - /* total failure */ - unlock_threads(); - delete_thread(new_thread); - VALUES1(NIL); - skipSTACK(5); - return; - } var object new_cons=popSTACK(); var object lthr=popSTACK(); skipSTACK(3); @@ -284,7 +278,10 @@ if (xthread_create(&TheThread(lthr)->xth_system, &thread_stub,new_thread,cstack_size)) { delete_thread(new_thread); - lthr = NIL;; + pushSTACK(NIL); /* CELL-ERROR Slot NAME */ + pushSTACK(S(make_thread)); + error(control_error,GETTEXT("~S: spawning OS thread failed")); + lthr = NIL; } VALUES1(lthr); } Index: ChangeLog =================================================================== RCS file: /cvsroot/clisp/clisp/src/ChangeLog,v retrieving revision 1.6935 retrieving revision 1.6936 diff -u -d -r1.6935 -r1.6936 --- ChangeLog 30 Jun 2009 16:26:59 -0000 1.6935 +++ ChangeLog 30 Jun 2009 16:47:21 -0000 1.6936 @@ -1,3 +1,24 @@ +2009-06-30 Vladimir Tzankov <vtz...@gm...> + + [MULTITHREAD]: remove the 128 active threads limit + * lispbibl.d (struct clisp_thread_t): add thr_next and thr_prev fields. + all threads are kept in double-linked list + (register_thread): remove + * spvw.d (allthreads): redefine it as structure containing the head and + tail of threads linked list + (register_thread): remove. the thread is "registered" after its creation + (single_running_threadp, current_stack_size, current_stack_base): use + new allthreads structure for checking + (create_thread): add the newly created thread structure to allthreads + (delete_thread): remove thread from allthreads + (for_all_threads): redefine to use allthreads structure + (install_async_signal_handlers) [WIN32_THREADS]: use maximum possible + semaphore count + * spvw_memfile.d: use allthreads.head to access single running thread + * spvw_global.d (gc_suspend_all_threads): re-implement. it used the + index in threads array before + * zthread.d (MAKE-THREAD): signal an error if thread creation fails + 2009-06-30 Sam Steingold <sd...@gn...> * makemake.in (PRECIOUS_VARS): list all vars for cflags.h and Index: spvw_global.d =================================================================== RCS file: /cvsroot/clisp/clisp/src/spvw_global.d,v retrieving revision 1.36 retrieving revision 1.37 diff -u -d -r1.36 -r1.37 --- spvw_global.d 24 May 2009 21:25:23 -0000 1.36 +++ spvw_global.d 30 Jun 2009 16:47:21 -0000 1.37 @@ -560,46 +560,33 @@ ASSERT(!spinlock_tryacquire(&mem.alloc_lock)); if (gc_suspend_count == 0) { /* first time here */ lock_threads(); - var bool all_suspended; - /* flags for indicating whether a thread acknowedge the suspension */ - var DYNAMIC_ARRAY(acklocked,uint8,nthreads); - begin_system_call(); - memset(acklocked,0,nthreads); - end_system_call(); + var uintC suspended_threads = 0; /* count of suspended threads */ for_all_threads({ - if (thread == me) continue; /* skip ourself */ + if (thread == me) { suspended_threads++; continue; } /* skip ourself */ if (!thread->_suspend_count) { /* if not already suspended */ xmutex_raw_lock(&thread->_gc_suspend_lock); /* enable thread waiting */ spinlock_release(&thread->_gc_suspend_request); /* request */ } else { - acklocked[thread->_index]=1; - /* increase the suspend count */ - thread->_suspend_count++; + suspended_threads++; /* count the thread */ + thread->_suspend_count++; /* increase the suspend count */ } }); /* TODO: this way of waiting for threads to acknowledge the suspend request is ugly and cause form of starvation sometimes. We need semaphore here */ - do { - all_suspended=true; + while (suspended_threads != allthreads.count) { for_all_threads({ /* skip ourself and all already suspended (ACK acquired) threads */ - if ((acklocked[thread->_index]) || (thread == me)) continue; + if (thread->_suspend_count || (thread == me)) continue; if (spinlock_tryacquire(&thread->_gc_suspend_ack)) { - acklocked[thread->_index]=1; - /* increase the suspend count */ - thread->_suspend_count++; + thread->_suspend_count++; /* increase the suspend count */ + suspended_threads++; /* count the thread */ /* try to get the suspend request lock. In case the thread is in blocking system call - this is important. */ spinlock_tryacquire(&thread->_gc_suspend_request); - } else { - all_suspended=false; - break; /* yield - give chance the threads to reach safe point*/ - } + } else { xthread_yield(); } }); - if (!all_suspended) xthread_yield(); else break; - } while (1); - FREE_DYNAMIC_ARRAY(acklocked); + } } gc_suspend_count++; /* increase the suspend count */ /* keep the lock on threads, but release the heap lock. Index: spvw.d =================================================================== RCS file: /cvsroot/clisp/clisp/src/spvw.d,v retrieving revision 1.499 retrieving revision 1.500 diff -u -d -r1.499 -r1.500 --- spvw.d 26 Jun 2009 15:43:06 -0000 1.499 +++ spvw.d 30 Jun 2009 16:47:21 -0000 1.500 @@ -309,6 +309,15 @@ /* Mutex protecting the set of threads. */ local xmutex_t allthreads_lock; +/* double linked list with all threads */ +local struct { + /* new threads are appended to the tail (when CTRL-C usually the first + thread is interrupted - probably "main thread").*/ + clisp_thread_t *head, *tail; + /* how many active threads we have. can be used to limit the number of + threads without scanning the list */ + uintC count; +} allthreads = { NULL, NULL, 0 }; /* per thread symvalues of special variables are allocated on "pages" of 1024 gcv_object_t each. Freshly new build clisp image contains less @@ -316,9 +325,6 @@ #define THREAD_SYMVALUES_ALLOCATION_SIZE (1024*sizeof(gcv_object_t)) #define SYMVALUES_PER_PAGE (THREAD_SYMVALUES_ALLOCATION_SIZE/sizeof(gcv_object_t)) /* Set of threads. */ -#define MAXNTHREADS 128 -local uintC nthreads = 0; -local clisp_thread_t* allthreads[MAXNTHREADS]; local xthread_t thr_signal_handler; /* the id of the signal handling thread */ /* the first index in _ptr_symvalues used for per thread symbol bindings */ @@ -341,7 +347,7 @@ global bool single_running_threadp(); global bool single_running_threadp() { - return nthreads==1; + return allthreads.head->thr_next == NULL; } #ifdef DEBUG_GCSAFETY @@ -505,7 +511,7 @@ local aint current_stack_base() { - if (!nthreads) { /* main thread ? */ + if (!allthreads.head) { /* main thread ? */ /* for practical reasons - not to have too much code that anyway will not make big difference - just use the current SP. This is basically good guess. It may fail if the threads globals are accessed by @@ -536,9 +542,9 @@ local size_t current_stack_size() { var size_t stack_size=0; - if (!nthreads) { + if (!allthreads.head) { /* This is the main thread - the only one that is initialized - before being registered (and thus nthreads=0). Use getrlimit(). + before being registered (thus threads list is empty). Use getrlimit(). What to do if we do not have getrlimit()? Currently we will crash.*/ var struct rlimit rl; if (getrlimit(RLIMIT_STACK, &rl) == 0) @@ -726,22 +732,6 @@ end_system_call(); } -/* UP: register a clisp-thread_t in global thread array - > thread: a newly allocated thread - < allthreads: modified (thread appended) - < new thread's index or -1 on failure - (if more than MAXNTHREADS are already present) - The caller should hold the global thread lock */ -global int register_thread(clisp_thread_t *thread) -{ - /* register lisp_thread to global thread list. */ - if (nthreads >= MAXNTHREADS) return -1; - thread->_index=nthreads; - allthreads[nthreads] = thread; - nthreads++; - return thread->_index; -} - /* UP: creates new cisp_thread_t structure and allocates LISP stack. > lisp_stack_size: the size of Lisp STACK to allocate (in gcv_object_t) when 0 - this is the very first thread, so we may(should not) @@ -750,6 +740,7 @@ It is always called with the main thread mutex locked. */ global clisp_thread_t* create_thread(uintM lisp_stack_size) { + /* TBD: may be limit the number of active threads? */ var clisp_thread_t* thread; begin_system_call(); thread=(clisp_thread_t *)malloc(sizeof(clisp_thread_t)); @@ -757,7 +748,6 @@ if (!thread) return NULL; begin_system_call(); memset(thread,0,sizeof(clisp_thread_t)); /* zero-up everything */ - thread->_index = MAXNTHREADS + 1; /* set to invalid value */ /* init _symvalues "proxy" */ thread->_ptr_symvalues = (gcv_object_t *)malloc(sizeof(gcv_object_t)* maxnum_symvalues); @@ -804,6 +794,15 @@ #ifndef NO_SP_CHECK thread->_SP_bound=0; #endif + /* add to allthreads list (at the end) */ + if (allthreads.tail) { + allthreads.tail->thr_next = thread; + thread->thr_prev = allthreads.tail; + allthreads.tail = thread; + } else { + allthreads.head = allthreads.tail = thread; + } + allthreads.count++; return thread; } @@ -818,22 +817,29 @@ xmutex_raw_destroy(&thread->_gc_suspend_lock); end_system_call(); - if (nthreads==1) { - /* this was the last LISP thread in the process - we are quiting */ + /* remove from threads list */ + if (thread->thr_prev) { /* ! first threads */ + thread->thr_prev->thr_next = thread->thr_next; + } else { + allthreads.head = thread->thr_next; + } + if (thread->thr_next) { /* ! last_thread */ + thread->thr_next->thr_prev = thread->thr_prev; + } else { + allthreads.tail = thread->thr_prev; + } + allthreads.count--; + + if (!allthreads.head) { /* this was the last thread ?*/ unlock_threads(); quit(); return; /* quit will unwind the stack and call hooks */ } - if (thread->_index < nthreads) { /* only if registered */ - ASSERT(allthreads[thread->_index] == thread); - allthreads[nthreads-1]->_index = thread->_index;; - allthreads[thread->_index] = allthreads[nthreads-1]; - nthreads--; - /* no globals for this thread record anymore */ - TheThread(thread->_lthread)->xth_globals = NULL; - /* DO NOT remove from global list of all threads. */ - /* O(all_threads) = deleteq(O(all_threads), thread->_lthread); */ - } + /* no globals for this thread record anymore */ + TheThread(thread->_lthread)->xth_globals = NULL; + /* DO NOT remove from global list of all threads - i.e. + O(all_threads) = deleteq(O(all_threads), thread->_lthread); */ + /* The LISP stack should be unwound so no interesting stuff on it. Let's deallocate it.*/ begin_system_call(); @@ -844,11 +850,12 @@ end_system_call(); unlock_threads(); } + #define for_all_threads(statement) \ - do { var clisp_thread_t** _pthread = &allthreads[0]; \ - var clisp_thread_t **endt=&allthreads[nthreads]; \ - while (_pthread != endt) \ - { var clisp_thread_t* thread = *_pthread++; statement; } \ + do { var clisp_thread_t *_cthread = allthreads.head; \ + while (_cthread) { \ + var clisp_thread_t *thread = _cthread; \ + _cthread=_cthread->thr_next; statement; } \ } while(0) /* UP: reallocates _ptr_symvalues in a thread - so there is a place for @@ -3763,7 +3770,6 @@ init_multithread(); init_heap_locks(); set_current_thread(create_thread(0)); - register_thread(current_thread()); #ifdef DEBUG_GCSAFETY use_dummy_alloccount=false; /* now we have threads */ current_thread()->_alloccount=1; @@ -4477,9 +4483,9 @@ local void install_async_signal_handlers() { wait_timeout=INFINITE; - sigint_semaphore=CreateSemaphore(NULL,0,MAXNTHREADS,NULL); + sigint_semaphore=CreateSemaphore(NULL,0,MAX_SEMAPHORE_COUNT,NULL); sigbreak_event=CreateEvent(NULL,TRUE,FALSE,NULL); - timeout_call_semaphore=CreateSemaphore(NULL,0,MAXNTHREADS,NULL); + timeout_call_semaphore=CreateSemaphore(NULL,0,MAX_SEMAPHORE_COUNT,NULL); SetConsoleCtrlHandler((PHANDLER_ROUTINE)console_handler,true); } Index: lispbibl.d =================================================================== RCS file: /cvsroot/clisp/clisp/src/lispbibl.d,v retrieving revision 1.876 retrieving revision 1.877 diff -u -d -r1.876 -r1.877 --- lispbibl.d 26 Jun 2009 19:33:19 -0000 1.876 +++ lispbibl.d 30 Jun 2009 16:47:21 -0000 1.877 @@ -16975,7 +16975,6 @@ gcv_object_t* _STACK_bound; gcv_object_t* _STACK_start; pinned_chain_t * _pinned; /* chain of pinned objects for this thread */ - uintC _index; /* this thread's index in allthreads[] */ /* moved here from pathname.d */ bool _running_handle_directory_encoding_error; /* do not rely on SA_NODEFER for signal nesting */ @@ -16990,6 +16989,10 @@ bool _thread_is_dying; /* the current thread. NOT GC VISIBLE. */ gcv_object_t _lthread; + /* previous and next thread. all active threads are kept in double + linked list*/ + struct clisp_thread_t *thr_prev; + struct clisp_thread_t *thr_next; } clisp_thread_t; /* following macro is "called" before thread can be suspended in debug @@ -17323,10 +17326,6 @@ Also frees any allocated resource. > thread: thread to be removed */ global void delete_thread(clisp_thread_t *thread); -/* register a clisp-thread_t in global thread array - thread - the new allocated thread. - When called the global thread lock should be held. */ -global int register_thread(clisp_thread_t *thread); /* locks the global thread array */ global void lock_threads (void); /* unlocks global thread array */ ------------------------------ Message: 4 Date: Tue, 30 Jun 2009 16:49:51 +0000 From: Vladimir Tzankov <vt...@us...> Subject: clisp/tests mt.tst,1.16,1.17 To: cli...@li... Message-ID: <E1M...@dd...> Update of /cvsroot/clisp/clisp/tests In directory ddv4jf1.ch3.sourceforge.com:/tmp/cvs-serv19143 Modified Files: mt.tst Log Message: do not run more than 300 (almost) concurrent threads Index: mt.tst =================================================================== RCS file: /cvsroot/clisp/clisp/tests/mt.tst,v retrieving revision 1.16 retrieving revision 1.17 diff -u -d -r1.16 -r1.17 --- mt.tst 27 Jun 2009 11:38:44 -0000 1.16 +++ mt.tst 30 Jun 2009 16:49:49 -0000 1.17 @@ -144,33 +144,40 @@ (sleep 0.5) NIL (thread-active-p *th1*) NIL ;; should be dead -;; There are max 128 concurrent threads possible (MAXNTHREADS in spvw.d). -;; If the limit is reached MAKE-THREAD will return NIL. So for the tests -;; below spawn more threads and we need following function. -(defun make-thread-always (function) - (do ((thr (mt:make-thread function) (mt:make-thread function))) - ((threadp thr) thr) - (thread-yield))) -make-thread-always +;; create thread with very tiny lisp stack (thus preserving memory) +;; on mac osx lisp heap overlaps lisp stack regions (malloc-ed) when +;; the number of thread with big stacks is very high (will be inspected +;; in details) +;; on all tested platforms (i386 linux, i386 osx, win32 mingw) having +;; more than 500 active threads causes lisp heap to overlap with malloc-ed +;; area (on osx it is less it seems) +;; probably some limit should be set for this + +(defun make-test-thread (function) + #+macos + (make-thread function :vstack-size 10000) + #-macos + (make-thread function)) +make-test-thread (let* ((mu (make-mutex :name "hash-table lock")) (ht (make-hash-table)) - (tl (loop :repeat 1000 :collect - (make-thread-always (lambda () - (mutex-lock mu) - (incf (gethash 1 ht 0)) - (mutex-unlock mu)))))) + (tl (loop :repeat 300 :collect + (make-test-thread (lambda () + (mutex-lock mu) + (incf (gethash 1 ht 0)) + (mutex-unlock mu)))))) ;; wait for all threads to finish (loop :while (some #'thread-active-p tl) :do (sleep 0.1)) (gethash 1 ht)) -1000 +300 -(let* ((count 1000) +(let* ((count 300) (pa (make-package (symbol-name (gensym "MT-TEST-")) :use ())) (tl (loop :for i :from 1 :to count :collect (let ((i i)) - (make-thread-always (lambda () - (intern (prin1-to-string i) pa))))))) + (make-test-thread (lambda () + (intern (prin1-to-string i) pa))))))) ;; wait for all threads to finish (loop :while (some #'thread-active-p tl) :do (sleep 0.1)) (let ((i 0)) @@ -178,7 +185,7 @@ (assert (= i count))) (setq tl (loop :for i :from 1 :to count :collect (let ((i i)) - (make-thread-always + (make-test-thread (lambda () (unintern (find-symbol (prin1-to-string i) pa) pa)))))) ;; wait for all threads to finish ------------------------------ Message: 5 Date: Tue, 30 Jun 2009 17:25:58 +0000 From: Sam Steingold <sd...@us...> Subject: clisp/src ChangeLog,1.6936,1.6937 zthread.d,1.64,1.65 To: cli...@li... Message-ID: <E1M...@dd...> Update of /cvsroot/clisp/clisp/src In directory ddv4jf1.ch3.sourceforge.com:/tmp/cvs-serv25025/src Modified Files: ChangeLog zthread.d Log Message: (MAKE-THREAD): CONTROL-ERROR is not a CELL-ERROR Index: zthread.d =================================================================== RCS file: /cvsroot/clisp/clisp/src/zthread.d,v retrieving revision 1.64 retrieving revision 1.65 diff -u -d -r1.64 -r1.65 --- zthread.d 30 Jun 2009 16:47:21 -0000 1.64 +++ zthread.d 30 Jun 2009 17:25:56 -0000 1.65 @@ -250,7 +250,6 @@ new_thread=create_thread(vstack_size); if (!new_thread) { unlock_threads(); - pushSTACK(NIL); /* CELL-ERROR Slot NAME */ pushSTACK(S(make_thread)); error(control_error,GETTEXT("~S: thread resource allocation failed")); } Index: ChangeLog =================================================================== RCS file: /cvsroot/clisp/clisp/src/ChangeLog,v retrieving revision 1.6936 retrieving revision 1.6937 diff -u -d -r1.6936 -r1.6937 --- ChangeLog 30 Jun 2009 16:47:21 -0000 1.6936 +++ ChangeLog 30 Jun 2009 17:25:56 -0000 1.6937 @@ -1,3 +1,7 @@ +2009-06-30 Sam Steingold <sd...@gn...> + + * zthread.d (MAKE-THREAD): CONTROL-ERROR is not a CELL-ERROR + 2009-06-30 Vladimir Tzankov <vtz...@gm...> [MULTITHREAD]: remove the 128 active threads limit ------------------------------ Message: 6 Date: Tue, 30 Jun 2009 17:49:26 +0000 From: Sam Steingold <sd...@us...> Subject: clisp/src ChangeLog,1.6937,1.6938 spvw.d,1.500,1.501 To: cli...@li... Message-ID: <E1M...@dd...> Update of /cvsroot/clisp/clisp/src In directory ddv4jf1.ch3.sourceforge.com:/tmp/cvs-serv28450/src Modified Files: ChangeLog spvw.d Log Message: (DROP_PRIVILEGES) [!UNIX]: avoid "warning: empty body in an if-statement" Index: spvw.d =================================================================== RCS file: /cvsroot/clisp/clisp/src/spvw.d,v retrieving revision 1.500 retrieving revision 1.501 diff -u -d -r1.500 -r1.501 --- spvw.d 30 Jun 2009 16:47:21 -0000 1.500 +++ spvw.d 30 Jun 2009 17:49:24 -0000 1.501 @@ -2467,7 +2467,7 @@ #if defined(UNIX) #define DROP_PRIVILEGES drop_privileges() #else - #define DROP_PRIVILEGES /*noop*/ + #define DROP_PRIVILEGES do { /*noop*/ } while(0) #endif /* Parse the command-line options. Index: ChangeLog =================================================================== RCS file: /cvsroot/clisp/clisp/src/ChangeLog,v retrieving revision 1.6937 retrieving revision 1.6938 diff -u -d -r1.6937 -r1.6938 --- ChangeLog 30 Jun 2009 17:25:56 -0000 1.6937 +++ ChangeLog 30 Jun 2009 17:49:23 -0000 1.6938 @@ -1,5 +1,10 @@ 2009-06-30 Sam Steingold <sd...@gn...> + * spvw.d (DROP_PRIVILEGES) [!UNIX]: avoid + warning: empty body in an if-statement + +2009-06-30 Sam Steingold <sd...@gn...> + * zthread.d (MAKE-THREAD): CONTROL-ERROR is not a CELL-ERROR 2009-06-30 Vladimir Tzankov <vtz...@gm...> ------------------------------ Message: 7 Date: Tue, 30 Jun 2009 19:29:55 +0000 From: Sam Steingold <sd...@us...> Subject: clisp/src ChangeLog,1.6938,1.6939 To: cli...@li... Message-ID: <E1M...@dd...> Update of /cvsroot/clisp/clisp/src In directory ddv4jf1.ch3.sourceforge.com:/tmp/cvs-serv12215/src Modified Files: ChangeLog Log Message: (ipcsum, icmpcsum, tcpcsum, udpcsum): declare static to avoid "warning: no previous declaration" Index: ChangeLog =================================================================== RCS file: /cvsroot/clisp/clisp/src/ChangeLog,v retrieving revision 1.6938 retrieving revision 1.6939 diff -u -d -r1.6938 -r1.6939 --- ChangeLog 30 Jun 2009 17:49:23 -0000 1.6938 +++ ChangeLog 30 Jun 2009 19:29:53 -0000 1.6939 @@ -1,5 +1,10 @@ 2009-06-30 Sam Steingold <sd...@gn...> + * modules/rawsock/rawsock.c (ipcsum, icmpcsum, tcpcsum, udpcsum): + declare static to avoid "warning: no previous declaration" + +2009-06-30 Sam Steingold <sd...@gn...> + * spvw.d (DROP_PRIVILEGES) [!UNIX]: avoid warning: empty body in an if-statement ------------------------------ ------------------------------------------------------------------------------ ------------------------------ _______________________________________________ clisp-cvs mailing list cli...@li... https://lists.sourceforge.net/lists/listinfo/clisp-cvs End of clisp-cvs Digest, Vol 38, Issue 42 ***************************************** |