mirror of
https://github.com/podman-container-tools/podman.git
synced 2026-09-10 09:37:52 +00:00
Align codebase with v4.4.1-rhel PodmanConfig structure and API signatures to resolve compilation errors. - Update all cfg.Engine.* references to cfg.ContainersConf.Engine.* or cfg.ContainersConfDefaultsRO.Engine.* - Update all cfg.Network.* references to cfg.ContainersConf.Network.* - Update all cfg.Containers.* references to cfg.ContainersConf.Containers.* or cfg.ContainersConfDefaultsRO.Containers.* - Update cfg.Machine.* references to cfg.ContainersConfDefaultsRO.Machine.* - Fix PodmanConfig initialization in config.go to use ContainersConf and ContainersConfDefaultsRO fields - Add createOptions parameter to NetworkCreate method across all implementations (abi, tunnel, handlers) - Update ContainerEngine interface to match new NetworkCreate signature - Fix manager.Store call in secrets.go to use StoreOptions struct - Update DiskUsage to handle 3 return values - Fix NewConnectionWithIdentity call signature - Remove duplicate setupRemoteConnection function - Remove duplicate readRemoteCliFlags function - Remove duplicate function declarations in container_path_resolution.go, oci_conmon_linux.go - Comment out duplicate SpecGenToOCI and helper functions in oci.go/oci_linux.go - Remove unused imports across multiple files - Fix SSHMode flag handling (field doesn't exist in current PodmanConfig) - Fix ns.NetNS type handling in container_internal_linux.go - Add missing Terminal() method to Container struct - Add missing SdNotifySocket field to ContainerConfig - Fix DefaultCapabilities to use .Get() method - Fix cgroups.AvailableControllers reference - Fix ConmonPath type conversion (attributedstring.Slice) - Add missing ErrNetworkConnected error definition - Fix NetworkCreateOptions handling in secrets.go - Update networking code to use getNetNSPathCommon helper - Fix teardownNetwork method signature - Fix makeInspectPorts to makeInspectPortBindings - Remove hardcoded IsPasta() checks - Fix runtime_libpod.go field access patterns All changes align with the v4.4.1-rhel worktree structure to ensure compatibility with upcoming cherry-picks. Substantially Assisted-by AI: Cursor <auto> Signed-off-by: Chris Evich <cevich@redhat.com>
96 lines
2.1 KiB
Go
96 lines
2.1 KiB
Go
package sftp
|
|
|
|
import (
|
|
"sync"
|
|
)
|
|
|
|
type allocator struct {
|
|
sync.Mutex
|
|
available [][]byte
|
|
// map key is the request order
|
|
used map[uint32][][]byte
|
|
}
|
|
|
|
func newAllocator() *allocator {
|
|
return &allocator{
|
|
// micro optimization: initialize available pages with an initial capacity
|
|
available: make([][]byte, 0, SftpServerWorkerCount*2),
|
|
used: make(map[uint32][][]byte),
|
|
}
|
|
}
|
|
|
|
// GetPage returns a previously allocated and unused []byte or create a new one.
|
|
// The slice have a fixed size = maxMsgLength, this value is suitable for both
|
|
// receiving new packets and reading the files to serve
|
|
func (a *allocator) GetPage(requestOrderID uint32) []byte {
|
|
a.Lock()
|
|
defer a.Unlock()
|
|
|
|
var result []byte
|
|
|
|
// get an available page and remove it from the available ones.
|
|
if len(a.available) > 0 {
|
|
truncLength := len(a.available) - 1
|
|
result = a.available[truncLength]
|
|
|
|
a.available[truncLength] = nil // clear out the internal pointer
|
|
a.available = a.available[:truncLength] // truncate the slice
|
|
}
|
|
|
|
// no preallocated slice found, just allocate a new one
|
|
if result == nil {
|
|
result = make([]byte, maxMsgLength)
|
|
}
|
|
|
|
// put result in used pages
|
|
a.used[requestOrderID] = append(a.used[requestOrderID], result)
|
|
|
|
return result
|
|
}
|
|
|
|
// ReleasePages marks unused all pages in use for the given requestID
|
|
func (a *allocator) ReleasePages(requestOrderID uint32) {
|
|
a.Lock()
|
|
defer a.Unlock()
|
|
|
|
if used := a.used[requestOrderID]; len(used) > 0 {
|
|
a.available = append(a.available, used...)
|
|
}
|
|
delete(a.used, requestOrderID)
|
|
}
|
|
|
|
// Free removes all the used and available pages.
|
|
// Call this method when the allocator is not needed anymore
|
|
func (a *allocator) Free() {
|
|
a.Lock()
|
|
defer a.Unlock()
|
|
|
|
a.available = nil
|
|
a.used = make(map[uint32][][]byte)
|
|
}
|
|
|
|
func (a *allocator) countUsedPages() int {
|
|
a.Lock()
|
|
defer a.Unlock()
|
|
|
|
num := 0
|
|
for _, p := range a.used {
|
|
num += len(p)
|
|
}
|
|
return num
|
|
}
|
|
|
|
func (a *allocator) countAvailablePages() int {
|
|
a.Lock()
|
|
defer a.Unlock()
|
|
|
|
return len(a.available)
|
|
}
|
|
|
|
func (a *allocator) isRequestOrderIDUsed(requestOrderID uint32) bool {
|
|
a.Lock()
|
|
defer a.Unlock()
|
|
|
|
_, ok := a.used[requestOrderID]
|
|
return ok
|
|
}
|