Skip to content

Commit

Permalink
Use dynamic recv buffer (#448)
Browse files Browse the repository at this point in the history
  • Loading branch information
halx99 authored Aug 23, 2024
1 parent 72d0ed5 commit 25dbfab
Show file tree
Hide file tree
Showing 9 changed files with 83 additions and 31 deletions.
44 changes: 32 additions & 12 deletions 1k/1kiss.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -210,9 +210,8 @@ $manifest = @{
cmdlinetools = '7.0+'; # android cmdlinetools
}

# the default generator of unix targets: linux, osx, ios, android, wasm
# the default generator requires explicit specified: osx, ios, android, wasm
$cmake_generators = @{
'linux' = 'Unix Makefiles'
'android' = 'Ninja'
'wasm' = 'Ninja'
'wasm64' = 'Ninja'
Expand Down Expand Up @@ -251,6 +250,7 @@ $options = @{
u = $false # whether delete 1kdist cross-platform prebuilt folder: path/to/_x
dm = $false # dump compiler preprocessors
i = $false # perform install
scope = 'local'
}

$optName = $null
Expand Down Expand Up @@ -484,6 +484,9 @@ function devtool_url($filename) {
function version_eq($ver1, $ver2) {
return $ver1 -eq $ver2
}
function version_like($ver1, $ver2) {
return $ver1 -like $ver2
}

# $ver2: accept x.y.z-rc1
function version_ge($ver1, $ver2) {
Expand Down Expand Up @@ -569,6 +572,7 @@ function find_prog($name, $path = $null, $mode = 'ONLY', $cmd = $null, $params =
$checkVerCond = $null
$minimalVer = ''
$preferredVer = ''
$wildcardVer = ''
$requiredVer = $manifest[$name]
if ($requiredVer) {
$preferredVer = $null
Expand All @@ -585,12 +589,19 @@ function find_prog($name, $path = $null, $mode = 'ONLY', $cmd = $null, $params =
$preferredVer = $preferredVer.TrimEnd('+')
if ($minimalVer.EndsWith('+')) { $minimalVer = $minimalVer.TrimEnd('+') }
$checkVerCond = '$(version_ge $foundVer $minimalVer)'
} else {
}
else {
if ($isRange) {
$checkVerCond = '$(version_in_range $foundVer $minimalVer $preferredVer)'
}
else {
$checkVerCond = '$(version_eq $foundVer $preferredVer)'
if (!$preferredVer.Contains('*')) {
$checkVerCond = '$(version_eq $foundVer $preferredVer)'
} else {
$wildcardVer = $preferredVer
$preferredVer = $wildcardVer.TrimEnd('.*')
$checkVerCond = '$(version_like $foundVer $wildcardVer)'
}
}
}
}
Expand Down Expand Up @@ -644,7 +655,6 @@ function find_prog($name, $path = $null, $mode = 'ONLY', $cmd = $null, $params =
}
else {
if ($preferredVer) {
# if (!$silent) { $1k.println("Not found $name, needs install: $preferredVer") }
$found_rets = $null, $preferredVer
}
else {
Expand Down Expand Up @@ -833,7 +843,7 @@ function setup_ninja() {
}

# setup cmake
function setup_cmake($skipOS = $false, $scope = 'local') {
function setup_cmake($skipOS = $false) {
$cmake_prog, $cmake_ver = find_prog -name 'cmake'
if ($cmake_prog -and (!$skipOS -or $cmake_prog.Contains($myRoot))) {
return $cmake_prog, $cmake_ver
Expand Down Expand Up @@ -887,13 +897,15 @@ function setup_cmake($skipOS = $false, $scope = 'local') {
}
}
elseif ($IsLinux) {
if ($scope -ne 'global') {
if ($option.scope -ne 'global') {
$1k.mkdirs($cmake_root)
& "$cmake_pkg_path" '--skip-license' '--exclude-subdir' "--prefix=$cmake_root" 1>$null 2>$null
}
else {
& "$cmake_pkg_path" '--skip-license' '--prefix=/usr/local' 1>$null 2>$null
$cmake_bin = '/usr/local/bin'
sudo bash "$cmake_pkg_path" '--skip-license' '--prefix=/usr/local' 1>$null 2>$null
}
if (!$?) { Remove-Item $cmake_pkg_path -Force }
}

$cmake_prog, $_ = find_prog -name 'cmake' -path $cmake_bin -silent $true
Expand All @@ -903,6 +915,7 @@ function setup_cmake($skipOS = $false, $scope = 'local') {

$1k.println("Using cmake: $cmake_prog, version: $cmake_ver")
}

$1k.addpath($cmake_bin)
return $cmake_prog, $cmake_ver
}
Expand Down Expand Up @@ -1220,7 +1233,9 @@ function setup_msvc() {
if (!$cl_prog) {
if ($VS_INST) {
Import-Module "$VS_PATH\Common7\Tools\Microsoft.VisualStudio.DevShell.dll"
Enter-VsDevShell -VsInstanceId $VS_INST.instanceId -SkipAutomaticLocation -DevCmdArguments "-arch=$target_cpu -host_arch=x64 -no_logo"
$dev_cmd_args = "-arch=$target_cpu -host_arch=x64 -no_logo"
if (!$manifest['msvc'].EndsWith('+')) { $dev_cmd_args += " -vcvars_ver=$cl_ver" }
Enter-VsDevShell -VsInstanceId $VS_INST.instanceId -SkipAutomaticLocation -DevCmdArguments $dev_cmd_args

$cl_prog, $cl_ver = find_prog -name 'msvc' -cmd 'cl' -silent $true -usefv $true
$1k.println("Using msvc: $cl_prog, version: $cl_ver")
Expand Down Expand Up @@ -1560,7 +1575,7 @@ elseif ($Global:is_android) {
$ninja_prog = setup_ninja
# ensure ninja in cmake_bin
if (!(ensure_cmake_ninja $cmake_prog $ninja_prog)) {
$cmake_prog, $Script:cmake_ver = setup_cmake -Force
$cmake_prog, $Script:cmake_ver = setup_cmake -skipOS $true
if (!(ensure_cmake_ninja $cmake_prog $ninja_prog)) {
$1k.println("Ensure ninja in cmake bin directory fail")
}
Expand Down Expand Up @@ -1589,14 +1604,19 @@ elseif ($Global:is_wasm) {
}

$is_host_target = $Global:is_win32 -or $Global:is_linux -or $Global:is_mac
$is_host_cpu = $HOST_CPU -eq $TARGET_CPU

if (!$setupOnly) {
$BUILD_DIR = $null
$SOURCE_DIR = $null

function resolve_out_dir($prefix) {
if ($is_host_target) {
$out_dir = "${prefix}${TARGET_CPU}"
if (!$is_host_cpu) {
$out_dir = "${prefix}${TARGET_CPU}"
} else {
$out_dir = $prefix.TrimEnd("_")
}
}
else {
$out_dir = "${prefix}${TARGET_OS}"
Expand Down Expand Up @@ -1707,7 +1727,7 @@ if (!$setupOnly) {
}
}

if (!$cmake_generator -and !$TARGET_OS.StartsWith('win')) {
if (!$cmake_generator -and !$TARGET_OS.StartsWith('win') -and $TARGET_OS -ne 'linux') {
$cmake_generator = $cmake_generators[$TARGET_OS]
if ($null -eq $cmake_generator) {
$cmake_generator = if (!$IsWin) { 'Unix Makefiles' } else { 'Ninja' }
Expand Down
8 changes: 7 additions & 1 deletion 1k/fetch.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,16 @@ function(_1kfetch_init)
set(_1kfetch_manifest "${_1kfetch_manifest}" CACHE STRING "" FORCE)
endif()

if(NOT EXISTS ${PWSH_PROG}) # try again
unset(PWSH_PROG CACHE)
find_program(PWSH_PROG NAMES pwsh powershell NO_PACKAGE_ROOT_PATH NO_CMAKE_PATH NO_CMAKE_ENVIRONMENT_PATH NO_CMAKE_SYSTEM_PATH NO_CMAKE_FIND_ROOT_PATH)
endif()

execute_process(COMMAND ${PWSH_PROG} ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/resolv-uri.ps1
-name "1kdist"
-manifest ${_1kfetch_manifest}
OUTPUT_VARIABLE _1kdist_url
RESULT_VARIABLE _1kdist_error
)

if(_1kdist_url)
Expand All @@ -33,7 +39,7 @@ function(_1kfetch_init)
set(_1kdist_base_url "${_1kdist_base_url}/${_1kdist_ver}" PARENT_SCOPE)
set(_1kdist_ver ${_1kdist_ver} PARENT_SCOPE)
else()
message(WARNING "Resolve 1kdist uri fail, the _1kfetch_dist will not work")
message(WARNING "Resolve 1kdist uri fail, ${_1kdist_error}, the _1kfetch_dist will not work")
endif()
endfunction()

Expand Down
21 changes: 18 additions & 3 deletions 1k/fetch.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -50,8 +50,8 @@ function fetch_repo($url, $name, $dest, $ext) {
if ($ext -eq '.zip') {
Expand-Archive -Path $out -DestinationPath $prefix -Force
}
elseif ($ext -match '\.tar(\..*)?$'){
tar xf "$out" -C $prefix
elseif ($ext -match '\.tar(\..*)?$') {
tar xvf "$out" -C $prefix
}
}
catch {
Expand All @@ -62,7 +62,22 @@ function fetch_repo($url, $name, $dest, $ext) {
if (!(Test-Path $dest -PathType Container)) {
$original_lib_src = Join-Path $prefix $Script:url_pkg_name
if (Test-Path $original_lib_src -PathType Container) {
Rename-Item $original_lib_src $dest -Force
$tries = 0
do {
try {
Rename-Item $original_lib_src $dest -Force
if ($?) {
break
}
}
catch {

}

println "fetch.ps1: rename $original_lib_src to $dest failed, try after 1 seconds"
$tries += 1
Start-Sleep -Seconds 1
} while ($tries -lt 10)
}
else {
throw "fetch.ps1: the package name mismatch for $out"
Expand Down
14 changes: 9 additions & 5 deletions 1k/setup-msvc.ps1
Original file line number Diff line number Diff line change
@@ -1,18 +1,22 @@
param(
$ver = '14.39'
$ver = '14.39',
$arch = 'x64'
)
$vswhere = "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe"
$vs_installs = ConvertFrom-Json "$(&$vswhere -version '17.0' -format 'json')"
$vs_installs
$vs_installer = '${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\setup.exe'
$vs_installer = "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\setup.exe"
$vs_path = $vs_installs[0].installationPath
$msvc_comp_id = "Microsoft.VisualStudio.Component.VC.$ver.17.9.x86.x64" # refer to: https://learn.microsoft.com/en-us/visualstudio/install/workload-component-id-vs-build-tools?view=vs-2022

$vs_arch = @{x64 = 'x86.x64'; x86 = 'x86.x64'; arm64 = 'ARM64'; arm = 'ARM' }[$arch]
$msvc_comp_id = "Microsoft.VisualStudio.Component.VC.$ver.17.9.$vs_arch" # refer to: https://learn.microsoft.com/en-us/visualstudio/install/workload-component-id-vs-build-tools?view=vs-2022
echo "Installing $msvc_comp_id ..."
&$vs_installer modify --quiet --installPath $vs_path --add $msvc_comp_id | Out-Host

if($?) {
if ($?) {
echo 'setup msvc success.'
} else {
}
else {
echo 'setup msvc fail'
}

Expand Down
2 changes: 1 addition & 1 deletion 3rdparty/lua
2 changes: 1 addition & 1 deletion manifest.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"versions": {
"1kdist": "v86"
"1kdist": "v90"
},
"mirrors": {
"github": {
Expand Down
2 changes: 1 addition & 1 deletion yasio/config.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -205,7 +205,7 @@ SOFTWARE.
/*
** The yasio version macros
*/
#define YASIO_VERSION_NUM 0x040204
#define YASIO_VERSION_NUM 0x040205

/*
** The macros used by io_service.
Expand Down
19 changes: 13 additions & 6 deletions yasio/io_service.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -376,7 +376,7 @@ int io_transport::write(io_send_buffer&& buffer, completion_cb_t&& handler)
get_service().wakeup();
return n;
}
int io_transport::do_read(int revent, int& error, highp_time_t&) { return this->call_read(buffer_ + offset_, sizeof(buffer_) - offset_, revent, error); }
int io_transport::do_read(int revent, int& error, highp_time_t&) { return this->call_read(buffer_.data() + offset_, static_cast<int>(buffer_.size() - offset_), revent, error); }
bool io_transport::do_write(highp_time_t& wait_duration)
{
bool ret = false;
Expand Down Expand Up @@ -728,7 +728,14 @@ int io_transport_kcp::do_read(int revent, int& error, highp_time_t& wait_duratio
this->handle_input(rawbuf_.data(), n, error, wait_duration);
if (!error)
{ // !important, should always try to call ikcp_recv when no error occured.
n = ::ikcp_recv(kcp_, buffer_ + offset_, sizeof(buffer_) - offset_);
auto kdata_size = ::ikcp_peeksize(kcp_);
if (kdata_size > 0)
{
auto need_size = static_cast<size_t>(kdata_size + offset_);
if (buffer_.size() < need_size)
buffer_.resize(kdata_size + offset_);
n = ::ikcp_recv(kcp_, buffer_.data() + offset_, kdata_size);
}
if (n > 0) // If got data from kcp, don't wait
wait_duration = 0;
else if (n < 0)
Expand Down Expand Up @@ -1767,7 +1774,7 @@ bool io_service::do_read(transport_handle_t transport)
const int bytes_to_strip = transport->ctx_->uparams_.initial_bytes_to_strip;
if (transport->expected_size_ == -1)
{ // decode length
int length = transport->ctx_->decode_len_(transport->buffer_, transport->offset_ + n);
int length = transport->ctx_->decode_len_(transport->buffer_.data(), transport->offset_ + n);
if (length > 0)
{
if (length < bytes_to_strip)
Expand All @@ -1793,7 +1800,7 @@ bool io_service::do_read(transport_handle_t transport)
}
else if (n > 0)
{ // forward packet, don't perform unpack, it's useful for implement streaming based protocol, like http, websocket and ...
this->forward_packet(transport->cindex(), io_packet_view{transport->buffer_, n}, transport);
this->forward_packet(transport->cindex(), io_packet_view{transport->buffer_.data(), n}, transport);
}
}
else
Expand All @@ -1811,15 +1818,15 @@ void io_service::unpack(transport_handle_t transport, int bytes_want /*want cons
auto& offset = transport->offset_;
auto bytes_available = bytes_transferred + offset;
auto& pkt = transport->expected_packet_;
pkt.insert(pkt.end(), transport->buffer_ + bytes_to_strip, transport->buffer_ + (std::min)(bytes_want, bytes_available));
pkt.insert(pkt.end(), transport->buffer_.data() + bytes_to_strip, transport->buffer_.data() + (std::min)(bytes_want, bytes_available));

// set 'offset' to bytes of remain buffer
offset = bytes_available - bytes_want;
if (offset >= 0)
{ /* pdu received properly */
if (offset > 0)
{ /* move remain data to head of buffer and hold 'offset'. */
::memmove(transport->buffer_, transport->buffer_ + bytes_want, offset);
::memmove(transport->buffer_.data(), transport->buffer_.data() + bytes_want, offset);
this->wait_duration_ = 0;
}
// move properly pdu to ready queue, the other thread who care about will retrieve it.
Expand Down
2 changes: 1 addition & 1 deletion yasio/io_service.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -778,7 +778,7 @@ class io_transport : public io_base {

bool is_valid() const { return ctx_ != nullptr; }

char buffer_[yasio__max_rcvbuf]; // recv buffer, 64K
yasio::sbyte_buffer buffer_{static_cast<size_t>(yasio__max_rcvbuf)};
int offset_ = 0; // recv buffer offset

int expected_size_ = -1;
Expand Down

0 comments on commit 25dbfab

Please sign in to comment.