thttpdサーバが時間変更後にCPU占有率が高すぎるという問題
thttpdが使いやすいWEBサーバ
しかし、時間修正後、例えば1970年から2013年に変更すると、thttpdはCPUを非常に高く占有するという問題がある.
検索するとtimers.c中tmr_run関数の実装には、次のように修正した問題があります.
このうち,10*60は避けるためであり,著者らはプログラムが現在の時間を追いかけたときに何度も実行されることを確実に望んでいるかもしれない.
しかし、時間修正後、例えば1970年から2013年に変更すると、thttpdはCPUを非常に高く占有するという問題がある.
検索するとtimers.c中tmr_run関数の実装には、次のように修正した問題があります.
void
tmr_run( struct timeval* nowP )
{
int h;
Timer* t;
Timer* next;
for ( h = 0; h < HASH_SIZE; ++h )
for ( t = timers[h]; t != (Timer*) 0; t = next )
{
next = t->next;
/* Since the lists are sorted, as soon as we find a timer
** that isn't ready yet, we can go on to the next list.
*/
if ( t->time.tv_sec > nowP->tv_sec ||
( t->time.tv_sec == nowP->tv_sec &&
t->time.tv_usec > nowP->tv_usec ) )
break;
(t->timer_proc)( t->client_data, nowP );
if ( t->periodic )
{
/* Reschedule. */
t->time.tv_sec += t->msecs / 1000L;
t->time.tv_usec += ( t->msecs % 1000L ) * 1000L;
if ( t->time.tv_usec >= 1000000L )
{
t->time.tv_sec += t->time.tv_usec / 1000000L;
t->time.tv_usec %= 1000000L;
}
//
if (t->time.tv_sec + 10*60 < nowP->tv_sec)
t->time.tv_sec = nowP->tv_sec;
//
l_resort( t );
}
else
tmr_cancel( t );
}
}
このうち,10*60は避けるためであり,著者らはプログラムが現在の時間を追いかけたときに何度も実行されることを確実に望んでいるかもしれない.