[HTML5] Close IDBFS database on exit.

This should be made available in emscripten in a decent way.
Possibly after unmount, to free the database lock and allow performing
operations on it from javascript after the Emscripten Runtime has
exited.
This commit is contained in:
Fabio Alessandrelli 2020-09-23 21:11:07 +02:00
parent 6769dd64fc
commit ec396c7707
2 changed files with 19 additions and 3 deletions

View file

@ -121,6 +121,7 @@ Function('return this')()['Engine'] = (function() {
me.rtenv['noExitRuntime'] = true;
me.rtenv['onExecute'] = me.onExecute;
me.rtenv['onExit'] = function(code) {
me.rtenv['deinitFS']();
if (me.onExit)
me.onExit(code);
me.rtenv = null;

View file

@ -29,8 +29,7 @@
/*************************************************************************/
Module['initFS'] = function(persistentPaths) {
FS.mkdir('/userfs');
FS.mount(IDBFS, {}, '/userfs');
Module.mount_points = ['/userfs'].concat(persistentPaths);
function createRecursive(dir) {
try {
@ -43,13 +42,14 @@ Module['initFS'] = function(persistentPaths) {
}
}
persistentPaths.forEach(function(path) {
Module.mount_points.forEach(function(path) {
createRecursive(path);
FS.mount(IDBFS, {}, path);
});
return new Promise(function(resolve, reject) {
FS.syncfs(true, function(err) {
if (err) {
Module.mount_points = [];
Module.idbfs = false;
console.log("IndexedDB not available: " + err.message);
} else {
@ -60,6 +60,21 @@ Module['initFS'] = function(persistentPaths) {
});
};
Module['deinitFS'] = function() {
Module.mount_points.forEach(function(path) {
try {
FS.unmount(path);
} catch (e) {
console.log("Already unmounted", e);
}
if (Module.idbfs && IDBFS.dbs[path]) {
IDBFS.dbs[path].close();
delete IDBFS.dbs[path];
}
});
Module.mount_points = [];
};
Module['copyToFS'] = function(path, buffer) {
var p = path.lastIndexOf("/");
var dir = "/";