앱상주서버.한선 P0-1 — 스크롤백 꼬리파싱 수정
개요
벡터 직결 10ms 파이프라인(계약: 벡터직결-계약.md 부록2 P0-1)의 확정 결함 수정.
src/앱상주서버.한선이 벡터| 이벤트마다 /tmp/터미널상태.psv 전체 스크롤백을
읽기()+줄분리()로 재파싱해, 대용량(3000줄급) 상태에서 문자열 핸들이
빠르게 소진되고 인스턴스가 무진단 소멸하는 문제(2026-07-12 적대검증 실측:
2000요청에서 문자열 핸들 90% 경고 + 소멸).
무엇을 했는지
_출력줄들()—파일바이트크기(297)+버퍼파일읽기(874)로 바이너리 버퍼
버퍼바이트읽기(851)로 개행(0x0A)만 세어
렌더 캡(_표시줄수=26)+여유(4)=30줄 분량의 파일 꼬리 구간만
버퍼잘라(395)로 잘라 그 구간만 문자열화·파싱. 전체 스크롤백 크기와
무관하게 함수 비용이 "꼬리 ~30줄" 고정 크기가 된다.
- (추가 발견)
_psv값(_터미널상태경로,"경로")호출 2곳(_렌더cmd,
_v터미널렌더)도 같은 파일을 전체 재파싱하고 있어 1번 수정만으로는
스트레스 재현 시 문자열 핸들 90% 경고가 여전히 발생 — 전용 헤드리더
_터미널경로헤드()를 추가(첫 개행까지만 전진 스캔)해 두 호출부를 교체.
- P0-1 부수 요구사항: 전역 요청 카운터(
_요청카운터) 추가, 1000요청마다
출력값()(stdout — 한선씨 VM에 stderr 전용 빌트인 없음, 기존 시작/종료
배너와 동일 채널) 진단 1줄로 "무진단 소멸" 방지.검증 (실측)
- 컴파일:
CROWNY_STRICT=1 ./hanseonc_high→ exit0,[STRICT]경고 0건. - 격리 인스턴스(포트 19860,
CROWNY_TERMSRV_PORT)에서/tmp/터미널상태.psv를
[STR] 조기경고: 문자열 핸들 432000/480000(90%) 1회 발생 —str_count>=STR_ID_MAX(480000)에 도달할 때만 자동 GC를
트리거하는 구조(90% 경고 자체는 GC 미실행 정보성 로그, crownyc.c
str_new() 참조)라, 계산기+터미널 렌더 파이프라인 전반(_v버튼/
_v글자 등 공용 프리미티브, 8앱 서비스가 공유)의 문자열 연결 비용이
남아있는 한 대량 트래픽에서 1회성으로는 계속 발생할 수 있다.
"0경고"까지 없애려면 _출력줄들() 범위를 넘어 렌더 프리미티브 전반의
문자열 핸들 절감(예: 사전 포맷 캐시)이 필요 — P0-1 소유 범위 밖이라
8앱 이식(전역 _v* 재사용) 담당에게 인계 권고.
- 레거시 3verb 회귀 스모크:
렌더/렌더|960|640/키|FOCUS|.../키|KEY|x/
벡터|계산기|렌더/벡터|터미널|렌더/종료 전부 정상 응답, 종료 verb로
정상 종료(앱상주서버 종료 — 누적요청=2507, 종료요청 카운터가 스트레스
2500+스모크6+종료1=2507과 정확히 일치).
- 상태파일 원복: `/tmp/{터미널상태,입력상태,계산기상태,터미널선택,입력모드,
- 실행 중이던 무관 프로세스(pid 93820,
/tmp/앱상주서버.toau실행 중,
관련 파일
/Users/ef/CrownyBrowser/src/앱상주서버.한선(단독 소유, 수정)/private/tmp/claude-501/-Users-ef/2e95e8b6-e663-4b81-9734-9ded4339b18d/scratchpad/벡터직결-계약.md(SSOT 계약)- 검증 스크립트(스크래치, 비영속):
p01_stress.py,p01_legacy_smoke.py
잔여 이슈
[STR] 조기경고: 90% 도달로그 자체를 완전히 0으로 만들려면 렌더
_v버튼/_v글자/_v사각형 등, 계산기·터미널·향후 8앱이
공유) 전반의 문자열 연결 비용 절감이 필요 — 이번 P0-1 스코프(스크롤백
파싱) 밖. 다만 크래시/성능열화는 실측상 없음(0 errors, 1.00x drift).
/tmp/앱상주서버.toau는 이번 수정 반영 전 버전 그대로(ObjC 측
appSrvEnsureToauFresh stale-toau 가드가 소스 mtime 갱신을 감지해
다음 기동 시 자동 재컴파일 — 계약대로 ObjC 담당(P0-2) 영역, 이 세션에서
직접 배치하지 않음).