mirror of https://github.com/pyodide/pyodide.git
modifiy MEMFS timestamp handling to support better caching (#893)
This commit is contained in:
parent
bcc3996a0d
commit
04ca90747f
|
@ -0,0 +1,38 @@
|
|||
Modify MEMFS to update timestamp of parent directory on file creation and removal.
|
||||
More POSIXish compliant for a one timestamp fs, behaves like a modification date.
|
||||
|
||||
--- a/emsdk/fastcomp/emscripten/src/library_memfs.js 2019-08-19 18:11:40.000000000 +0200
|
||||
+++ b/emsdk/fastcomp/emscripten/src/library_memfs.js 2020-12-23 12:22:38.000000000 +0100
|
||||
@@ -88,6 +88,7 @@
|
||||
// add the new node to the parent
|
||||
if (parent) {
|
||||
parent.contents[name] = node;
|
||||
+ parent.timestamp = node.timestamp;
|
||||
}
|
||||
return node;
|
||||
},
|
||||
@@ -213,12 +214,16 @@
|
||||
}
|
||||
// do the internal rewiring
|
||||
delete old_node.parent.contents[old_node.name];
|
||||
+ var now = Date.now();
|
||||
+ old_node.parent.timestamp = now;
|
||||
old_node.name = new_name;
|
||||
new_dir.contents[new_name] = old_node;
|
||||
+ new_dir.timestamp = now;
|
||||
old_node.parent = new_dir;
|
||||
},
|
||||
unlink: function(parent, name) {
|
||||
delete parent.contents[name];
|
||||
+ parent.timestamp = Date.now();
|
||||
},
|
||||
rmdir: function(parent, name) {
|
||||
var node = FS.lookupNode(parent, name);
|
||||
@@ -226,6 +231,7 @@
|
||||
throw new FS.ErrnoError({{{ cDefine('ENOTEMPTY') }}});
|
||||
}
|
||||
delete parent.contents[name];
|
||||
+ parent.timestamp = Date.now();
|
||||
},
|
||||
readdir: function(node) {
|
||||
var entries = ['.', '..'];
|
|
@ -0,0 +1,78 @@
|
|||
import subprocess
|
||||
from . import common
|
||||
|
||||
|
||||
def test_memfsmtime(tmpdir):
|
||||
with tmpdir.as_cwd():
|
||||
with open("main.c", "w") as f:
|
||||
f.write(
|
||||
r"""\
|
||||
#include <assert.h>
|
||||
#include <fcntl.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <time.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
void mysleep(int delta)
|
||||
{
|
||||
time_t end = time(NULL) + delta;
|
||||
|
||||
while (time(NULL)<end);
|
||||
}
|
||||
|
||||
time_t getmtime(char *fname)
|
||||
{
|
||||
struct stat buf;
|
||||
|
||||
stat(fname, &buf);
|
||||
return buf.st_mtime;
|
||||
}
|
||||
|
||||
void writefile(char *fname, char *content)
|
||||
{
|
||||
int fd = open(fname, O_CREAT | O_TRUNC | O_WRONLY, 0777);
|
||||
|
||||
write(fd, content, strlen(content));
|
||||
close(fd);
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
char tmpdir[64] = "/tmp/tmpXXXXXXX";
|
||||
char fname[64];
|
||||
time_t t0, t1, t2, t3;
|
||||
|
||||
mkdtemp(tmpdir);
|
||||
strcpy(fname, tmpdir);
|
||||
strcat(fname, "/foo.py");
|
||||
t0 = getmtime(tmpdir);
|
||||
mysleep(1);
|
||||
writefile(fname, "bar = 54\n");
|
||||
t1 = getmtime(tmpdir);
|
||||
t2 = getmtime(fname);
|
||||
assert(t1 > t0);
|
||||
assert(t1 == t2);
|
||||
mysleep(1);
|
||||
unlink(fname);
|
||||
t3 = getmtime(tmpdir);
|
||||
assert(t3 > t1);
|
||||
}
|
||||
"""
|
||||
)
|
||||
|
||||
subprocess.run(
|
||||
[
|
||||
"emcc",
|
||||
"-s",
|
||||
"MAIN_MODULE=1",
|
||||
"main.c",
|
||||
],
|
||||
check=True,
|
||||
env=common.env,
|
||||
)
|
||||
out = subprocess.run(
|
||||
["node", "a.out.js"], capture_output=True, check=False, env=common.env
|
||||
)
|
||||
assert out.returncode == 0
|
Loading…
Reference in New Issue