Repository navigation
Conversation
idCmdArgs::argv points into the object's own tokenized buffer, which operator= re-points. Since f15a41f, idList::Append copies its argument into a temporary before growing the list, and idCmdArgs had no copy constructor: the implicit member-wise copy left argv aimed at the caller's buffer, and operator= then computed each argument's offset from two unrelated buffers. The startup queue is an idList<idCmdArgs> growing every 16 entries, so the 17th, 33rd, ... "+" command lost its text and was silently skipped. In CI that left the dedicated-server smokes waiting for a "+quit" that never ran (Linux, macOS and Windows), dropped renderer self-tests from the startup matrix (RenderGraphResource, ModernVisibility and the Vulkan render-target set), and long client command lines lost commands such as "+map". The copy constructor now goes through operator=. cmd_args_copy.py compiles the production idCmdArgs and idList, copies a command and queues 40 through several growths, and checks each one reads back intact; it fails without this change. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
themuffinator
left a comment
There was a problem hiding this comment.
The copy constructor correctly reuses the existing rebasing assignment operator. Independently compiled the production header/operator=/AppendArg with the real idList on Windows: cbe967f loses queued and drained commands 17 and 33; this head preserves all 40 commands and passes the direct-copy case. cmd_args_copy.py also passes locally.
The successful Windows x64, Linux Clang/ARM64 and macOS ARM64 checks support the fix. Remaining timeouts are not passes. The cross-build failure was in Ubuntu package installation before compilation (liblzma5:arm64 dependency resolution); I have retried that job once. I am preparing joint validation with #191 and CI diagnostics so the command-queue fix and reduced validation time can be qualified together before integration.
|
Joint validation with #191 is now running in draft integration PR #200. It preserves both original commit histories and adds Windows ARM64 native failure diagnostics plus time for sanitizer tests after the build. The independent Windows native negative control reproduces the lost 17th/33rd commands on main and passes on this head. The standalone ARM64 cross-build retry has also progressed past the earlier package-install failure. |
|
The targeted Linux ARM64 cross-build retry completed successfully, including ELF verification and staged-package validation: run 39460306900. The original apt dependency failure did not recur. The integrated #200 cross build also passed. Other platform/CI gates remain outstanding; this does not turn the previous timeouts or Windows ARM64 native failures into passes. |
Fixes the dedicated-server smoke timeouts and most of the renderer startup-matrix failures that every PR and
maincurrently show in CI. Both are one regression from f15a41f.Cause
idCmdArgs::argvpoints into the object's owntokenizedbuffer, andidCmdArgs::operator=re-points it. f15a41f madeidList::Appendcopy its argument into a temporary before growing the list (const type value = obj;), butidCmdArgshas no copy constructor. The implicit member-wise copy leavesvalue.argvaimed at the caller's buffer, andlist[num] = valuethen computes each offset asvalue.argv[i] - value.tokenized, from two unrelated buffers.Startup
+commands are queued inidCmdSystemLocal::tokenizedCmds, anidList<idCmdArgs>that grows every 16 entries. So the 17th, 33rd, ... startup command reachesExecuteTokenizedStringwith an emptyargv[0]and is skipped silently. The same commit stopped reporting empty commands as unknown.What it broke in CI
+quitis the 17th command, so the server runs until the 45 s timeout ("missing marker: Game Shutdown"). Onmainthe step only looks green because earlier failures skip it.+commands,+setincluded, loses one, e.g. a+mapafter many+sets.Fix
idCmdArgs( const idCmdArgs &args ) { argc = 0; *this = args; }, so every copy re-pointsargv.Verification (Linux x64, GCC 16)
maintools/tests/linux_dedicated_server_smoke.pyGame Shutdownrenderer_validation_matrix.py --cases renderer-foundation-selftests(CI arguments)renderer_validation_matrix.py --cases renderer-vk-clear-startup+quitas the 17th+command*Locally it still misses only "Vulkan: validation enabled", because this machine has no Khronos validation layer installed. CI did not list that marker as missing.
New
tools/tests/cmd_args_copy.py(wired into both workflows andopenq4_validate.py) compiles the productionidCmdArgsheader,operator=andAppendArgagainst the realidList, copy-constructs a command and queues 40 through several growths. It fails onmainand passes here.Remaining CI failures this doesn't address
openq4-imported-game-regressionsfails inmp_match_authentication_contract,mp_match_pause_contractandmp_match_teams_contract. They pass on Linux and Windows x64. Their logs (game-regression-logs/) aren't uploaded, so I couldn't see why. The contracts' compiler probe asks vswhere for the x64 MSVC toolset, which is a plausible ARM64 difference.🤖 Generated with Claude Code