yuchi's Development Home


프로그래밍의 도를 향해#2

조회 수 4387 추천 수 129 2002.04.22 21:43:01
여치 *.207.70.141
2000년 가을쯤이다.11월 초였던거 같다.그 당시 나는 현재 INetwork.dll이라고 부르는 서버 컴포넌트를 만들고 있었다.현재 GS팀의 전신이 된 서버팀이 창설된지 몇달 안된 시점이었다.

그 전까지 묵향팀의 서버 프로그래머로서 nAge팀과,CBZ게임 팀에 네트웍 모듈을 짜서 제공했었다.서버뿐만 아니라 클라이언트쪽 네트웍 모듈도 제공해줬었는데 지금처럼 COM형태는 아니었다.
당시 cbz팀에선 내가 준 서버,클라이언트 소스를 사용하고 있었는데 어느날 cbz겜팀의 kbs군이 찾아왔다.뭔가 이상하다는 것이었다.

뭔가..이상했다.TCP는 결코 메시지 순서가 뒤바뀌지 않는데 이것은 마지 뒤바뀌는것 같았다.중간에 메시지가 유실되는거 같기도 했다.

'이럴수가...난 분명히 충분한 테스트를 했는데..큐 처리에서 실수한게 아닐까...'

클라이언트측 네트웍 소스는 메시지 기반의 AsyncSelect방식이었다.
대략 이 코드는 이런 식의 메카니즘이었다.

1.메시지가 날라오면 큐에 넣는다.메시지가 붙어올수도 있으므로 한번에 복수개의 메시지가 큐에 찰수도 있다.
2.큐를 한번 훑어서 처리할 수 있는만큼 메시지를 모두 처리한후 처리한 메시지는 일괄적으로 큐에서 제거한다.

아무리 소스를 뜯어봐도 소스엔 이상이 없었다.계속 테스트해보다가 이상한 점을 발견했다.첫번째 메시지를 받고 메시지 박스(MessageBox())를 띄운 후 두번째 메시지를 받으면 다시 메지시 프로시져로 진입하는것이었다.
이렇게 얘기하면 이해가 안갈것이다.

일단 메시지 박스가 뜨고나면...엔터를 치든 어쩌든 해서 메시지 박스를 없애지 않으면 MessageBox()아래 라인으론 수행할수 없다.즉 그 상태로 스레드가 블럭킹되어있어야하는데 다음번 메시지가 날라왔을때 현재 그 코드까지 또 실행이 되는것이었다.
황당해서 크리티컬 섹션으로 잠궈봤다.먼저 진입한 스레드가 leave하기 전에 어떤 스레드가 다시 진입하는걸 확인했다.놀랍게도...같은 스레드가 또 진입했다.리커젼 카운트가 2로 올라가 있었다.즉 재진입이었다.

이 문제는...일단은 어셈블리로 스핀락 비슷한걸 만들어서 일단 땜빵해결을 지었다.
해결이 중요한지 원인 분석이 중요한지 아직도 헷갈리긴 하지만 이 문제에 대한 원인은 다음과 같다.
1.WndProc()는 콜백함수이다.

2.정확히는 GetMessage()등으로 메시지 큐로부터 메시지를 디스패치 하면 호출된다.

3.MessageBox()는 내부적으로 메시지큐에 메시지가 들어오기를 대기한다.

4.따라서 MessageBox()를 호출하고 스레드가 블럭킹 되어있다고 느끼는 순간에도 해당 스레드는 메시지가 디스패치 되기를 기다리고 있으며 Async소켓 메시지가 날라왔을때 WndProc()로 재진입한다.

3,4번이 문제의 핵심이었다.

이 문제를 해결하려면 메시지박스등을 사용하지 말거나 소켓 메시지가 발생했을때 먼저 처리되고 있는 메시지가 있다면 큐를 잠가버려야했다.나중에 2차버젼으로 만든 클라이언트측 네트웍 모듈은 Overlapped방식의 멀티 스레드 모델로 메시지 처리를 완료할때까지는 패킷을 디스패치할 수 없게 만들었다.

이 황당한 버그로...나름대로 윈도우즈의 메시지 체계에 대해서 중요한점을 알수 있었다.여담이지만 그때 새벽 3시 가까이 되어서 퇴근을 했는데 kbs군의 마티즈 승용차를 타고 집 근처에서 내렸다.마티즈 앞좌석이 꽤 넓다고 느낀것이 기억에 남는다.
kbs군은 훈련소 입소를 몇일 앞두고 있었으므로 그 버그를 해결(미봉책으로)한 것이 꽤 의미깊었으리라...




