From: <cli...@li...> - 2008-08-18 19:03:31
|
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/modules/syscalls calls.c,1.246,1.247 (Sam Steingold) 2. clisp/src ChangeLog,1.6478,1.6479 (Sam Steingold) 3. clisp/src ChangeLog, 1.6440.4.7, 1.6440.4.8 spvw_global.d, 1.24.2.3, 1.24.2.4 (Vladimir Tzankov) 4. clisp/doc impbody.xml,1.539,1.540 (Sam Steingold) 5. clisp/modules/syscalls calls.c,1.247,1.248 (Sam Steingold) 6. clisp/src ChangeLog,1.6479,1.6480 (Sam Steingold) ---------------------------------------------------------------------- Message: 1 Date: Mon, 18 Aug 2008 01:26:35 +0000 From: Sam Steingold <sd...@us...> Subject: clisp/modules/syscalls calls.c,1.246,1.247 To: cli...@li... Message-ID: <E1K...@ma...> Update of /cvsroot/clisp/clisp/modules/syscalls In directory sc8-pr-cvs4.sourceforge.net:/tmp/cvs-serv9344/modules/syscalls Modified Files: calls.c Log Message: (I_to_file_offset, FILE-SIZE) [WIN32_NATIVE]: use LARGE_INTEGER.QuadPart (stream_truncate) [WIN32_NATIVE]: fix LARGE_INTEGER literal Index: calls.c =================================================================== RCS file: /cvsroot/clisp/clisp/modules/syscalls/calls.c,v retrieving revision 1.246 retrieving revision 1.247 diff -u -d -r1.246 -r1.247 --- calls.c 17 Aug 2008 14:38:38 -0000 1.246 +++ calls.c 18 Aug 2008 01:26:33 -0000 1.247 @@ -359,11 +359,8 @@ #if defined(WIN32_NATIVE) typedef LARGE_INTEGER file_offset_t; -static inline void I_to_file_offset (object obj, file_offset_t *length) { - sint64 off = I_to_sint64(check_sint64(obj)); - length->HighPart = (LONG)(off >> 32); - length->LowPart = (DWORD)off; -} +static inline void I_to_file_offset (object obj, file_offset_t *length) +{ length->QuadPart = I_to_sint64(check_sint64(obj)); } #elif defined(UNIX) typedef off_t file_offset_t; static inline void I_to_file_offset (object obj, file_offset_t *length) @@ -401,7 +398,8 @@ begin_system_call(); #if defined(WIN32_NATIVE) { LARGE_INTEGER cur_pos; - if (0 == SetFilePointerEx(fd,{0;0},&cur_pos,FILE_CURRENT)) + if (0 == SetFilePointerEx(fd,(LARGE_INTEGER){QuadPart: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); } @@ -465,7 +463,7 @@ with_string_0(value1 = physical_namestring(STACK_0), GLO(pathname_encoding), namez, { if (GetFileSizeEx(namez,&length)) OS_file_error(value1); }); - VALUES1(L2_to_I(length.HighPart,length.LowPart)); + VALUES1(off_to_I(length.QuadPart)); #elif defined(HAVE_STAT) struct stat stat; if (stat_obj(STACK_0,&stat)) ------------------------------ Message: 2 Date: Mon, 18 Aug 2008 01:26:37 +0000 From: Sam Steingold <sd...@us...> Subject: clisp/src ChangeLog,1.6478,1.6479 To: cli...@li... Message-ID: <E1K...@ma...> Update of /cvsroot/clisp/clisp/src In directory sc8-pr-cvs4.sourceforge.net:/tmp/cvs-serv9344/src Modified Files: ChangeLog Log Message: (I_to_file_offset, FILE-SIZE) [WIN32_NATIVE]: use LARGE_INTEGER.QuadPart (stream_truncate) [WIN32_NATIVE]: fix LARGE_INTEGER literal Index: ChangeLog =================================================================== RCS file: /cvsroot/clisp/clisp/src/ChangeLog,v retrieving revision 1.6478 retrieving revision 1.6479 diff -u -d -r1.6478 -r1.6479 --- ChangeLog 17 Aug 2008 14:38:38 -0000 1.6478 +++ ChangeLog 18 Aug 2008 01:26:33 -0000 1.6479 @@ -2,6 +2,8 @@ * modules/syscalls/calls.c (path_truncate, stream_truncate): call end_system_call(); before signaling errors + (I_to_file_offset, FILE-SIZE) [WIN32_NATIVE]: use LARGE_INTEGER.QuadPart + (stream_truncate) [WIN32_NATIVE]: fix LARGE_INTEGER literal 2008-08-15 Sam Steingold <sd...@gn...> ------------------------------ Message: 3 Date: Mon, 18 Aug 2008 10:10:58 +0000 From: Vladimir Tzankov <vt...@us...> Subject: clisp/src ChangeLog, 1.6440.4.7, 1.6440.4.8 spvw_global.d, 1.24.2.3, 1.24.2.4 To: cli...@li... Message-ID: <E1K...@ma...> Update of /cvsroot/clisp/clisp/src In directory sc8-pr-cvs4.sourceforge.net:/tmp/cvs-serv4477/src Modified Files: Tag: threads ChangeLog spvw_global.d Log Message: Make the GC re-entrant Index: spvw_global.d =================================================================== RCS file: /cvsroot/clisp/clisp/src/spvw_global.d,v retrieving revision 1.24.2.3 retrieving revision 1.24.2.4 diff -u -d -r1.24.2.3 -r1.24.2.4 --- spvw_global.d 14 Aug 2008 14:18:03 -0000 1.24.2.3 +++ spvw_global.d 18 Aug 2008 10:10:55 -0000 1.24.2.4 @@ -511,6 +511,9 @@ #define RELEASE_HEAP_LOCK() spinlock_release(&mem.alloc_lock) +/* since the GC may be re-entrant we should keep track how many times + we have been called. Only the first time we have to really suspend other threads.*/ +local uintC gc_suspend_count=0; /* Suspends all running threads /besides the current/ on GC safe points/region if lock_heap is true the heap is locked first. @@ -520,46 +523,58 @@ { var uint8 *acklocked; /* flags for indicating whether a thread acknowedge the suspension */ var bool all_suspended; - var uintL yield_count=0; /* how many times we have */ var clisp_thread_t *me=current_thread(); /*printf("VTZ: GC_SUSPEND(): %0x\n",me);*/ if (lock_heap) ACQUIRE_HEAP_LOCK(); - /* lock thread creation/deletion */ - lock_threads(); - acklocked=(uint8 *)alloca(nthreads*sizeof(uint8)); - memset(acklocked,0,sizeof(uint8)*nthreads); - for_all_threads({ - if (thread == me) continue; /* skip ourself */ - xmutex_lock(&thread->_gc_suspend_lock); /* enable thread waiting */ - spinlock_release(&thread->_gc_suspend_request); /* request */ - }); - do { - all_suspended=true; + if (gc_suspend_count == 0) { /* first time here */ + /* lock thread creation/deletion */ + lock_threads(); + acklocked=(uint8 *)alloca(nthreads*sizeof(uint8)); + memset(acklocked,0,sizeof(uint8)*nthreads); for_all_threads({ - /* skip ourself and all already suspended (ACK acquired) threads */ - if ((acklocked[thread->_index]) || (thread == me)) continue; - if (spinlock_tryacquire(&thread->_gc_suspend_ack)) { - acklocked[thread->_index]=1; - /* 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*/ - } + if (thread == me) continue; /* skip ourself */ + xmutex_lock(&thread->_gc_suspend_lock); /* enable thread waiting */ + spinlock_release(&thread->_gc_suspend_request); /* request */ }); - if (!all_suspended) xthread_yield(); else break; - } while (1); - /* keep the lock on threads (and heap if asked for) */ + do { + all_suspended=true; + for_all_threads({ + /* skip ourself and all already suspended (ACK acquired) threads */ + if ((acklocked[thread->_index]) || (thread == me)) continue; + if (spinlock_tryacquire(&thread->_gc_suspend_ack)) { + acklocked[thread->_index]=1; + /* 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*/ + } + }); + if (!all_suspended) xthread_yield(); else break; + } while (1); + } + gc_suspend_count++; /* increase the suspend count */ + /* keep the lock on threads, but release the heap lock. + no other threads are running now, so no new allocations may + happen - only the ones from GC. Also no new thread can be created.*/ + RELEASE_HEAP_LOCK(); } /* Resumes all suspended threads /besides the current/ should match a call to suspend_all_threads()*/ global void gc_resume_all_threads(bool unlock_heap) { - /* no need to lock anything - we are the only one running */ + /* thread lock is locked. heap lock is free. */ var clisp_thread_t *me=current_thread(); /*printf("VTZ: GC_RESUME(): %0x\n",me);*/ + gc_suspend_count--; + if (gc_suspend_count > 0) + return; + /* get the heap lock. in case we are called from allocate_xxx + we should not allow any other thread that will be resumed shortly + to acquire it. */ + ACQUIRE_HEAP_LOCK(); for_all_threads({ if (thread == me) continue; /* skip ourself */ /* currently all ACK locks belong to us as well the mutex lock */ Index: ChangeLog =================================================================== RCS file: /cvsroot/clisp/clisp/src/ChangeLog,v retrieving revision 1.6440.4.7 retrieving revision 1.6440.4.8 diff -u -d -r1.6440.4.7 -r1.6440.4.8 --- ChangeLog 16 Aug 2008 21:51:48 -0000 1.6440.4.7 +++ ChangeLog 18 Aug 2008 10:10:50 -0000 1.6440.4.8 @@ -1,3 +1,11 @@ +2008-08-18 Vladimir Tzankov <vtz...@gm...> + Make the GC re-entrant + + * spvw_global.d + (gc_suspend_count): re-entry counter + (gc_suspend_all_threads/gc_resume_all_threads): implement the + GC re-entrancy + 2008-08-17 Vladimir Tzankov <vtz...@gm...> GENERATIONAL_GC support. Thread xrecord changes. ------------------------------ Message: 4 Date: Mon, 18 Aug 2008 14:11:02 +0000 From: Sam Steingold <sd...@us...> Subject: clisp/doc impbody.xml,1.539,1.540 To: cli...@li... Message-ID: <E1K...@ma...> Update of /cvsroot/clisp/clisp/doc In directory sc8-pr-cvs4.sourceforge.net:/tmp/cvs-serv28085/doc Modified Files: impbody.xml Log Message: (ppr-first-newline): give an example Index: impbody.xml =================================================================== RCS file: /cvsroot/clisp/clisp/doc/impbody.xml,v retrieving revision 1.539 retrieving revision 1.540 diff -u -d -r1.539 -r1.540 --- impbody.xml 14 Aug 2008 20:34:15 -0000 1.539 +++ impbody.xml 18 Aug 2008 14:10:59 -0000 1.540 @@ -4698,6 +4698,16 @@ and the next object will be printed on several lines, and it does not start with a &nl-s;, then a &nl-s; is printed before the object. + E.g., when you type <code>(&format; &t; "return value: ~S~%" &v-r;)</code> + you want want to see a terse one-line output when &v-r; is something + short (like &zero; or &nil; or &t;), but you probably want to see + something nice, like <screen> +return value: +(long list which does not fit + on one line)</screen> +instead of <screen> +return value: (long list which does not fit + on one line)</screen> when it does not. &ppr-first-newline; has no effect if &print-pretty-var; is &nil;. &ppr-first-newline; is initially set to &t;.</para></formalpara> ------------------------------ Message: 5 Date: Mon, 18 Aug 2008 18:53:20 +0000 From: Sam Steingold <sd...@us...> Subject: clisp/modules/syscalls calls.c,1.247,1.248 To: cli...@li... Message-ID: <E1K...@ma...> Update of /cvsroot/clisp/clisp/modules/syscalls In directory sc8-pr-cvs4.sourceforge.net:/tmp/cvs-serv4328/modules/syscalls Modified Files: calls.c Log Message: make sure that end_system_call() is called before all errors and that errno is only accessed inside begin_system_call/end_system_call Index: calls.c =================================================================== RCS file: /cvsroot/clisp/clisp/modules/syscalls/calls.c,v retrieving revision 1.247 retrieving revision 1.248 diff -u -d -r1.247 -r1.248 --- calls.c 18 Aug 2008 01:26:33 -0000 1.247 +++ calls.c 18 Aug 2008 18:53:18 -0000 1.248 @@ -323,14 +323,12 @@ cmd = F_SETFL; break; default: NOTREACHED; } - begin_system_call(); - if (-1 == fcntl(fd,cmd,value)) error_OS_stream(STACK_2); - end_system_call(); + begin_system_call(); value = fcntl(fd,cmd,value); end_system_call(); + if (-1 == value) error_OS_stream(STACK_2); VALUES0; } else { /* GET */ - begin_system_call(); - if (-1 == (value = fcntl(fd,cmd))) error_OS_stream(STACK_2); - end_system_call(); + begin_system_call(); value = fcntl(fd,cmd); end_system_call(); + if (-1 == value) error_OS_stream(STACK_2); switch (cmd) { case F_GETFD: value1 = check_fd_flags_to_list(value); break; case F_GETFL: @@ -375,13 +373,10 @@ #if defined(WIN32_NATIVE) { 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)) + if (fd == INVALID_HANDLE_VALUE + || 0 == SetFilePointerEx(fd,*length,NULL,FILE_BEGIN) + || 0 == SetEndOfFile(fd) + || 0 == CloseHandle(fd)) { end_system_call(); OS_file_error(STACK_0); } } #elif defined(HAVE_TRUNCATE) @@ -399,13 +394,10 @@ #if defined(WIN32_NATIVE) { LARGE_INTEGER cur_pos; if (0 == SetFilePointerEx(fd,(LARGE_INTEGER){QuadPart: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)) + &cur_pos,FILE_CURRENT) + || 0 == SetFilePointerEx(fd,*length,NULL,FILE_BEGIN) + || 0 == SetEndOfFile(fd) + || 0 == SetFilePointerEx(fd,cur_pos,NULL,FILE_BEGIN)) { end_system_call(); OS_filestream_error(STACK_0); } } #elif defined(HAVE_FTRUNCATE) @@ -592,9 +584,10 @@ tm.tm_wday = (posfixnum_to_V(value7) + 1) % 7; tm.tm_isdst = !nullp(value8); /* Daylight Savings flag. */ /* tm.tm_yday == Day of year [0,365]. -- use mkime() */ - begin_system_call(); - if (mktime(&tm) == (time_t)-1) OS_error(); - end_system_call(); + { time_t ret; + begin_system_call(); ret = mktime(&tm); end_system_call(); + if (ret == (time_t)-1) OS_error(); + } with_string_0(STACK_0,GLO(misc_encoding),format, { /* at least 4 characters per each format char + safety */ size_t bufsize = 4 * format_bytelen + 64; @@ -624,9 +617,11 @@ #elif defined(WIN32_NATIVE) static object temp_name (char *dir, char *prefix) { char path[MAX_PATH]; + int ret; begin_system_call(); - if (0 == GetTempFileName(dir,prefix,0,path)) OS_error(); + ret = GetTempFileName(dir,prefix,0,path); end_system_call(); + if (0 == ret) OS_error(); return asciz_to_string(path,GLO(pathname_encoding)); } #endif @@ -842,13 +837,15 @@ # endif } else { /* fsync() */ Handle fd = stream_get_handle(&STACK_0); + bool failed_p; begin_system_call(); # if defined(HAVE_FSYNC) - if (-1 == fsync(fd)) error_OS_stream(STACK_0); + failed_p = (-1 == fsync(fd)); # elif defined(WIN32_NATIVE) - if (!FlushFileBuffers(fd)) error_OS_stream(STACK_0); + failed_p = (!FlushFileBuffers(fd)); # endif end_system_call(); + if (failed_p) error_OS_stream(STACK_0); } VALUES0; skipSTACK(1); } @@ -867,43 +864,54 @@ int which = check_priority_which(popSTACK()); int pid = I_to_uint32(check_uint32(popSTACK())); int res; + bool failed_p; #if defined(HAVE_GETPRIORITY) - errno = 0; begin_system_call(); + errno = 0; res = getpriority(which,pid); + failed_p = (errno != 0); end_system_call(); - if (errno) OS_error(); #elif defined(WIN32_NATIVE) - HANDLE handle; - begin_system_call(); - handle = OpenProcess(PROCESS_QUERY_INFORMATION,FALSE,pid); - if (handle == NULL) OS_error(); - res = (int)GetPriorityClass(handle); - CloseHandle(handle); - end_system_call(); + { + HANDLE handle; + begin_system_call(); + handle = OpenProcess(PROCESS_QUERY_INFORMATION,FALSE,pid); + if (handle != NULL) { + res = (int)GetPriorityClass(handle); + CloseHandle(handle); + } else failed_p = true; + end_system_call(); + } #else NOTREACHED; #endif + if (failed_p) OS_error(); VALUES1(check_priority_value_reverse(res)); } DEFUN(OS::%SET-PRIORITY, value pid which) { int which = check_priority_which(popSTACK()); int pid = I_to_uint32(check_uint32(popSTACK())); int value = check_priority_value(STACK_0); - begin_system_call(); + bool failed_p = true; #if defined(HAVE_SETPRIORITY) - if (setpriority(which,pid,value)) OS_error(); + begin_system_call(); + failed_p = (0 != setpriority(which,pid,value)); + end_system_call(); #elif defined(WIN32_NATIVE) { - HANDLE handle = OpenProcess(PROCESS_QUERY_INFORMATION,FALSE,pid); - if (handle == NULL) OS_error(); - if (!SetPriorityClass(handle,value)) OS_error(); - CloseHandle(handle); + HANDLE handle; + begin_system_call(); + handle = OpenProcess(PROCESS_QUERY_INFORMATION,FALSE,pid); + if (handle != NULL) { + failed_p = !SetPriorityClass(handle,value); + CloseHandle(handle); + } + end_system_call(); } #else NOTREACHED; #endif - end_system_call(); + if (failed_p) OS_error(); VALUES1(popSTACK()); } @@ -1070,11 +1078,12 @@ DEFUN(POSIX::ENCRYPT, block flag) { int flag = nullp(popSTACK()); char block[64]; + bool failed_p; get_block(block,STACK_0); begin_system_call(); - errno = 0; encrypt(block,flag); - if (errno) OS_error(); + errno = 0; encrypt(block,flag); failed_p = (errno != 0); end_system_call(); + if (failed_p) OS_error(); set_block(block,STACK_0); VALUES1(popSTACK()); } @@ -1082,11 +1091,12 @@ #if defined(HAVE_SETKEY) && !defined(WIN32_NATIVE) DEFUN(POSIX::SETKEY, key) { char block[64]; + bool failed_p; get_block(block,popSTACK()); begin_system_call(); - errno = 0; setkey(block); - if (errno) OS_error(); + errno = 0; setkey(block); failed_p = (errno != 0); end_system_call(); + if (failed_p) OS_error(); VALUES0; } #endif @@ -1572,6 +1582,7 @@ { /* return the GROUP-INFO for the group or a list thereof if it is NIL. */ object group = popSTACK(); struct group *gr = NULL; + bool failed_p; group_info_restart: # if defined(HAVE_GETGRENT) && defined(HAVE_SETGRENT) && defined(HAVE_ENDGRENT) @@ -1603,10 +1614,11 @@ } else { end_system_call(); error_string_integer(group); } + failed_p = (errno != 0); end_system_call(); if (NULL == gr) { - if (errno == 0) { + if (!failed_p) { pushSTACK(NIL); /* no PLACE */ pushSTACK(group); pushSTACK(TheSubr(subr_self)->name); check_value(error_condition,GETTEXT("~S(~S): No such group")); @@ -1641,6 +1653,7 @@ { /* return the USER-INFO for the user or a list thereof if user is NIL. */ object user = popSTACK(); struct passwd *pwd = NULL; + bool failed_p; user_info_restart: # if defined(HAVE_GETPWENT) && defined(HAVE_SETPWENT) && defined(HAVE_ENDPWENT) @@ -1676,10 +1689,11 @@ } else { end_system_call(); error_string_integer(user); } + failed_p = (errno != 0); end_system_call(); if (NULL == pwd) { - if (errno == 0) { + if (!failed_p) { pushSTACK(NIL); /* no PLACE */ pushSTACK(user); pushSTACK(TheSubr(subr_self)->name); check_value(error_condition,GETTEXT("~S(~S): No such user")); @@ -2127,9 +2141,9 @@ #endif /* no mknod() */ funcall(L(namestring),1); /* drop path from STACK */ with_string_0(value1,GLO(pathname_encoding),path, { - begin_system_call(); - if (mknod(path,mode,0)) OS_file_error(value1); - end_system_call(); + int ret; + begin_system_call(); ret = mknod(path,mode,0); end_system_call(); + if (ret) OS_file_error(value1); }); VALUES0; } @@ -2157,8 +2171,9 @@ strcpy(c_template,namez); strcat(c_template,"XXXXXX"); } - if (NULL == mkdtemp(c_template)) OS_error(); + c_template = mkdtemp(c_template); end_system_call(); + if (NULL == c_template) OS_error(); fname = asciz_to_string(c_template,GLO(pathname_encoding)); }); pushSTACK(fname); @@ -2236,8 +2251,8 @@ *rootp = 0; if (!GetDiskFreeSpace(root,&spc,&bps,&freec,&totalc)) - return -1; /* bytes per sector */ - bpc = spc*bps; + return -1; /* bytes per sector, sectors per cluster */ + bpc = spc*bps; /* bytes per cluster */ if (GetDiskFreeSpaceEx(root,&availb,&totalb,&freeb)) { availc = availb.QuadPart / bpc; totalc = totalb.QuadPart / bpc; @@ -2716,27 +2731,27 @@ #endif #if defined(HAVE_LINK) static void hardlink_file (char* old_pathstring, char* new_pathstring) { + gcv_object_t *failed = NULL; begin_system_call(); # if defined(WIN32_NATIVE) if (MkHardLink(old_pathstring,new_pathstring) == FALSE) - if (GetLastError() == ERROR_FILE_NOT_FOUND) + failed = (GetLastError() == ERROR_FILE_NOT_FOUND ? &STACK_3 : &STACK_1); # else if (my_link(old_pathstring,new_pathstring) < 0) - if (errno==ENOENT) + failed = (errno==ENOENT ? &STACK_3 : &STACK_1); # endif - OS_file_error(STACK_3); - else OS_file_error(STACK_1); end_system_call(); + if (failed) OS_file_error(*failed); } #endif #if defined(HAVE_SYMLINK) static inline void symlink_file (char* old_pathstring, char* new_pathstring) { + gcv_object_t *failed = NULL; begin_system_call(); - if (symlink(old_pathstring,new_pathstring) < 0) { /* symlink file */ - if (errno==ENOENT) OS_file_error(STACK_3); - else OS_file_error(STACK_1); - } + if (symlink(old_pathstring,new_pathstring) < 0) /* symlink file */ + failed = (errno==ENOENT ? &STACK_3 : &STACK_1); end_system_call(); + if (failed) OS_file_error(*failed); } #endif @@ -3480,10 +3495,12 @@ DEFUN(POSIX::VERSION,) { /* interface to GetVersionEx() */ OSVERSIONINFOEX vi; + bool status; vi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); begin_system_call(); - if (!GetVersionEx((OSVERSIONINFO*)&vi)) OS_error(); + status = GetVersionEx((OSVERSIONINFO*)&vi); end_system_call(); + if (!status) OS_error(); pushSTACK(UL_to_I(vi.dwMajorVersion)); pushSTACK(UL_to_I(vi.dwMinorVersion)); @@ -3530,10 +3547,12 @@ { /* interface to GlobalMemoryStatus() */ #ifdef HAVE_GLOBALMEMORYSTATUSEX MEMORYSTATUSEX ms; + bool status; ms.dwLength = sizeof(MEMORYSTATUSEX); begin_system_call(); - if (!GlobalMemoryStatusEx(&ms)) OS_error(); + status = GlobalMemoryStatusEx(&ms); end_system_call(); + if (!status) OS_error(); pushSTACK(UQ_to_I(ms.ullTotalPhys)); pushSTACK(UQ_to_I(ms.ullAvailPhys)); pushSTACK(UQ_to_I(ms.ullTotalPageFile)); @@ -5310,8 +5329,10 @@ VALUES1(status == 0 ? NIL : safe_to_string(ret)); begin_system_call(); LocalFree(ret); end_system_call(); # else - int error_code = missingp(STACK_0) ? errno : check_errno(STACK_0); - begin_system_call(); ret = strerror(error_code); end_system_call(); + int error_code = missingp(STACK_0) ? -1 : check_errno(STACK_0); + begin_system_call(); + ret = strerror(error_code == -1 ? errno : error_code); + end_system_call(); VALUES1(safe_to_string(ret)); # endif skipSTACK(1); ------------------------------ Message: 6 Date: Mon, 18 Aug 2008 18:53:21 +0000 From: Sam Steingold <sd...@us...> Subject: clisp/src ChangeLog,1.6479,1.6480 To: cli...@li... Message-ID: <E1K...@ma...> Update of /cvsroot/clisp/clisp/src In directory sc8-pr-cvs4.sourceforge.net:/tmp/cvs-serv4328/src Modified Files: ChangeLog Log Message: make sure that end_system_call() is called before all errors and that errno is only accessed inside begin_system_call/end_system_call Index: ChangeLog =================================================================== RCS file: /cvsroot/clisp/clisp/src/ChangeLog,v retrieving revision 1.6479 retrieving revision 1.6480 diff -u -d -r1.6479 -r1.6480 --- ChangeLog 18 Aug 2008 01:26:33 -0000 1.6479 +++ ChangeLog 18 Aug 2008 18:53:18 -0000 1.6480 @@ -1,3 +1,9 @@ +2008-08-18 Sam Steingold <sd...@gn...> + + * modules/syscalls/calls.c: make sure that end_system_call() is + called before all errors and that + errno is only accessed inside begin_system_call/end_system_call + 2008-08-17 Sam Steingold <sd...@gn...> * modules/syscalls/calls.c (path_truncate, stream_truncate): call ------------------------------ ------------------------------------------------------------------------- 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 19 ***************************************** |