/ vendor / github.com / btcsuite / btcd / limits / limits_unix.go
limits_unix.go
 1  // Copyright (c) 2013-2014 The btcsuite developers
 2  // Use of this source code is governed by an ISC
 3  // license that can be found in the LICENSE file.
 4  
 5  // +build !windows,!plan9
 6  
 7  package limits
 8  
 9  import (
10  	"fmt"
11  	"syscall"
12  )
13  
14  const (
15  	fileLimitWant = 2048
16  	fileLimitMin  = 1024
17  )
18  
19  // SetLimits raises some process limits to values which allow btcd and
20  // associated utilities to run.
21  func SetLimits() error {
22  	var rLimit syscall.Rlimit
23  
24  	err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &rLimit)
25  	if err != nil {
26  		return err
27  	}
28  	if rLimit.Cur > fileLimitWant {
29  		return nil
30  	}
31  	if rLimit.Max < fileLimitMin {
32  		err = fmt.Errorf("need at least %v file descriptors",
33  			fileLimitMin)
34  		return err
35  	}
36  	if rLimit.Max < fileLimitWant {
37  		rLimit.Cur = rLimit.Max
38  	} else {
39  		rLimit.Cur = fileLimitWant
40  	}
41  	err = syscall.Setrlimit(syscall.RLIMIT_NOFILE, &rLimit)
42  	if err != nil {
43  		// try min value
44  		rLimit.Cur = fileLimitMin
45  		err = syscall.Setrlimit(syscall.RLIMIT_NOFILE, &rLimit)
46  		if err != nil {
47  			return err
48  		}
49  	}
50  
51  	return nil
52  }