* 여치님에 의해서 게시물 이동되었습니다 (2004-01-09 01:20)
List of Articles
번호 제목 글쓴이 날짜 조회 수sort
61 dx11 스키닝 file 여치 2011-01-20 3486
60 코딩 및 테스트 계획 여치 2011-11-08 3466
59 엔진 64비트 포팅 프로젝트 진척상황 여치 2007-05-01 3453
58 dx11 라이트맵 처리 file 여치 2011-01-28 3450
57 추석 연휴 작업 내용 file [5] 여치 2008-09-15 3443
56 fxc 여치 2005-09-07 3434
55 LiPSM을 사용한 그림자 개선(진행중) file [2] 여치 2009-03-14 3426
54 64비트로 gogo file 여치 2007-03-27 3424
53 Windows Store App에서 D3DCompile계열함수 사용 여치 2012-12-23 3393
52 프레임 자랑질. file [2] 여치 2010-04-03 3391
51 CUDA 충돌처리 현재까지 진행상황 file 여치 2012-02-04 3391
50 CUDA 첫 프로그램. 시작은 미약하지만.. file [2] 여치 2010-04-12 3385
49 주말동안 작업 내용-라이트맵 관련 file [3] 여치 2008-02-04 3364
48 Depth of Field 구현중 file 여치 2010-11-24 3364
47 계속 개선중인 라이트맵 file 여치 2007-07-24 3350
46 라이트맵 엣지 블랜딩 관련 file 여치 2011-11-28 3345
45 64비트 릴리즈 모드 테스트 여치 2007-07-19 3296
44 6core Xeon*2 + GTS250 CDUA 라이트맵 렌더링 file 여치 2010-06-15 3287
43 주말동안 작업내용 [1] 여치 2008-01-28 3280
42 CUDA로 구현한 충돌처리 [5] 여치 2012-01-16 3271
天安門大屠殺 六四天安門事件 反右派鬥爭 大躍進政策 文化大革命 六四天安門事件 The Tiananmen Square protests of 1989 天安門大屠殺 The Tiananmen Square Massacre 反右派鬥爭 The Anti-Rightist Struggle 大躍進政策 The Great Leap Forward 文化大革命 The Great Proletarian Cultural Revolution 人權 Human Rights 民運 Democratization 自由 Freedom 獨立 Independence 多黨制 Multi-party system 民主 言論 思想 反共 反革命 抗議 運動 騷亂 暴亂 騷擾 擾亂 抗暴 平反 維權 示威游行 法輪功 Falun Dafa 李洪志 法輪大法 大法弟子 強制斷種 強制堕胎 民族淨化 人體實驗 胡耀邦 趙紫陽 魏京生 王丹 還政於民 和平演變 激流中國 北京之春 大紀元時報 九評論共産黨 獨裁 專制 壓制 統一 監視 鎮壓 迫害 侵略 掠奪 破壞 拷問 屠殺 肅清 活摘器官 障テ社會 誘拐 買賣人口 遊進 走私 毒品 賣淫 春畫 賭博 六合彩 台灣 臺灣 Taiwan Formosa 中華民國 Republic of China 西藏 土伯特 唐古特 Tibet 達償ワ喇嘛 Dalai Lama 新疆維吾爾自治區 The Xinjiang Uyghur Autonomous Region free tibet



XE Login

天安門大屠殺 六四天安門事件 反右派鬥爭 大躍進政策 文化大革命 六四天安門事件 The Tiananmen Square protests of 1989 天安門大屠殺 The Tiananmen Square Massacre 反右派鬥爭 The Anti-Rightist Struggle 大躍進政策 The Great Leap Forward 文化大革命 The Great Proletarian Cultural Revolution 人權 Human Rights 民運 Democratization 自由 Freedom 獨立 Independence 多黨制 Multi-party system 民主 言論 思想 反共 反革命 抗議 運動 騷亂 暴亂 騷擾 擾亂 抗暴 平反 維權 示威游行 法輪功 Falun Dafa 李洪志 法輪大法 大法弟子 強制斷種 強制堕胎 民族淨化 人體實驗 胡耀邦 趙紫陽 魏京生 王丹 還政於民 和平演變 激流中國 北京之春 大紀元時報 九評論共産黨 獨裁 專制 壓制 統一 監視 鎮壓 迫害 侵略 掠奪 破壞 拷問 屠殺 肅清 活摘器官 障テ社會 誘拐 買賣人口 遊進 走私 毒品 賣淫 春畫 賭博 六合彩 台灣 臺灣 Taiwan Formosa 中華民國 Republic of China 西藏 土伯特 唐古特 Tibet 達償ワ喇嘛 Dalai Lama 新疆維吾爾自治區 The Xinjiang Uyghur Autonomous Region free tibet