Skip to content

Commit

Permalink
Merge pull request #7 from nabbar/AddWindowsRLimit
Browse files Browse the repository at this point in the history
Add windows r limit capabilities for File Descriptor (NOFILE)
 *  For Windows build, please follow this note :
 *	1) install package gcc-multilib gcc-mingw-w64 to build C source with GCC
 *		you will having this binaries
 *			- i686-w64-mingw32* for 32-bit Windows;
 *			- x86_64-w64-mingw32* for 64-bit Windows.
 *		locate you binaries gcc mingw path and note it:
 *			- win32 : updatedb && locate i686-w64-mingw32-gcc
 *			- win64 : updatedb && locate x86_64-w64-mingw32-gcc
 *	2) if you have an error in the build, or if the .o object file is not present in golib/njg-ioutils/maxstdio/, run this step
 *		- go to golib/njg-ioutils/maxstdio folder
 *		- gcc -c maxstdio.c
 *	3) for Win32 use this env var in prefix of your go build command (recommend to use -a flag) :
 *		CC=/usr/bin/i686-w64-mingw32-gcc CGO_ENABLED=1 GOOS=windows GOARCH=amd64 go build -a -v ...
 *	4) for win64 use this env var in prefix of your go build command (recommend to use -a flag) :
 *		CC=/usr/bin/x86_64-w64-mingw32-gcc CGO_ENABLED=1 GOOS=windows GOARCH=amd64 go build -a -v ...
 *
 *	Normally no problem will be result in the build
  • Loading branch information
Nicolas JUHEL authored Jun 18, 2020
2 parents 2c37b83 + 5757ea6 commit 1a5ad97
Show file tree
Hide file tree
Showing 7 changed files with 93 additions and 2 deletions.
19 changes: 19 additions & 0 deletions njs-ioutils/fileDescriptor.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,25 @@ package njs_ioutils
* SystemFileDescriptor is returning current Limit & max system limit for file descriptor (open file or I/O resource) currently set in the system
* This function return the current setting (current number of file descriptor and the max value) if the newValue given is zero
* Otherwise if the newValue is more than the current system limit, try to change the current limit in the system for this process only
*
* For Windows build, please follow this note :
* 1) install package gcc-multilib gcc-mingw-w64 to build C source with GCC
* you will having this binaries
* - i686-w64-mingw32* for 32-bit Windows;
* - x86_64-w64-mingw32* for 64-bit Windows.
* locate you binaries gcc mingw path and note it:
* - win32 : updatedb && locate i686-w64-mingw32-gcc
* - win64 : updatedb && locate x86_64-w64-mingw32-gcc
* 2) if you have an error in the build, or if the .o object file is not present in golib/njg-ioutils/maxstdio/, run this step
* - go to golib/njg-ioutils/maxstdio folder
* - gcc -c maxstdio.c
* 3) for Win32 use this env var in prefix of your go build command (recommend to use -a flag) :
* CC=/usr/bin/i686-w64-mingw32-gcc CGO_ENABLED=1 GOOS=windows GOARCH=amd64 go build -a -v ...
* 4) for win64 use this env var in prefix of your go build command (recommend to use -a flag) :
* CC=/usr/bin/x86_64-w64-mingw32-gcc CGO_ENABLED=1 GOOS=windows GOARCH=amd64 go build -a -v ...
*
* Normally no problem will be result in the build
*
*/
func SystemFileDescriptor(newValue int) (current int, max int, err error) {
return systemFileDescriptor(newValue)
Expand Down
19 changes: 17 additions & 2 deletions njs-ioutils/fileDescriptor_ko.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,23 @@

package njs_ioutils

import "fmt"
import (
"github.com/nabbar/golib/njs-ioutils/maxstdio"
)

func systemFileDescriptor(newValue int) (current int, max int, err error) {
return 0, 0, fmt.Errorf("rLimit is nor implemented in current system")
rLimit := maxstdio.GetMaxStdio()

if rLimit < 0 {
// default windows value
rLimit = 512
}

if newValue > rLimit {
rLimit = int(maxstdio.SetMaxStdio(newValue))
return SystemFileDescriptor(0)
}

return rLimit, rLimit, nil
// return 0, 0, fmt.Errorf("rLimit is nor implemented in current system")
}
10 changes: 10 additions & 0 deletions njs-ioutils/maxstdio/maxstdio.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
#include "maxstdio.h"
#include <stdio.h>

int CGetMaxSTDIO() {
return _getmaxstdio();
}

int CSetMaxSTDIO(int new_max) {
return _setmaxstdio(new_max);
}
16 changes: 16 additions & 0 deletions njs-ioutils/maxstdio/maxstdio.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
// +build windows cgo

package maxstdio

// #cgo CFLAGS: -g -Wall
// #include <stdlib.h>
// #include "maxstdio.h"
import "C"

func GetMaxStdio() int {
return int(C.CGetMaxSTDIO())
}

func SetMaxStdio(newMax int) int {
return int(C.CSetMaxSTDIO(C.int(newMax)))
}
5 changes: 5 additions & 0 deletions njs-ioutils/maxstdio/maxstdio.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
#ifndef _MAXSTDIO_H
#define _MAXSTDIO_H
int CGetMaxSTDIO();
int CSetMaxSTDIO(int new_max);
#endif
Binary file added njs-ioutils/maxstdio/maxstdio.o
Binary file not shown.
26 changes: 26 additions & 0 deletions test/test-win-max-nofile/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package main

import (
"fmt"
"os"

njs_ioutils "github.com/nabbar/golib/njs-ioutils"
)

func main() {
println("test to print Max STDIO NOFILE capabilities !!")
c, _, e := njs_ioutils.SystemFileDescriptor(0)
println(fmt.Sprintf("Actual limit is : %v | err : %v", c, e))

if e != nil {
os.Exit(1)
}

println("test to Change Max STDIO NOFILE capabilities !!")
c, _, e = njs_ioutils.SystemFileDescriptor(c + 512)
println(fmt.Sprintf("New limit is : %v | err : %v", c, e))

if e != nil {
os.Exit(1)
}
}

0 comments on commit 1a5ad97

Please sign in to comment.