Source file src/os/file_mutex_plan9.go

     1  // Copyright 2022 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package os
     6  
     7  // File locking support for Plan 9. This uses fdMutex from the
     8  // internal/poll package.
     9  
    10  // incref adds a reference to the file. It returns an error if the file
    11  // is already closed. This method is on File so that we can incorporate
    12  // a nil test.
    13  func (f *File) incref(op string) (err error) {
    14  	if f == nil {
    15  		return ErrInvalid
    16  	}
    17  	if !f.fdmu.Incref() {
    18  		err = ErrClosed
    19  		if op != "" {
    20  			err = &PathError{Op: op, Path: f.name, Err: err}
    21  		}
    22  	}
    23  	return err
    24  }
    25  
    26  // decref removes a reference to the file. If this is the last
    27  // remaining reference, and the file has been marked to be closed,
    28  // then actually close it.
    29  func (file *file) decref() error {
    30  	if file.fdmu.Decref() {
    31  		return file.destroy()
    32  	}
    33  	return nil
    34  }
    35  
    36  // readLock adds a reference to the file and locks it for reading.
    37  // It returns an error if the file is already closed.
    38  func (file *file) readLock() error {
    39  	if !file.fdmu.ReadLock() {
    40  		return ErrClosed
    41  	}
    42  	return nil
    43  }
    44  
    45  // readUnlock removes a reference from the file and unlocks it for reading.
    46  // It also closes the file if it marked as closed and there is no remaining
    47  // reference.
    48  func (file *file) readUnlock() {
    49  	if file.fdmu.ReadUnlock() {
    50  		file.destroy()
    51  	}
    52  }
    53  
    54  // writeLock adds a reference to the file and locks it for writing.
    55  // It returns an error if the file is already closed.
    56  func (file *file) writeLock() error {
    57  	if !file.fdmu.WriteLock() {
    58  		return ErrClosed
    59  	}
    60  	return nil
    61  }
    62  
    63  // writeUnlock removes a reference from the file and unlocks it for writing.
    64  // It also closes the file if it is marked as closed and there is no remaining
    65  // reference.
    66  func (file *file) writeUnlock() {
    67  	if file.fdmu.WriteUnlock() {
    68  		file.destroy()
    69  	}
    70  }
    71  

View as plain text