patches/Python26-06-write_compiled_module-atomic.diff
author yippi
Mon, 27 Sep 2010 21:07:51 +0000
changeset 20108 51df67ca9307
parent 17126 ab01a33ed216
permissions -rw-r--r--
I had these modules listed as being owned by me, but they are really owned by wangke, correcting.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
17126
ab01a33ed216 2009-12-03 Laszlo (Laca) Peter <[email protected]>
laca
parents: 16364
diff changeset
     1
--- Python-2.6.4/Python/import.c.import	2009-12-02 14:16:47.286400577 +1300
ab01a33ed216 2009-12-03 Laszlo (Laca) Peter <[email protected]>
laca
parents: 16364
diff changeset
     2
+++ Python-2.6.4/Python/import.c	2009-12-02 14:26:08.955429879 +1300
ab01a33ed216 2009-12-03 Laszlo (Laca) Peter <[email protected]>
laca
parents: 16364
diff changeset
     3
@@ -866,8 +866,9 @@
14736
641f63d0e468 2008-12-09 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
     4
 
641f63d0e468 2008-12-09 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
     5
 /* Write a compiled module to a file, placing the time of last
641f63d0e468 2008-12-09 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
     6
    modification of its source into the header.
641f63d0e468 2008-12-09 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
     7
-   Errors are ignored, if a write error occurs an attempt is made to
641f63d0e468 2008-12-09 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
     8
-   remove the file. */
641f63d0e468 2008-12-09 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
     9
+   Write to a temporary file first so that creating the file is atomic.
641f63d0e468 2008-12-09 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    10
+   Errors are ignored, if a write/unlink/rename error occurs an attempt
641f63d0e468 2008-12-09 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    11
+   is made to remove the temporary file. */
641f63d0e468 2008-12-09 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    12
 
641f63d0e468 2008-12-09 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    13
 static void
641f63d0e468 2008-12-09 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    14
 write_compiled_module(PyCodeObject *co, char *cpathname, struct stat *srcstat)
17126
ab01a33ed216 2009-12-03 Laszlo (Laca) Peter <[email protected]>
laca
parents: 16364
diff changeset
    15
@@ -879,12 +880,21 @@
ab01a33ed216 2009-12-03 Laszlo (Laca) Peter <[email protected]>
laca
parents: 16364
diff changeset
    16
 #else
ab01a33ed216 2009-12-03 Laszlo (Laca) Peter <[email protected]>
laca
parents: 16364
diff changeset
    17
 	mode_t mode = srcstat->st_mode & ~S_IXUSR & ~S_IXGRP & ~S_IXOTH;
ab01a33ed216 2009-12-03 Laszlo (Laca) Peter <[email protected]>
laca
parents: 16364
diff changeset
    18
 #endif 
14736
641f63d0e468 2008-12-09 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    19
+	char *tmppathname;
17126
ab01a33ed216 2009-12-03 Laszlo (Laca) Peter <[email protected]>
laca
parents: 16364
diff changeset
    20
+ 
14736
641f63d0e468 2008-12-09 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    21
+	/* the temporary file is called cpathname + ".tmp" */
17126
ab01a33ed216 2009-12-03 Laszlo (Laca) Peter <[email protected]>
laca
parents: 16364
diff changeset
    22
+	if ((tmppathname = PyMem_Malloc(strlen(cpathname) + strlen(".tmp") + 1))
ab01a33ed216 2009-12-03 Laszlo (Laca) Peter <[email protected]>
laca
parents: 16364
diff changeset
    23
+		== NULL) {
ab01a33ed216 2009-12-03 Laszlo (Laca) Peter <[email protected]>
laca
parents: 16364
diff changeset
    24
+		return;
14736
641f63d0e468 2008-12-09 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    25
+	}
641f63d0e468 2008-12-09 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    26
+	sprintf (tmppathname, "%s.tmp", cpathname);
641f63d0e468 2008-12-09 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    27
+	fp = open_exclusive(tmppathname, mode);
641f63d0e468 2008-12-09 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    28
 
641f63d0e468 2008-12-09 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    29
-	fp = open_exclusive(cpathname, mode);
641f63d0e468 2008-12-09 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    30
 	if (fp == NULL) {
641f63d0e468 2008-12-09 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    31
 		if (Py_VerboseFlag)
641f63d0e468 2008-12-09 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    32
 			PySys_WriteStderr(
641f63d0e468 2008-12-09 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    33
-				"# can't create %s\n", cpathname);
641f63d0e468 2008-12-09 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    34
+				"# can't create %s\n", tmppathname);
641f63d0e468 2008-12-09 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    35
+		PyMem_Free(tmppathname);
641f63d0e468 2008-12-09 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    36
 		return;
