mirror of
https://github.com/nabbar/golib.git
synced 2025-12-24 11:51:02 +08:00
[file/bandwidth] - ADD documentation: add enhanced README and TESTING guidelines - ADD tests: complete test suites with benchmarks, concurrency, and edge cases [file/perm] - ADD documentation: add enhanced README and TESTING guidelines - ADD tests: complete test suites with benchmarks, concurrency, and edge cases - ADD function to parse form "rwx-wxr-x" or "-rwx-w-r-x" - ADD function to ParseFileMode to convert os.FileMode to file.Perm [file/progress] - ADD documentation: add enhanced README and TESTING guidelines - ADD tests: complete test suites with benchmarks, concurrency, and edge cases [ioutils/...] - UPDATE documentation: update enhanced README and TESTING guidelines - UPDATE tests: complete test suites with benchmarks, concurrency, and edge cases [logger/...] - UPDATE documentation: update enhanced README and TESTING guidelines - ADD documentation: add enhanced README and TESTING guidelines for sub packages - UPDATE tests: complete test suites with benchmarks, concurrency, and edge cases - UPDATE config: remove FileBufferSize from OptionFile (rework hookfile) - UPDATE fields: expose Store function in interface - REWORK hookfile: rework package, use aggregator to allow multi write and single file - FIX hookstderr: fix bug with NonColorable - FIX hookstdout: fix bug with NonColorable - FIX hookwriter: fix bug with NonColorable [network/protocol] - ADD function IsTCP, IsUDP, IsUnixLike to check type of protocol [runner] - FIX typo [socket] - UPDATE documentation: update enhanced README and TESTING guidelines - ADD documentation: add enhanced README and TESTING guidelines for sub packages - UPDATE tests: complete test suites with benchmarks, concurrency, and edge cases - REWORK server: use context compatible io.reader, io.writer, io.closer instead of reader / writer - REWORK server: simplify, optimize server - REMOVE reader, writer type - ADD context: add new interface in root socket interface to expose context interface that extend context, io reader/writer/closer, dediacted function to server (IsConnected, ...)
220 lines
8.8 KiB
Go
220 lines
8.8 KiB
Go
//go:build windows && cgo
|
|
// +build windows,cgo
|
|
|
|
/*
|
|
* MIT License
|
|
*
|
|
* Copyright (c) 2020 Nicolas JUHEL
|
|
*
|
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
* of this software and associated documentation files (the "Software"), to deal
|
|
* in the Software without restriction, including without limitation the rights
|
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
* copies of the Software, and to permit persons to whom the Software is
|
|
* furnished to do so, subject to the following conditions:
|
|
*
|
|
* The above copyright notice and this permission notice shall be included in all
|
|
* copies or substantial portions of the Software.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
* SOFTWARE.
|
|
*
|
|
*/
|
|
|
|
// Package maxstdio provides Windows-specific functions for managing the maximum number
|
|
// of simultaneously open file handles (stdio streams) in a process through Windows CRT.
|
|
//
|
|
// # Overview
|
|
//
|
|
// The maxstdio package offers a minimal CGO wrapper around the Windows C Runtime (CRT)
|
|
// functions _getmaxstdio() and _setmaxstdio(), enabling Go applications to query and
|
|
// modify the process-level limit for open file descriptors. This is essential for
|
|
// high-concurrency applications, servers, and build systems that need to handle many
|
|
// open files concurrently.
|
|
//
|
|
// By default, Windows processes have a limit of 512 simultaneously open file handles,
|
|
// which is often insufficient for servers, database connection pools, and build systems.
|
|
// This package allows applications to increase this limit up to ~8192 handles.
|
|
//
|
|
// # Design Philosophy
|
|
//
|
|
// The package follows these design principles:
|
|
//
|
|
// 1. Platform-Specific: Leverages native Windows CRT for optimal integration
|
|
// 2. Minimal Overhead: Thin CGO wrapper (~100-200ns per call)
|
|
// 3. Type-Safe: Go-friendly integer-based API
|
|
// 4. Build-Time Safety: Conditional compilation prevents cross-platform issues
|
|
// 5. Zero Dependencies: Only requires Windows CRT (no third-party libraries)
|
|
//
|
|
// # Architecture
|
|
//
|
|
// The package consists of three layers:
|
|
//
|
|
// ┌────────────────────────┐
|
|
// │ Go Application │
|
|
// │ (Your code) │
|
|
// └───────────┬────────────┘
|
|
// │
|
|
// ┌───────────▼────────────┐
|
|
// │ maxstdio.go │
|
|
// │ GetMaxStdio() │ ← Go API (public)
|
|
// │ SetMaxStdio(n) │
|
|
// └───────────┬────────────┘
|
|
// │ CGO boundary
|
|
// ┌───────────▼────────────┐
|
|
// │ maxstdio.c │
|
|
// │ CGetMaxSTDIO() │ ← C wrappers
|
|
// │ CSetMaxSTDIO(n) │
|
|
// └───────────┬────────────┘
|
|
// │
|
|
// ┌───────────▼────────────┐
|
|
// │ Windows CRT │
|
|
// │ _getmaxstdio() │ ← Native CRT
|
|
// │ _setmaxstdio(n) │
|
|
// └────────────────────────┘
|
|
//
|
|
// # Platform Requirements
|
|
//
|
|
// This package has strict platform requirements:
|
|
//
|
|
// - Operating System: Windows (any version with CRT support)
|
|
// - CGO: Must be enabled (CGO_ENABLED=1)
|
|
// - C Compiler: MinGW-w64, MSVC, or TDM-GCC
|
|
//
|
|
// The package uses build constraints to ensure it only compiles on Windows:
|
|
//
|
|
// //go:build windows && cgo
|
|
// // +build windows,cgo
|
|
//
|
|
// On non-Windows platforms or when CGO is disabled, the package is safely excluded
|
|
// from compilation, preventing build errors in cross-platform projects.
|
|
//
|
|
// # Use Cases
|
|
//
|
|
// Common scenarios where maxstdio is beneficial:
|
|
//
|
|
// 1. High-Concurrency Web Servers: Handling >100 concurrent connections where each
|
|
// connection uses multiple file handles (socket, logs, database connections).
|
|
// Default 512 limit is quickly exhausted.
|
|
//
|
|
// 2. Build Systems: Processing hundreds of source files simultaneously for
|
|
// cross-file analysis, dependency resolution, or compilation. Compilers and
|
|
// bundlers often need many files open at once.
|
|
//
|
|
// 3. Database Connection Pools: Each database connection is a network socket
|
|
// (file handle). Large pools (500+ connections) exceed the default limit.
|
|
//
|
|
// 4. File Processing Pipelines: Batch processors, ETL tools, and data migration
|
|
// utilities that need to read/write many files concurrently.
|
|
//
|
|
// 5. Log Aggregation: Systems collecting logs from many sources (files, sockets,
|
|
// pipes) simultaneously into a central repository.
|
|
//
|
|
// # Basic Usage
|
|
//
|
|
// Query the current limit:
|
|
//
|
|
// current := maxstdio.GetMaxStdio()
|
|
// fmt.Printf("Current limit: %d files\n", current)
|
|
//
|
|
// Increase the limit during initialization:
|
|
//
|
|
// func init() {
|
|
// old := maxstdio.SetMaxStdio(2048)
|
|
// actual := maxstdio.GetMaxStdio()
|
|
// log.Printf("File limit changed from %d to %d", old, actual)
|
|
// }
|
|
//
|
|
// With verification:
|
|
//
|
|
// required := 4096
|
|
// old := maxstdio.SetMaxStdio(required)
|
|
// actual := maxstdio.GetMaxStdio()
|
|
//
|
|
// if actual < required {
|
|
// log.Printf("Warning: Requested %d, got %d", required, actual)
|
|
// }
|
|
//
|
|
// # Advantages
|
|
//
|
|
// The package provides several advantages:
|
|
//
|
|
// - Direct Access: Native Windows CRT functions for optimal performance
|
|
// - Minimal Overhead: ~100-200ns per call (negligible for initialization)
|
|
// - Type-Safe: Go-friendly integer interface with clear semantics
|
|
// - Thread-Safe: CRT functions are thread-safe, safe to call concurrently
|
|
// - Build-Safe: Conditional compilation prevents cross-platform issues
|
|
// - Production-Ready: Stable, tested, and secure implementation
|
|
//
|
|
// # Limitations
|
|
//
|
|
// The package has several limitations to be aware of:
|
|
//
|
|
// - Windows-Only: Cannot be used on Linux, macOS, or other platforms
|
|
// - CGO Required: Requires CGO enabled and C compiler installed
|
|
// - System Constraints: Actual limit may be constrained by Windows configuration
|
|
// - Permission Requirements: High limits (>2048) may require administrator rights
|
|
// - Binary Size: CGO adds ~1-2MB to binary size due to CRT linkage
|
|
// - Cross-Compilation: More complex than pure Go due to CGO dependency
|
|
//
|
|
// # Performance
|
|
//
|
|
// CGO overhead is minimal for these functions:
|
|
//
|
|
// - GetMaxStdio(): ~100-200ns (single CGO call)
|
|
// - SetMaxStdio(): ~100-200ns (single CGO call + system update)
|
|
//
|
|
// Since these functions are typically called once during application initialization,
|
|
// the overhead is negligible (<0.001% of startup time).
|
|
//
|
|
// # Best Practices
|
|
//
|
|
// Follow these best practices for optimal usage:
|
|
//
|
|
// 1. Set Once: Call SetMaxStdio() during init() or main(), not repeatedly
|
|
// 2. Verify Changes: Always call GetMaxStdio() after SetMaxStdio() to verify
|
|
// 3. Reasonable Limits: Use 2048-4096 for most servers, avoid >8192
|
|
// 4. Monitor Usage: Track actual file handle usage vs. limit
|
|
// 5. Log Configuration: Log limit changes for debugging and auditing
|
|
// 6. Administrator Rights: Run as admin for limits >2048 if needed
|
|
//
|
|
// # Troubleshooting
|
|
//
|
|
// Common issues and solutions:
|
|
//
|
|
// - "C compiler not found": Install MinGW-w64 or MSVC and add to PATH
|
|
// - "CGO not enabled": Set CGO_ENABLED=1 environment variable
|
|
// - Limit not increasing: Run as Administrator or check system constraints
|
|
// - Cross-compilation fails: Install mingw-w64 cross-compiler on host platform
|
|
//
|
|
// # Security Considerations
|
|
//
|
|
// The package has minimal security concerns:
|
|
//
|
|
// - No network operations or external communication
|
|
// - No file system access beyond process configuration
|
|
// - No user input processing or validation required
|
|
// - Minimal attack surface (two simple CRT function calls)
|
|
// - No buffer overflows or memory corruption risks
|
|
//
|
|
// All operations are process-local and require no elevated privileges for typical
|
|
// limits (<2048).
|
|
//
|
|
// # References
|
|
//
|
|
// - Windows CRT Documentation: https://learn.microsoft.com/en-us/cpp/c-runtime-library/
|
|
// - _getmaxstdio: https://learn.microsoft.com/en-us/cpp/c-runtime-library/reference/getmaxstdio
|
|
// - _setmaxstdio: https://learn.microsoft.com/en-us/cpp/c-runtime-library/reference/setmaxstdio
|
|
// - CGO Documentation: https://pkg.go.dev/cmd/cgo
|
|
//
|
|
// # Examples
|
|
//
|
|
// For comprehensive examples and detailed documentation, see the package README.md
|
|
// and GoDoc at https://pkg.go.dev/github.com/nabbar/golib/ioutils/maxstdio
|
|
package maxstdio
|