From a79ee4c2c68e4e3ea1bd68b0e045b741d5f205db Mon Sep 17 00:00:00 2001
From: Nuno Cruces <ncruces@users.noreply.github.com>
Date: Thu, 9 Jan 2025 11:19:40 +0000
Subject: [PATCH] Avoid weird mutex.

---
 ext/serdes/serdes.go | 23 ++++-------------------
 1 file changed, 4 insertions(+), 19 deletions(-)

diff --git a/ext/serdes/serdes.go b/ext/serdes/serdes.go
index 2e4aac42..50417603 100644
--- a/ext/serdes/serdes.go
+++ b/ext/serdes/serdes.go
@@ -3,7 +3,6 @@ package serdes
 
 import (
 	"io"
-	"sync"
 
 	"github.com/ncruces/go-sqlite3"
 	"github.com/ncruces/go-sqlite3/vfs"
@@ -18,8 +17,7 @@ func init() {
 // https://sqlite.org/c3ref/serialize.html
 func Serialize(db *sqlite3.Conn, schema string) ([]byte, error) {
 	var file sliceFile
-	openMtx.Lock()
-	openFile = &file
+	fileToOpen <- &file
 	err := db.Backup(schema, "file:db?vfs="+vfsName)
 	return file.data, err
 }
@@ -39,15 +37,11 @@ func Serialize(db *sqlite3.Conn, schema string) ([]byte, error) {
 // ["memdb"]: https://pkg.go.dev/github.com/ncruces/go-sqlite3/vfs/memdb
 // ["reader"]: https://pkg.go.dev/github.com/ncruces/go-sqlite3/vfs/readervfs
 func Deserialize(db *sqlite3.Conn, schema string, data []byte) error {
-	openMtx.Lock()
-	openFile = &sliceFile{data}
+	fileToOpen <- &sliceFile{data}
 	return db.Restore(schema, "file:db?vfs="+vfsName)
 }
 
-var (
-	openMtx  sync.Mutex
-	openFile *sliceFile
-)
+var fileToOpen = make(chan *sliceFile, 1)
 
 const vfsName = "github.com/ncruces/go-sqlite3/ext/deserialize.sliceVFS"
 
@@ -58,16 +52,7 @@ func (sliceVFS) Open(name string, flags vfs.OpenFlag) (vfs.File, vfs.OpenFlag, e
 		// notest // OPEN_MEMORY
 		return nil, flags, sqlite3.CANTOPEN
 	}
-
-	file := openFile
-	openFile = nil
-	openMtx.Unlock()
-
-	if file.data != nil {
-		flags |= vfs.OPEN_READONLY
-	}
-	flags |= vfs.OPEN_MEMORY
-	return file, flags, nil
+	return <-fileToOpen, flags | vfs.OPEN_MEMORY, nil
 }
 
 func (sliceVFS) Delete(name string, dirSync bool) error {