~ chicken-core (chicken-5) 6256ae18ec023aef4cf388d3a0969c9928ac2fb2


commit 6256ae18ec023aef4cf388d3a0969c9928ac2fb2
Author:     felix <felix@call-with-current-continuation.org>
AuthorDate: Mon Jul 16 07:15:57 2012 +0200
Commit:     Mario Domenech Goulart <mario.goulart@gmail.com>
CommitDate: Mon Jul 16 11:26:17 2012 -0300

    Use PID when creating temporary files or directories to reduce the risk of reusing temporary filenames
    
    This can be a problem when (for example) two processes create a large
    number of temporary files concurrently.
    
    This fixes #810 (https://bugs.call-cc.org/ticket/810)
    
    Signed-off-by: Mario Domenech Goulart <mario.goulart@gmail.com>

diff --git a/files.scm b/files.scm
index 3fae8f52..0b288825 100644
--- a/files.scm
+++ b/files.scm
@@ -295,7 +295,8 @@ EOF
 (define create-temporary-directory)
 
 (let ((temp #f)
-      (temp-prefix "temp"))
+      (temp-prefix "temp")
+      (string-append string-append))
   (define (tempdir)
     (or temp
 	(let ((tmp 
@@ -312,9 +313,12 @@ EOF
 	(let* ((n (##core#inline "C_random_fixnum" #x10000))
 	       (pn (make-pathname 
 		    (tempdir)
-		    (##sys#string-append 
+		    (string-append 
 		     temp-prefix
-		     (number->string n 16)) ext)) )
+		     (number->string n 16)
+		     "."
+		     (##sys#number->string (##sys#fudge 33))) ; PID
+		    ext)) )
 	  (if (file-exists? pn)
 	      (loop)
 	      (call-with-output-file pn (lambda (p) pn)) ) ) ) ) )
@@ -326,7 +330,9 @@ EOF
 		    (tempdir)
 		    (string-append
 		     temp-prefix
-		     (number->string n 16)))))
+		     (number->string n 16)
+		     "."
+		     (##sys#number->string (##sys#fudge 33)))))) ; PID
 	  (if (directory-exists? pn) 
 	      (loop)
 	      (let ((r (##core#inline "C_mkdir" (##sys#make-c-string pn 'create-temporary-directory))))
diff --git a/posix-common.scm b/posix-common.scm
index c39ea3ec..ee01c845 100644
--- a/posix-common.scm
+++ b/posix-common.scm
@@ -505,7 +505,7 @@ EOF
 
 ;;; Processes
 
-(define current-process-id (foreign-lambda int "C_getpid"))
+(define (current-process-id) (##sys#fudge 33))
 
 (define process-wait
   (lambda args
diff --git a/runtime.c b/runtime.c
index 04d476fa..dd1c8375 100644
--- a/runtime.c
+++ b/runtime.c
@@ -4113,112 +4113,112 @@ C_regparm C_word C_fcall C_fudge(C_word fudge_factor)
       if(locative_table[ i ] != C_SCHEME_UNDEFINED) ++j;
     return C_fix(j);
 
-  case C_fix(20):
+  case C_fix(20):		/* unused */
     return C_SCHEME_FALSE;
 
-  case C_fix(21):
+  case C_fix(21):		/* largest fixnum */
     return C_fix(C_MOST_POSITIVE_FIXNUM);
 
-  case C_fix(22):
+  case C_fix(22):		/* does this process use a private egg-repository? */
     return C_mk_bool(private_repository != NULL);
 
-  case C_fix(23):
+  case C_fix(23):		/* seconds since process startup */
     return C_fix(C_startup_time_seconds);
 
-  case C_fix(24):
+  case C_fix(24):		/* dynamic loading available? */
 #ifdef NO_DLOAD2
     return C_SCHEME_FALSE;
 #else
     return C_SCHEME_TRUE;
 #endif
 
-  case C_fix(25):
+  case C_fix(25):		/* REPL on error? XXX Is this used anywhere? */
     return C_mk_bool(C_enable_repl);
 
-  case C_fix(26):
+  case C_fix(26):		/* number of untriggered finalizers */
     return C_fix(live_finalizer_count);
 
-  case C_fix(27):
+  case C_fix(27):		/* total number of finalizers used and unused */
     return C_fix(allocated_finalizer_count);
 
-  case C_fix(28):
+  case C_fix(28):		/* are procedure-tabled enabled? */
 #ifdef C_ENABLE_PTABLES
     return C_SCHEME_TRUE;
 #else
     return C_SCHEME_FALSE;
 #endif
 
-  case C_fix(29):
+  case C_fix(29):		/* size of ring-buffer used to hold trace entries */
     return C_fix(C_trace_buffer_size);
 
-  case C_fix(30):
+  case C_fix(30):		/* unused */
     return C_SCHEME_FALSE;
 
-  case C_fix(31):
+  case C_fix(31):		/* GC time since last invocation */
     tgc = timer_accumulated_gc_ms;
     timer_accumulated_gc_ms = 0;
     return C_fix(tgc);
 
-  case C_fix(32):
+  case C_fix(32):		/* are GC-hooks enabled? */
 #ifdef C_GC_HOOKS
     return C_SCHEME_TRUE;
 #else
     return C_SCHEME_FALSE;
 #endif
 
-  case C_fix(33):
-    return C_SCHEME_TRUE;
+  case C_fix(33):		/* return process-ID */
+    return C_fix(C_getpid());
 
-  case C_fix(34):
+  case C_fix(34):		/* effective maximum for procedure arguments */
 #ifdef C_HACKED_APPLY
     return C_fix(TEMPORARY_STACK_SIZE);
 #else
     return C_fix(126);
 #endif
 
-  case C_fix(35):
+  case C_fix(35):		/* unused */
     /* used to be apply-hook indicator */
     return C_SCHEME_FALSE;
     
-  case C_fix(36):
+  case C_fix(36):		/* toggle debug mode */
     debug_mode = !debug_mode;
     return C_mk_bool(debug_mode);
 
-  case C_fix(37):
+  case C_fix(37):		/* heap-dump enabled? */
     return C_mk_bool(dump_heap_on_exit);
 
-  case C_fix(38):
+  case C_fix(38):		/* SVN revision of built sources */
 #ifdef C_SVN_REVISION
     return C_fix(C_SVN_REVISION);
 #else
     return C_fix(0);
 #endif
 
-  case C_fix(39):
+  case C_fix(39):		/* is this a cross-chicken? */
 #if defined(C_CROSS_CHICKEN) && C_CROSS_CHICKEN
     return C_SCHEME_TRUE;
 #else
     return C_SCHEME_FALSE;
 #endif
 
-  case C_fix(40):
+  case C_fix(40):		/* assembly stub for "apply" available? */
 #if defined(C_HACKED_APPLY)
     return C_SCHEME_TRUE;
 #else
     return C_SCHEME_FALSE;
 #endif
 
-  case C_fix(41):
+  case C_fix(41):		/* major CHICKEN version */
     return C_fix(C_MAJOR_VERSION);
 
-  case C_fix(42):
+  case C_fix(42):		/* binary version number */
 #ifdef C_BINARY_VERSION
     return C_fix(C_BINARY_VERSION);
 #else
     return C_fix(0);
 #endif
 
-  case C_fix(43):
+  case C_fix(43):		/* minor CHICKEN version */
     return C_fix(C_MINOR_VERSION);
 
   default: return C_SCHEME_UNDEFINED;
Trap