19.6.2. 다중 인스턴스 발행(Publisher) 구현
PX4 코어 아키텍트가 그려놓은 거대한 다중 인스턴스의 숲 속 생태계 토폴로지 설계도를 19.6.1 단원들에서 완벽하게 장악했다면, 이제 드디어 키보드를 잡고 실제 C++ 퍼블리셔 데몬 코드단에서 이 동적 분할 인스턴스 파이프라인의 삽을 푸는 하드코어 구현 작업에 들어갈 차례이다.
과거 19.3.3 단원의 단일 인스턴스 시절, 우리는 링커를 향해 단지 orb_advertise(ORB_ID(topic), &data)라는 1차원적인 함수를 무식하게 던지며 “나에게 (0번) 우체통을 개통해 줘“라고 막무가내로 들이밀었다. 하지만 이 잔혹한 다중 인스턴스의 전쟁터에서는 저 단순 무식한 함수는 절대 사용 불가능하다. 만약 당신이 듀얼 센서를 달고 저 함수를 2개의 스레드에서 똑같이 때린다면, 두 데몬 모두 미친 듯이 똑같은 0번 방에 들어가 서로의 물리적 힙 메모리 스냅샷을 아비규환으로 덮어 써버리는 최악의 쓰레기 레이스 컨디션 충돌(Race Condition Collision)을 경험하게 될 것이다.
1. 동적 할당의 십자가: 퍼블리셔의 겸손한 청원
다중 인스턴스의 세계에서 퍼블리셔 데몬은 절대로 자신이 0번 메인 센서 방을 먹을 것이라 오만하게 미리 상정해서는 안 된다. 커널을 향해 철저히 고개를 숙이고 **“내가 몇 번 방을 할당받을지는 전적으로 OS 커널 스케줄러님 마음대로 하시되, 제발 빈방 하나만 내어주고 그 방 번호(Instance ID)를 역으로 나에게 알려달라”**고 겸손하게 청원하는 동적 할당 포인터 아키텍처를 취해야만 한다.
이 동적 할당 청원의 모든 책임을 떠안고 있는 PX4 코어 미들웨어의 완전체 마스터 API가 바로 orb_advertise_multi() 함수이다.
이후 전개될 하위 단원들의 피의 전개는 다음과 같다.
- 19.6.2.1 단원: 링커에게 물리적 폴링을 때리며
orb_advertise_multi를 호출하고, 커널이 역으로 던져주는instance정수형 번호표를 포인터 훅업으로 낚아채어 내 데몬의 로컬 메모리 인스턴스 변수에 영구 각인시키는 절대적인 할당 타설법을 꿰뚫는다. - 19.6.2.2 단원: 픽스호크 마더보드가 무한정 메모리를 찍어낼 수는 없으므로, OS 시스템의 절대적 물리 한계값인
ORB_MULTI_MAX_INSTANCES(보통 4개로 락이 걸려 있다)의 벽체에 부딪혔을 때, “미안하지만 더 이상 남은 방이 없습니다“라는 끔찍한 메모리 초과 커널 패닉 에러(PX4_ERROR)를 어떻게 얌전하고 우아하게 시스템 Failsafe로 우회 예외 처리(Exception Handling) 할 것인지 극한의 방어 코딩을 구축한다.
이 두 개의 거친 여정을 통과하고 나면, 당신의 퍼블리셔 모듈 코드는 어떤 미친듯한 엉망진창의 멀티 센서 부팅 스케줄링 순서 속에서도 묵묵히 자신의 빈방 버퍼를 찾아내어 단 1비트의 데이터 오염 충돌 없이 텔레메트리를 쏟아내는 불멸의 다람쥐 데몬으로 재탄생하게 될 것이다.