github.com/cockroachdb/pebble@v0.0.0-20231214172447-ab4952c5f87b/vfs/file_lock_windows.go (about)

     1  // Copyright 2013 The LevelDB-Go and Pebble Authors. All rights reserved. Use
     2  // of this source code is governed by a BSD-style license that can be found in
     3  // the LICENSE file.
     4  
     5  //go:build windows
     6  // +build windows
     7  
     8  package vfs
     9  
    10  import (
    11  	"io"
    12  
    13  	"golang.org/x/sys/windows"
    14  )
    15  
    16  // lockCloser hides all of an windows.Handle's methods, except for Close.
    17  type lockCloser struct {
    18  	fd windows.Handle
    19  }
    20  
    21  func (l lockCloser) Close() error {
    22  	return windows.Close(l.fd)
    23  }
    24  
    25  // Lock locks the given file. On Windows, Locking will fail if the file is
    26  // already open by the current process.
    27  func (defaultFS) Lock(name string) (io.Closer, error) {
    28  	p, err := windows.UTF16PtrFromString(name)
    29  	if err != nil {
    30  		return nil, err
    31  	}
    32  	fd, err := windows.CreateFile(p,
    33  		windows.GENERIC_READ|windows.GENERIC_WRITE,
    34  		0, nil, windows.CREATE_ALWAYS,
    35  		windows.FILE_ATTRIBUTE_NORMAL,
    36  		0,
    37  	)
    38  	if err != nil {
    39  		return nil, err
    40  	}
    41  	return lockCloser{fd: fd}, nil
    42  }