Browse Source

[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.
Fabio Alessandrelli 4 years ago
parent
commit
1bfc582633
2 changed files with 19 additions and 3 deletions
  1. 1 0
      platform/javascript/engine/engine.js
  2. 18 3
      platform/javascript/native/utils.js

+ 1 - 0
platform/javascript/engine/engine.js

@@ -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;

+ 18 - 3
platform/javascript/native/utils.js

@@ -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 = "/";