github.com/moontrade/unsafe@v0.9.1/capture/limits.go (about)

     1  package capture
     2  
     3  import (
     4  	"syscall"
     5  )
     6  
     7  // SetRLimitFiles temporarily changes the file descriptor resource limit while calling the given function.
     8  func SetRLimitFiles(limit uint64, call func(limit uint64)) (err error) {
     9  	var tmp syscall.Rlimit
    10  	if err = syscall.Getrlimit(syscall.RLIMIT_NOFILE, &tmp); err != nil {
    11  		return nil
    12  	}
    13  	defer func() {
    14  		if err == nil {
    15  			err = syscall.Setrlimit(syscall.RLIMIT_NOFILE, &tmp)
    16  		}
    17  	}()
    18  
    19  	if err = syscall.Setrlimit(syscall.RLIMIT_NOFILE, &syscall.Rlimit{
    20  		Cur: limit,
    21  		Max: tmp.Max,
    22  	}); err != nil {
    23  		return err
    24  	}
    25  
    26  	call(limit)
    27  
    28  	return nil
    29  }