641f63d0e468 2008-12-09 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    37
 	}
641f63d0e468 2008-12-09 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    38
 	PyMarshal_WriteLongToFile(pyc_magic, fp, Py_MARSHAL_VERSION);
17126
ab01a33ed216 2009-12-03 Laszlo (Laca) Peter <[email protected]>
laca
parents: 16364
diff changeset
    39
@@ -893,10 +903,11 @@
14736
641f63d0e468 2008-12-09 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    40
 	PyMarshal_WriteObjectToFile((PyObject *)co, fp, Py_MARSHAL_VERSION);
641f63d0e468 2008-12-09 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    41
 	if (fflush(fp) != 0 || ferror(fp)) {
641f63d0e468 2008-12-09 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    42
 		if (Py_VerboseFlag)
641f63d0e468 2008-12-09 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    43
-			PySys_WriteStderr("# can't write %s\n", cpathname);
641f63d0e468 2008-12-09 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    44
+			PySys_WriteStderr("# can't write %s\n", tmppathname);
641f63d0e468 2008-12-09 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    45
 		/* Don't keep partial file */
641f63d0e468 2008-12-09 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    46
 		fclose(fp);
641f63d0e468 2008-12-09 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    47
-		(void) unlink(cpathname);
641f63d0e468 2008-12-09 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    48
+		(void) unlink(tmppathname);
641f63d0e468 2008-12-09 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    49
+		PyMem_Free(tmppathname);
641f63d0e468 2008-12-09 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    50
 		return;
641f63d0e468 2008-12-09 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    51
 	}
641f63d0e468 2008-12-09 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    52
 	/* Now write the true mtime */
17126
ab01a33ed216 2009-12-03 Laszlo (Laca) Peter <[email protected]>
laca
parents: 16364
diff changeset
    53
@@ -905,8 +916,30 @@
14736
641f63d0e468 2008-12-09 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    54
 	PyMarshal_WriteLongToFile((long)mtime, fp, Py_MARSHAL_VERSION);
641f63d0e468 2008-12-09 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    55
 	fflush(fp);
641f63d0e468 2008-12-09 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    56
 	fclose(fp);
641f63d0e468 2008-12-09 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    57
+	/* Delete the old compiled file, if exists */
641f63d0e468 2008-12-09 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    58
+	if (unlink (cpathname)) {
641f63d0e468 2008-12-09 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    59
+		if ((errno != ENOENT)) {
641f63d0e468 2008-12-09 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    60
+			/* the file exists but could not be deleted */
641f63d0e468 2008-12-09 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    61
+			if (Py_VerboseFlag)
641f63d0e468 2008-12-09 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    62
+				PySys_WriteStderr(
641f63d0e468 2008-12-09 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    63
+					"# can't unlink %s\n", cpathname);
641f63d0e468 2008-12-09 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    64
+			(void) unlink(tmppathname);
641f63d0e468 2008-12-09 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    65
+			PyMem_Free(tmppathname);
641f63d0e468 2008-12-09 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    66
+			return;
641f63d0e468 2008-12-09 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    67
+		}
641f63d0e468 2008-12-09 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    68
+	}
641f63d0e468 2008-12-09 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    69
+	/* rename the tmp file to the real file name */
641f63d0e468 2008-12-09 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    70
+	if (rename (tmppathname, cpathname)) {
641f63d0e468 2008-12-09 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    71
+		if (Py_VerboseFlag)
641f63d0e468 2008-12-09 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    72
+			PySys_WriteStderr(
641f63d0e468 2008-12-09 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    73
+				"# can't rename %s to %s\n", tmppathname, cpathname);
641f63d0e468 2008-12-09 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    74
+		(void) unlink(tmppathname);
641f63d0e468 2008-12-09 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    75
+		PyMem_Free(tmppathname);
641f63d0e468 2008-12-09 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    76
+		return;
641f63d0e468 2008-12-09 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    77
+	}
641f63d0e468 2008-12-09 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    78
 	if (Py_VerboseFlag)
641f63d0e468 2008-12-09 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    79
 		PySys_WriteStderr("# wrote %s\n", cpathname);
641f63d0e468 2008-12-09 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    80
+	PyMem_Free(tmppathname);
641f63d0e468 2008-12-09 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    81
 }
641f63d0e468 2008-12-09 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    82
 
16364
f8f2a02122dd 2009-08-24 Laszlo (Laca) Peter <[email protected]>
laca
parents: 14736
diff changeset
    83
 static void