//go:build !windows

package pid

import (
	"os"
	"skapp/pkg/logger"
	"syscall"
)

func (p *PidLock) Lock() error {
	_, err := os.Stat(p.file)
	if err == nil {
		os.Exit(0)
	}

	pidFileHandle, err := os.OpenFile(pidFile, os.O_RDONLY|os.O_CREATE, os.ModePerm)
	if err != nil {
		logger.Log.Fatalf("启动失败 进程锁文件 .pid 创建失败")
		return LockFail
	}

	err = syscall.Flock(int(pidFileHandle.Fd()), syscall.LOCK_EX|syscall.LOCK_NB)
	if err != nil {
		logger.Log.Fatalf("启动失败 进程锁文件 .pid 被占用")
		return LockFail
	}
	p.lock = pidFileHandle
	return nil
}

func (p *PidLock) UnLock() {
	_ = syscall.Flock(int(p.lock.Fd()), syscall.LOCK_UN)
	_ = p.lock.Close()
	_ = os.Remove(p.file)
}
