Skip to content

Commit 25dbfab

Browse files
authored
Use dynamic recv buffer (#448)
1 parent 72d0ed5 commit 25dbfab

File tree

9 files changed

+83
-31
lines changed

9 files changed

+83
-31
lines changed

1k/1kiss.ps1

Lines changed: 32 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -210,9 +210,8 @@ $manifest = @{
210210
cmdlinetools = '7.0+'; # android cmdlinetools
211211
}
212212

213-
# the default generator of unix targets: linux, osx, ios, android, wasm
213+
# the default generator requires explicit specified: osx, ios, android, wasm
214214
$cmake_generators = @{
215-
'linux' = 'Unix Makefiles'
216215
'android' = 'Ninja'
217216
'wasm' = 'Ninja'
218217
'wasm64' = 'Ninja'
@@ -251,6 +250,7 @@ $options = @{
251250
u = $false # whether delete 1kdist cross-platform prebuilt folder: path/to/_x
252251
dm = $false # dump compiler preprocessors
253252
i = $false # perform install
253+
scope = 'local'
254254
}
255255

256256
$optName = $null
@@ -484,6 +484,9 @@ function devtool_url($filename) {
484484
function version_eq($ver1, $ver2) {
485485
return $ver1 -eq $ver2
486486
}
487+
function version_like($ver1, $ver2) {
488+
return $ver1 -like $ver2
489+
}
487490

488491
# $ver2: accept x.y.z-rc1
489492
function version_ge($ver1, $ver2) {
@@ -569,6 +572,7 @@ function find_prog($name, $path = $null, $mode = 'ONLY', $cmd = $null, $params =
569572
$checkVerCond = $null
570573
$minimalVer = ''
571574
$preferredVer = ''
575+
$wildcardVer = ''
572576
$requiredVer = $manifest[$name]
573577
if ($requiredVer) {
574578
$preferredVer = $null
@@ -585,12 +589,19 @@ function find_prog($name, $path = $null, $mode = 'ONLY', $cmd = $null, $params =
585589
$preferredVer = $preferredVer.TrimEnd('+')
586590
if ($minimalVer.EndsWith('+')) { $minimalVer = $minimalVer.TrimEnd('+') }
587591
$checkVerCond = '$(version_ge $foundVer $minimalVer)'
588-
} else {
592+
}
593+
else {
589594
if ($isRange) {
590595
$checkVerCond = '$(version_in_range $foundVer $minimalVer $preferredVer)'
591596
}
592597
else {
593-
$checkVerCond = '$(version_eq $foundVer $preferredVer)'
598+
if (!$preferredVer.Contains('*')) {
599+
$checkVerCond = '$(version_eq $foundVer $preferredVer)'
600+
} else {
601+
$wildcardVer = $preferredVer
602+
$preferredVer = $wildcardVer.TrimEnd('.*')
603+
$checkVerCond = '$(version_like $foundVer $wildcardVer)'
604+
}
594605
}
595606
}
596607
}
@@ -644,7 +655,6 @@ function find_prog($name, $path = $null, $mode = 'ONLY', $cmd = $null, $params =
644655
}
645656
else {
646657
if ($preferredVer) {
647-
# if (!$silent) { $1k.println("Not found $name, needs install: $preferredVer") }
648658
$found_rets = $null, $preferredVer
649659
}
650660
else {
@@ -833,7 +843,7 @@ function setup_ninja() {
833843
}
834844

835845
# setup cmake
836-
function setup_cmake($skipOS = $false, $scope = 'local') {
846+
function setup_cmake($skipOS = $false) {
837847
$cmake_prog, $cmake_ver = find_prog -name 'cmake'
838848
if ($cmake_prog -and (!$skipOS -or $cmake_prog.Contains($myRoot))) {
839849
return $cmake_prog, $cmake_ver
@@ -887,13 +897,15 @@ function setup_cmake($skipOS = $false, $scope = 'local') {
887897
}
888898
}
889899
elseif ($IsLinux) {
890-
if ($scope -ne 'global') {
900+
if ($option.scope -ne 'global') {
891901
$1k.mkdirs($cmake_root)
892902
& "$cmake_pkg_path" '--skip-license' '--exclude-subdir' "--prefix=$cmake_root" 1>$null 2>$null
893903
}
894904
else {
895-
& "$cmake_pkg_path" '--skip-license' '--prefix=/usr/local' 1>$null 2>$null
905+
$cmake_bin = '/usr/local/bin'
906+
sudo bash "$cmake_pkg_path" '--skip-license' '--prefix=/usr/local' 1>$null 2>$null
896907
}
908+
if (!$?) { Remove-Item $cmake_pkg_path -Force }
897909
}
898910

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

904916
$1k.println("Using cmake: $cmake_prog, version: $cmake_ver")
905917
}
918+
906919
$1k.addpath($cmake_bin)
907920
return $cmake_prog, $cmake_ver
908921
}
@@ -1220,7 +1233,9 @@ function setup_msvc() {
12201233
if (!$cl_prog) {
12211234
if ($VS_INST) {
12221235
Import-Module "$VS_PATH\Common7\Tools\Microsoft.VisualStudio.DevShell.dll"
1223-
Enter-VsDevShell -VsInstanceId $VS_INST.instanceId -SkipAutomaticLocation -DevCmdArguments "-arch=$target_cpu -host_arch=x64 -no_logo"
1236+
$dev_cmd_args = "-arch=$target_cpu -host_arch=x64 -no_logo"
1237+
if (!$manifest['msvc'].EndsWith('+')) { $dev_cmd_args += " -vcvars_ver=$cl_ver" }
1238+
Enter-VsDevShell -VsInstanceId $VS_INST.instanceId -SkipAutomaticLocation -DevCmdArguments $dev_cmd_args
12241239

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

15911606
$is_host_target = $Global:is_win32 -or $Global:is_linux -or $Global:is_mac
1607+
$is_host_cpu = $HOST_CPU -eq $TARGET_CPU
15921608

15931609
if (!$setupOnly) {
15941610
$BUILD_DIR = $null
15951611
$SOURCE_DIR = $null
15961612

15971613
function resolve_out_dir($prefix) {
15981614
if ($is_host_target) {
1599-
$out_dir = "${prefix}${TARGET_CPU}"
1615+
if (!$is_host_cpu) {
1616+
$out_dir = "${prefix}${TARGET_CPU}"
1617+
} else {
1618+
$out_dir = $prefix.TrimEnd("_")
1619+
}
16001620
}
16011621
else {
16021622
$out_dir = "${prefix}${TARGET_OS}"
@@ -1707,7 +1727,7 @@ if (!$setupOnly) {
17071727
}
17081728
}
17091729

1710-
if (!$cmake_generator -and !$TARGET_OS.StartsWith('win')) {
1730+
if (!$cmake_generator -and !$TARGET_OS.StartsWith('win') -and $TARGET_OS -ne 'linux') {
17111731
$cmake_generator = $cmake_generators[$TARGET_OS]
17121732
if ($null -eq $cmake_generator) {
17131733
$cmake_generator = if (!$IsWin) { 'Unix Makefiles' } else { 'Ninja' }

1k/fetch.cmake

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,16 @@ function(_1kfetch_init)
2020
set(_1kfetch_manifest "${_1kfetch_manifest}" CACHE STRING "" FORCE)
2121
endif()
2222

23+
if(NOT EXISTS ${PWSH_PROG}) # try again
24+
unset(PWSH_PROG CACHE)
25+
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)
26+
endif()
27+
2328
execute_process(COMMAND ${PWSH_PROG} ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/resolv-uri.ps1
2429
-name "1kdist"
2530
-manifest ${_1kfetch_manifest}
2631
OUTPUT_VARIABLE _1kdist_url
32+
RESULT_VARIABLE _1kdist_error
2733
)
2834

2935
if(_1kdist_url)
@@ -33,7 +39,7 @@ function(_1kfetch_init)
3339
set(_1kdist_base_url "${_1kdist_base_url}/${_1kdist_ver}" PARENT_SCOPE)
3440
set(_1kdist_ver ${_1kdist_ver} PARENT_SCOPE)
3541
else()
36-
message(WARNING "Resolve 1kdist uri fail, the _1kfetch_dist will not work")
42+
message(WARNING "Resolve 1kdist uri fail, ${_1kdist_error}, the _1kfetch_dist will not work")
3743
endif()
3844
endfunction()
3945

1k/fetch.ps1

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,8 @@ function fetch_repo($url, $name, $dest, $ext) {
5050
if ($ext -eq '.zip') {
5151
Expand-Archive -Path $out -DestinationPath $prefix -Force
5252
}
53-
elseif ($ext -match '\.tar(\..*)?$'){
54-
tar xf "$out" -C $prefix
53+
elseif ($ext -match '\.tar(\..*)?$') {
54+
tar xvf "$out" -C $prefix
5555
}
5656
}
5757
catch {
@@ -62,7 +62,22 @@ function fetch_repo($url, $name, $dest, $ext) {
6262
if (!(Test-Path $dest -PathType Container)) {
6363
$original_lib_src = Join-Path $prefix $Script:url_pkg_name
6464
if (Test-Path $original_lib_src -PathType Container) {
65-
Rename-Item $original_lib_src $dest -Force
65+
$tries = 0
66+
do {
67+
try {
68+
Rename-Item $original_lib_src $dest -Force
69+
if ($?) {
70+
break
71+
}
72+
}
73+
catch {
74+
75+
}
76+
77+
println "fetch.ps1: rename $original_lib_src to $dest failed, try after 1 seconds"
78+
$tries += 1
79+
Start-Sleep -Seconds 1
80+
} while ($tries -lt 10)
6681
}
6782
else {
6883
throw "fetch.ps1: the package name mismatch for $out"

1k/setup-msvc.ps1

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,22 @@
11
param(
2-
$ver = '14.39'
2+
$ver = '14.39',
3+
$arch = 'x64'
34
)
45
$vswhere = "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe"
56
$vs_installs = ConvertFrom-Json "$(&$vswhere -version '17.0' -format 'json')"
67
$vs_installs
7-
$vs_installer = '${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\setup.exe'
8+
$vs_installer = "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\setup.exe"
89
$vs_path = $vs_installs[0].installationPath
9-
$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
10+
11+
$vs_arch = @{x64 = 'x86.x64'; x86 = 'x86.x64'; arm64 = 'ARM64'; arm = 'ARM' }[$arch]
12+
$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
1013
echo "Installing $msvc_comp_id ..."
1114
&$vs_installer modify --quiet --installPath $vs_path --add $msvc_comp_id | Out-Host
1215

13-
if($?) {
16+
if ($?) {
1417
echo 'setup msvc success.'
15-
} else {
18+
}
19+
else {
1620
echo 'setup msvc fail'
1721
}
1822

manifest.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"versions": {
3-
"1kdist": "v86"
3+
"1kdist": "v90"
44
},
55
"mirrors": {
66
"github": {

yasio/config.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,7 @@ SOFTWARE.
205205
/*
206206
** The yasio version macros
207207
*/
208-
#define YASIO_VERSION_NUM 0x040204
208+
#define YASIO_VERSION_NUM 0x040205
209209

210210
/*
211211
** The macros used by io_service.

yasio/io_service.cpp

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -376,7 +376,7 @@ int io_transport::write(io_send_buffer&& buffer, completion_cb_t&& handler)
376376
get_service().wakeup();
377377
return n;
378378
}
379-
int io_transport::do_read(int revent, int& error, highp_time_t&) { return this->call_read(buffer_ + offset_, sizeof(buffer_) - offset_, revent, error); }
379+
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); }
380380
bool io_transport::do_write(highp_time_t& wait_duration)
381381
{
382382
bool ret = false;
@@ -728,7 +728,14 @@ int io_transport_kcp::do_read(int revent, int& error, highp_time_t& wait_duratio
728728
this->handle_input(rawbuf_.data(), n, error, wait_duration);
729729
if (!error)
730730
{ // !important, should always try to call ikcp_recv when no error occured.
731-
n = ::ikcp_recv(kcp_, buffer_ + offset_, sizeof(buffer_) - offset_);
731+
auto kdata_size = ::ikcp_peeksize(kcp_);
732+
if (kdata_size > 0)
733+
{
734+
auto need_size = static_cast<size_t>(kdata_size + offset_);
735+
if (buffer_.size() < need_size)
736+
buffer_.resize(kdata_size + offset_);
737+
n = ::ikcp_recv(kcp_, buffer_.data() + offset_, kdata_size);
738+
}
732739
if (n > 0) // If got data from kcp, don't wait
733740
wait_duration = 0;
734741
else if (n < 0)
@@ -1767,7 +1774,7 @@ bool io_service::do_read(transport_handle_t transport)
17671774
const int bytes_to_strip = transport->ctx_->uparams_.initial_bytes_to_strip;
17681775
if (transport->expected_size_ == -1)
17691776
{ // decode length
1770-
int length = transport->ctx_->decode_len_(transport->buffer_, transport->offset_ + n);
1777+
int length = transport->ctx_->decode_len_(transport->buffer_.data(), transport->offset_ + n);
17711778
if (length > 0)
17721779
{
17731780
if (length < bytes_to_strip)
@@ -1793,7 +1800,7 @@ bool io_service::do_read(transport_handle_t transport)
17931800
}
17941801
else if (n > 0)
17951802
{ // forward packet, don't perform unpack, it's useful for implement streaming based protocol, like http, websocket and ...
1796-
this->forward_packet(transport->cindex(), io_packet_view{transport->buffer_, n}, transport);
1803+
this->forward_packet(transport->cindex(), io_packet_view{transport->buffer_.data(), n}, transport);
17971804
}
17981805
}
17991806
else
@@ -1811,15 +1818,15 @@ void io_service::unpack(transport_handle_t transport, int bytes_want /*want cons
18111818
auto& offset = transport->offset_;
18121819
auto bytes_available = bytes_transferred + offset;
18131820
auto& pkt = transport->expected_packet_;
1814-
pkt.insert(pkt.end(), transport->buffer_ + bytes_to_strip, transport->buffer_ + (std::min)(bytes_want, bytes_available));
1821+
pkt.insert(pkt.end(), transport->buffer_.data() + bytes_to_strip, transport->buffer_.data() + (std::min)(bytes_want, bytes_available));
18151822

18161823
// set 'offset' to bytes of remain buffer
18171824
offset = bytes_available - bytes_want;
18181825
if (offset >= 0)
18191826
{ /* pdu received properly */
18201827
if (offset > 0)
18211828
{ /* move remain data to head of buffer and hold 'offset'. */
1822-
::memmove(transport->buffer_, transport->buffer_ + bytes_want, offset);
1829+
::memmove(transport->buffer_.data(), transport->buffer_.data() + bytes_want, offset);
18231830
this->wait_duration_ = 0;
18241831
}
18251832
// move properly pdu to ready queue, the other thread who care about will retrieve it.

yasio/io_service.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -778,7 +778,7 @@ class io_transport : public io_base {
778778

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

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

784784
int expected_size_ = -1;

0 commit comments

Comments
 (0)