From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from [87.239.111.99] (localhost [127.0.0.1]) by dev.tarantool.org (Postfix) with ESMTP id F12CB6ECCC; Sat, 17 Oct 2026 11:32:59 +0300 (MSK) DKIM-Filter: OpenDKIM Filter v2.11.0 dev.tarantool.org F12CB6ECCC DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=tarantool.org; s=dev; t=1792225980; bh=yyxob5UhhCN5GI/1XMcOsN/5bsTOrXZr+/1iUewLMig=; h=To:Date:In-Reply-To:References:Subject:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc: From; b=Gh/WwOMP8bkqGbRT3/kWExn9wW846WoL23zj2oNYAwbqFjSXKzZQDvZs493VBHRl2 xZEKYWPm3ngARRtWEGssUfqZW7gJyi45qBcEIh9EAHEcFM18pEl6RfKJJ14R841quV DHtYoVmiKqDa93AffC4jm+vYcYc9TMplgdYK7n2Q= Received: from send172.i.mail.ru (send172.i.mail.ru [95.163.59.11]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by dev.tarantool.org (Postfix) with ESMTPS id CCDFF6ECCC for ; Sat, 17 Oct 2026 11:32:57 +0300 (MSK) DKIM-Filter: OpenDKIM Filter v2.11.0 dev.tarantool.org CCDFF6ECCC Received: by exim-smtp-84d6fb566c-r9zg6 with esmtpa (envelope-from ) id 1xHzqa-000000002Vr-1c1t; Sat, 17 Oct 2026 11:32:56 +0300 To: Sergey Kaplun , Sergey Bronnikov , Evgeniy Temirgaleev Date: Sat, 17 Oct 2026 11:32:53 +0300 Message-ID: <20261017083253.412760-1-m.elhimov@vk.team> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20261015234516.385484-1-m.elhimov@vk.team> References: <20261015234516.385484-1-m.elhimov@vk.team> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Mailru-Src: smtp X-618D5548: ED49982913947A70F378A8CA21F699D6BD4E5D5E26CA2AF5A5400E9EA4CEC6CF525630C0949BD920 X-7564579A: 646B95376F6C166E X-77F55803: 4F1203BC0FB41BD9D5ABD805758C3F0B2DC1331E446A96F959C082B041B0C28F182A05F53808504002CA4593A6AB2E133DE06ABAFEAF67056B3A9768B7C9C751907E55F5DD9DA69B50BEE2EB090F92B7 X-7FA49CB5: FF5795518A3D127A4AD6D5ED66289B5278DA827A17800CE70FFC2100EB7B6895EA1F7E6F0F101C67BD4B6F7A4D31EC0BCC500DACC3FED6E28638F802B75D45FF8AA50765F7900637AC83A81C8FD4AD23D82A6BABE6F325AC2E85FA5F3EDFCBAA7353EFBB553375667E1D4B08D42AEC87109A3A85BE65888E00C4A3CCF85E515CB1A68646EEFF4A708EEF46B7454FC60B9742502CCDD46D0D0839144E5BB460BA2E808ACE2090B5E14AD6D5ED66289B5259CC434672EE63711DD303D21008E298D5E8D9A59859A8B6B372FE9A2E580EFC725E5C173C3A84C3CAC8CAD564530C1D089D37D7C0E48F6C5571747095F342E88FB05168BE4CE3AF X-87b9d050: 1 X-C1DE0DAB: 0D63561A33F958A50BEF20BC88EB272F5002B1117B3ED6960FBBC82C3389788019AC5B239BAD4335823CB91A9FED034534781492E4B8EEAD5C5DFC4BFF39B799F36E2E0160E5C55395B8A2A0B6518DF68C46860778A80D548E8926FB43031F38 X-C8649E89: 1C3962B70DF3F0AD73CAD6646DEDE191716CD42B3DD1D34C77DD89D51EBB774225B6776AC983F447FC0B9F89525902EE6F57B2FD27647F25E66C117BDB76D659436CDD21B14C787427B0F773B97CC26FC0AB82741435ABAA049457B62AAE5842E4544F2EBFE5FE2AB8341EE9D5BE9A0A3EE32B07ADB82C44CAFBC117C1DCEDB5895B872138D1BF1E9350E1BD188BD56E4C41F94D744909CE9D6718F459EE2962AE54DA86D399E591103B389C0A9E82E8 X-D57D3AED: 3ZO7eAau8CL7WIMRKs4sN3D3tLDjz0dLbV79QFUyzQ2Ujvy7cMT6pYYqY16iZVKkSc3dCLJ7zSJH7+u4VD18S7Vl4ZUrpaVfd2+vE6kuoey4m4VkSEu53w8ahmwBjZKM/YPHZyZHvz5uv+WouB9+ObcCpyrx6l7KImUglyhkEat/+ysWwi0gdhEs0JGjl6ggRWTy1haxBpVdbIX1nthFXOcIETfglQORZ0zpDET4Zrk3igikrdHlWHbLT+twScXAl/VZul3y37o= X-Mailru-Sender: 689FA8AB762F73937C9FA53A4753B3131268D8C87D4E4E70229FE6F587BC64C7A55B3E3C59C1C141567B8845310477678B5D19FF33E2B21BC8157BDAF8912DC0981874AA068F0975204DA63403278206F52067E1A4DAC7CAC77752E0C033A69E3453F38A29522196 X-Mras: Ok Subject: [Tarantool-patches] [PATCH luajit v3] dbg: remove wrong GC state X-BeenThere: tarantool-patches@dev.tarantool.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Tarantool development patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , From: Mikhail Elhimov via Tarantool-patches Reply-To: Mikhail Elhimov Cc: tarantool-patches@dev.tarantool.org Errors-To: tarantool-patches-bounces@dev.tarantool.org Sender: "Tarantool-patches" It was copied originally by mistake from the LuaVela fork of LuaJIT. --- Changes in v3: * Added comment about reachability of all the GC states from the same lua script Changes in v2: * Rebased onto https://lists.tarantool.org/pipermail/tarantool-patches/2026-October/030859.html to avoid conflicts This patch is to be applied after https://lists.tarantool.org/pipermail/tarantool-patches/2026-October/030859.html Branch: https://github.com/tarantool/luajit/tree/elhimov/gh-noticket-dbg-remove-wrong-gcstate src/luajit_dbg.py | 3 +- .../debug-extension-tests.py | 113 ++++++++++++++++-- 2 files changed, 104 insertions(+), 12 deletions(-) diff --git a/src/luajit_dbg.py b/src/luajit_dbg.py index a685ecfa..8f7249ab 100644 --- a/src/luajit_dbg.py +++ b/src/luajit_dbg.py @@ -1244,7 +1244,6 @@ def gc_state(g): 3: 'SWEEPSTRING', 4: 'SWEEP', 5: 'FINALIZE', - 6: 'LAST', }.get(int(g['gc']['state']), 'INVALID') @@ -2850,7 +2849,7 @@ LJState.__doc__ = ''' lj-state The command requires no args and dumps current VM and GC states: * VM state: <{}> -* GC state: +* GC state: * JIT state: '''.format('|'.join(VM_STATES)) diff --git a/test/tarantool-debugger-tests/debug-extension-tests.py b/test/tarantool-debugger-tests/debug-extension-tests.py index bbd53dcc..9b6484ca 100644 --- a/test/tarantool-debugger-tests/debug-extension-tests.py +++ b/test/tarantool-debugger-tests/debug-extension-tests.py @@ -133,6 +133,23 @@ elif machine == 'arm64' or machine == 'aarch64': else: raise Exception('Unknown architecture in testing') +GCS_PAUSE = 'PAUSE' +GCS_PROPAGATE = 'PROPAGATE' +GCS_ATOMIC = 'ATOMIC' +GCS_SWEEPSTRING = 'SWEEPSTRING' +GCS_SWEEP = 'SWEEP' +GCS_FINALIZE = 'FINALIZE' + +RX_VALID_GC_STATES = r'({})'.format('|'.join([ + GCS_PAUSE, + GCS_PROPAGATE, + GCS_ATOMIC, + GCS_SWEEPSTRING, + GCS_SWEEP, + GCS_FINALIZE, +])) +RX_INVALID_GC_STATE = r'INVALID' + class TestCaseBase(unittest.TestCase): @classmethod @@ -283,23 +300,24 @@ RX_VM_STATE = '({})'.format('|'.join([ ])) -class TestLJState(TestCaseBase): - extension_cmds = 'lj-state' - location = 'lj_cf_print' - lua_script = 'print(1)' - pattern = ( +def compose_lj_state_rx(rx_gc_state): + return ( r'VM state: ' + RX_VM_STATE + '\n' - r'GC state: [A-Z]+\n' + r'GC state: ' + rx_gc_state + '\n' r'JIT state: [A-Z]+\n' ) -class TestLJGC(TestCaseBase): - extension_cmds = 'lj-gc' +class TestLJState(TestCaseBase): + extension_cmds = 'lj-state' location = 'lj_cf_print' lua_script = 'print(1)' - pattern = ( - r'GC stats: [A-Z]+\n' + pattern = compose_lj_state_rx(RX_VALID_GC_STATES) + + +def compose_gc_stats_rx(rx_gc_state): + return ( + r'GC stats: ' + rx_gc_state + '\n' r'\ttotal: \d+\n' r'\tthreshold: \d+\n' r'\tdebt: \d+\n' @@ -315,6 +333,81 @@ class TestLJGC(TestCaseBase): ) +class TestLJGC(TestCaseBase): + extension_cmds = 'lj-gc' + location = 'lj_cf_print' + lua_script = 'print(1)' + pattern = compose_gc_stats_rx(RX_VALID_GC_STATES) + + +class TestGCStateBase(TestCaseBase): + extension_cmds = ( + 'lj-state\n' + 'lj-gc\n' + ) + + # The same lua code is used to check all the GC states because + # it allows to reach any of them: + # 1) `gc_mark_start()` (PAUSE) is always present in the full + # GC cycle. + # 2) `propagatemark()` (PROPAGATE) is reachable because our + # build has FFI and the finalizer table is marked as a weak + # table, i.e. it is gray. Hence, the g->gc.gray list is not + # empty. + # 3) `atomic()` (ATOMIC) is always present in the full GC + # cycle. + # 4) `gc_sweep_str_chain()` (SWEEPSTRING) is always present in + # the full GC cycle. + # 5) `gc_sweep()` (SWEEP) is always present in the full GC + # cycle. + # 6) `gc_finalize()` (FINALIZE) is met due to the finalizer to + # userdata in the script. + lua_script = ( + 'local obj = newproxy(true)\n' + 'getmetatable(obj).__gc = function() end\n' + 'obj = nil\n' + 'collectgarbage()\n' + ) + + @classmethod + def setUpClass(cls): + cls.pattern = ( + compose_lj_state_rx(cls.gc_state) + + compose_gc_stats_rx(cls.gc_state) + ) + super(TestGCStateBase, cls).setUpClass() + + +class TestGCStatePause(TestGCStateBase): + gc_state = GCS_PAUSE + location = 'gc_mark_start' + + +class TestGCStatePropagate(TestGCStateBase): + gc_state = GCS_PROPAGATE + location = 'propagatemark' + + +class TestGCStateAtomic(TestGCStateBase): + gc_state = GCS_ATOMIC + location = 'atomic' + + +class TestGCStateSweepString(TestGCStateBase): + gc_state = GCS_SWEEPSTRING + location = 'gc_sweep_str_chain' + + +class TestGCStateSweep(TestGCStateBase): + gc_state = GCS_SWEEP + location = 'gc_sweep' + + +class TestGCStateFinalize(TestGCStateBase): + gc_state = GCS_FINALIZE + location = 'gc_finalize' + + STACK_RX = ( r'-+ Red zone:\s+\d+ slots -+\n' r'(' + RX_ADDR + r'\s+' + RX_FRAME + r' VALUE: nil\n?)*\n' -- 2.43.0