github.com/elastos/Elastos.ELA.SideChain.ETH@v0.2.2/common/fdlimit/fdlimit_unix.go (about)

     1  // Copyright 2016 The Elastos.ELA.SideChain.ESC Authors
     2  // This file is part of the Elastos.ELA.SideChain.ESC library.
     3  //
     4  // The Elastos.ELA.SideChain.ESC library is free software: you can redistribute it and/or modify
     5  // it under the terms of the GNU Lesser General Public License as published by
     6  // the Free Software Foundation, either version 3 of the License, or
     7  // (at your option) any later version.
     8  //
     9  // The Elastos.ELA.SideChain.ESC library is distributed in the hope that it will be useful,
    10  // but WITHOUT ANY WARRANTY; without even the implied warranty of
    11  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    12  // GNU Lesser General Public License for more details.
    13  //
    14  // You should have received a copy of the GNU Lesser General Public License
    15  // along with the Elastos.ELA.SideChain.ESC library. If not, see <http://www.gnu.org/licenses/>.
    16  
    17  // +build linux netbsd openbsd solaris
    18  
    19  package fdlimit
    20  
    21  import "syscall"
    22  
    23  // Raise tries to maximize the file descriptor allowance of this process
    24  // to the maximum hard-limit allowed by the OS.
    25  // Returns the size it was set to (may differ from the desired 'max')
    26  func Raise(max uint64) (uint64, error) {
    27  	// Get the current limit
    28  	var limit syscall.Rlimit
    29  	if err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &limit); err != nil {
    30  		return 0, err
    31  	}
    32  	// Try to update the limit to the max allowance
    33  	limit.Cur = limit.Max
    34  	if limit.Cur > max {
    35  		limit.Cur = max
    36  	}
    37  	if err := syscall.Setrlimit(syscall.RLIMIT_NOFILE, &limit); err != nil {
    38  		return 0, err
    39  	}
    40  	// MacOS can silently apply further caps, so retrieve the actually set limit
    41  	if err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &limit); err != nil {
    42  		return 0, err
    43  	}
    44  	return limit.Cur, nil
    45  }
    46  
    47  // Current retrieves the number of file descriptors allowed to be opened by this
    48  // process.
    49  func Current() (int, error) {
    50  	var limit syscall.Rlimit
    51  	if err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &limit); err != nil {
    52  		return 0, err
    53  	}
    54  	return int(limit.Cur), nil
    55  }
    56  
    57  // Maximum retrieves the maximum number of file descriptors this process is
    58  // allowed to request for itself.
    59  func Maximum() (int, error) {
    60  	var limit syscall.Rlimit
    61  	if err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &limit); err != nil {
    62  		return 0, err
    63  	}
    64  	return int(limit.Max), nil
    65  }