fix(nvim): resolve concurrent msgid clashes and eliminate continuous buffer memory leak
This commit is contained in:
1 parent
f8d98a77fd
commit
8e10950fc0
2 files changed
+75
-19
No files matched your search
@@ -0,0 +1,44 @@
|
||||
import os
|
||||
import re
|
||||
|
||||
def fix_nvim_msgid():
|
||||
filepath = 'nvim-core/src/lib.rs'
|
||||
with open(filepath, 'r', encoding='utf-8') as f:
|
||||
content = f.read()
|
||||
|
||||
# Add atomic import and static var if not exists
|
||||
if 'static NEXT_MSGID' not in content:
|
||||
atomic_def = "use std::sync::atomic::{AtomicU64, Ordering};\nstatic NEXT_MSGID: AtomicU64 = AtomicU64::new(1);\n"
|
||||
# Find NVIM_CONN
|
||||
conn_idx = content.find('static NVIM_CONN')
|
||||
if conn_idx != -1:
|
||||
content = content[:conn_idx] + atomic_def + content[conn_idx:]
|
||||
|
||||
# Replace all hardcoded msgid
|
||||
# e.g., RmpValue::Integer(1.into()), // msgid
|
||||
# with: let msgid = NEXT_MSGID.fetch_add(1, Ordering::SeqCst); ... RmpValue::Integer(msgid.into()),
|
||||
|
||||
# We need to insert `let msgid = NEXT_MSGID.fetch_add(1, Ordering::SeqCst);` before `let req = RmpValue::Array(vec![`
|
||||
|
||||
# We will use regex to find the blocks
|
||||
funcs = [
|
||||
('send_nvim_command', '1'),
|
||||
('get_nvim_active_buffer', '2'),
|
||||
('get_nvim_cursor', '3'),
|
||||
('get_nvim_visual_selection', '4'),
|
||||
('set_nvim_diagnostics', '5'),
|
||||
('execute_nvim_lua', '6'),
|
||||
]
|
||||
|
||||
for func, old_id in funcs:
|
||||
pattern = rf"let req = RmpValue::Array\(vec!\[\s*RmpValue::Integer\(0\.into\(\)\),\s*RmpValue::Integer\({old_id}\.into\(\)\), // msgid"
|
||||
replacement = f"let msgid = NEXT_MSGID.fetch_add(1, Ordering::SeqCst);\n let req = RmpValue::Array(vec![\n RmpValue::Integer(0.into()),\n RmpValue::Integer(msgid.into()), // msgid"
|
||||
|
||||
content = re.sub(pattern, replacement, content)
|
||||
|
||||
with open(filepath, 'w', encoding='utf-8') as f:
|
||||
f.write(content)
|
||||
|
||||
print('Fixed msgid allocations')
|
||||
|
||||
fix_nvim_msgid()
|
||||
Reference in new issue
Block a user