dirlock.go

// +build !windows

package dirlock

import (
    "fmt"
    "os"
    "syscall"
)

type DirLock struct {
    dir string
    f   *os.File
}

func New(dir string) *DirLock {
    return &DirLock{
        dir: dir,
    }
}

func (l *DirLock) Lock() error {
    f, err := os.Open(l.dir)
    if err != nil {
        return err
    }
    l.f = f
    err = syscall.Flock(int(f.Fd()), syscall.LOCK_EX|syscall.LOCK_NB)
    if err != nil {
        return fmt.Errorf("cannot flock directory %s - %s", l.dir, err)
    }
    return nil
}

func (l *DirLock) Unlock() error {
    defer l.f.Close()
    return syscall.Flock(int(l.f.Fd()), syscall.LOCK_UN)
}
				
时间: 2024-10-22 09:32:04

dirlock.go的相关文章

nsqd.go

package nsqd import (     "crypto/tls"     "crypto/x509"     "encoding/json"     "errors"     "fmt"     "io/ioutil"     "math/rand"     "net"     "os"     "path

dirlock_windows.go

package dirlock type DirLock struct {     dir string } func New(dir string) *DirLock {     return &DirLock{         dir: dir,     } } func (l *DirLock) Lock() error {     return nil } func (l *DirLock) Unlock() error {     return nil }