GetTickCount와 우선순위 큐의 버그 가능성 질문

60 views
Skip to first unread message

Im.fehead

unread,
Jan 5, 2011, 10:06:24 PM1/5/11
to HalfNetwork
제가 알기로는 ACE_Message_Queue의 우선순위 큐를 사용하는걸로 아는데
이곳에 GetTickCount의 값을 사용하는걸로 알고 있습니다.

그런데 GetTickCount값은 47.7일에 한번씩 리셋되는걸로 아는데요.

만약 저 리셋될때 우선순위 큐에 이전 값이 들어 있으면 우선순위큐에 들어있는 값이 나오지못하는
잠제적인 버그가 있지 않을까 생각됩니다.


예를 들면 GetTickCount 값이 0xFFFFFFFF 이라고 가정하고

Message block하나를 이때 집어 넣는다면 아래와 같을것이고

_PushQueue( block, 0xFFFFFFFF);


ServiceImpl::PopQueue 가 호출될 시점에 GetTickCount는 0x0 값으로 바뀌었다고 가정하면

ServiceImpl::PopQueue 에서는 아래 코드에 의해서

if (block->msg_priority() > current_tick)
{
_block_queue->enqueue_prio(block, &noWait);
break;
}

다시 집어넣고 나올 가능성이 있다고 봅니다.

Im.fehead

unread,
Jan 6, 2011, 12:22:39 AM1/6/11
to HalfNetwork
생각해보니... dequeue_prio() 에서 먼저 나와야할것이 나중으로 미루어 지거나 아예 못나올 수 도 있겠군요.

YoungGi Lim

unread,
Jan 6, 2011, 4:23:59 AM1/6/11
to halfn...@googlegroups.com
그런 경우라면 처음에 말씀하신대로 빼왔다가 다시 넣고를 반복할겁니다.

(block->msg_priority() - current_tick) 에서 값의 차이가 너무 크면

tick의 리셋이 의심되는 상황이므로 그냥 전송하는 식으로 처리하면 될 것 같네요.


2011/1/6 Im.fehead <im.f...@gmail.com>

Javawork

unread,
Jan 10, 2011, 10:09:27 PM1/10/11
to halfn...@googlegroups.com

아래와 같이 처리했습니다.

const int MaxDifferenceTick = 1000*60*60*24; // a day
...
int difference = current_tick - block->msg_priority();
if (difference < 0 && difference > MaxDifferenceTick*-1 )
{
    _block_queue->enqueue_prio(block, &noWait);
    break;
}
...
코드는 테스트 좀더 해보고 체크인 하겠습니다.

Im.fehead

unread,
Jan 13, 2011, 2:10:06 AM1/13/11
to HalfNetwork
http://www.redwiki.net/wiki/wiki.php/ACE/%C6%A9%C5%E4%B8%AE%BE%F3/%B8%DE%BC%BC%C1%F6%C5%A5#s-1.5

여기를 보시면 Message_Block에 msg_execution_time, msg_deadline_time 을 사용하는것이 있
던데 이것은 어떤가요?

컴파일해서 실행해봤지만 작동되지는 않더군요.
ACE_HAS_TIMED_MESSAGE_BLOCKS 디파인을 넣어서 재 컴파일을 해야하면될듯 보입니다.

YoungGi Lim

unread,
Jan 13, 2011, 4:21:09 AM1/13/11
to halfn...@googlegroups.com
디파인을 해야 작동하는 거라면 좀 꺼려지네요.

변경된 코드는 체크인 했습니다.

2011/1/13 Im.fehead <im.f...@gmail.com>
Reply all
Reply to author
Forward
0 new messages