diff --git a/pkg/os/flock.go b/pkg/os/flock.go new file mode 100644 index 00000000..5dd7d499 --- /dev/null +++ b/pkg/os/flock.go @@ -0,0 +1,37 @@ +package os + +import ( + "os" + "path/filepath" + + "github.com/gofrs/flock" +) + +type Flock struct { + f *flock.Flock +} + +func NewFileLock(path string) (*Flock, error) { + if path == "" { + path = os.TempDir() + string(os.PathSeparator) + "cloud_game.lock" + } + + if err := os.MkdirAll(filepath.Dir(path), 0770); err != nil { + return nil, err + } else { + f, err := os.Create(path) + defer func() { _ = f.Close() }() + if err != nil { + return nil, err + } + } + + f := Flock{ + f: flock.New(path), + } + + return &f, nil +} + +func (f *Flock) Lock() error { return f.f.Lock() } +func (f *Flock) Unlock() error { return f.f.Unlock() } diff --git a/pkg/os/os.go b/pkg/os/os.go index c3ab2718..eb7c5f47 100644 --- a/pkg/os/os.go +++ b/pkg/os/os.go @@ -28,6 +28,10 @@ func CheckCreateDir(path string) error { return nil } +func MakeDirAll(path string) error { + return os.MkdirAll(path, os.ModeDir|os.ModePerm) +} + func ExpectTermination() chan struct{} { signals := make(chan os.Signal, 1) signal.Notify(signals, os.Interrupt, syscall.SIGTERM) diff --git a/pkg/worker/caged/libretro/manager/http.go b/pkg/worker/caged/libretro/manager/http.go index 72826181..308677a4 100644 --- a/pkg/worker/caged/libretro/manager/http.go +++ b/pkg/worker/caged/libretro/manager/http.go @@ -1,14 +1,11 @@ package manager import ( - "os" - "path/filepath" - "github.com/giongto35/cloud-game/v3/pkg/config" "github.com/giongto35/cloud-game/v3/pkg/logger" + "github.com/giongto35/cloud-game/v3/pkg/os" "github.com/giongto35/cloud-game/v3/pkg/worker/caged/libretro/repo" "github.com/giongto35/cloud-game/v3/pkg/worker/caged/libretro/repo/arch" - "github.com/gofrs/flock" ) type Manager struct { @@ -18,29 +15,20 @@ type Manager struct { repo repo.Repository altRepo repo.Repository client Downloader - fmu *flock.Flock + fmu *os.Flock log *logger.Logger } func NewRemoteHttpManager(conf config.LibretroConfig, log *logger.Logger) Manager { repoConf := conf.Cores.Repo.Main altRepoConf := conf.Cores.Repo.Secondary - // used for synchronization of multiple process - fileLock := conf.Cores.Repo.ExtLock - if fileLock == "" { - fileLock = os.TempDir() + string(os.PathSeparator) + "cloud_game.lock" - } - log.Debug().Msgf("Using .lock file: %v", fileLock) - if err := os.MkdirAll(filepath.Dir(fileLock), 0770); err != nil { - log.Error().Err(err).Msgf("couldn't create lock") - } else { - f, err := os.Create(fileLock) - if err != nil { - log.Error().Err(err).Msgf("couldn't create lock") - } - _ = f.Close() + // used for synchronization of multiple process + flock, err := os.NewFileLock(conf.Cores.Repo.ExtLock) + if err != nil { + log.Error().Err(err).Msgf("couldn't make file lock") } + ar, err := arch.Guess() if err != nil { log.Error().Err(err).Msg("couldn't get Libretro core file extension") @@ -50,7 +38,7 @@ func NewRemoteHttpManager(conf config.LibretroConfig, log *logger.Logger) Manage BasicManager: BasicManager{Conf: conf}, arch: ar, client: NewDefaultDownloader(log), - fmu: flock.New(fileLock), + fmu: flock, log: log, } @@ -71,8 +59,7 @@ func CheckCores(conf config.Emulator, log *logger.Logger) error { log.Info().Msg("Starting Libretro cores sync...") coreManager := NewRemoteHttpManager(conf.Libretro, log) // make a dir for cores - dir := coreManager.Conf.GetCoresStorePath() - if err := os.MkdirAll(dir, os.ModeDir|os.ModePerm); err != nil { + if err := os.MakeDirAll(coreManager.Conf.GetCoresStorePath()); err != nil { return err } if err := coreManager.Sync(); err != nil {