From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Organization: ISP Farlep (Odessa) Subject: Re: [sisyphus] =?koi8-r?Q?=F2=C1=C2=CF=D4=C1?= =?koi8-r?Q?_=D0=CF=C4?= =?koi8-r?Q?_2=2E6=2E=C8?= =?koi8-r?Q?_=D3?= =?koi8-r?Q?_=D0=D2=C9=D7=D1=DA=CB=CF=CA?= =?koi8-r?Q?_=CB=CF?= =?koi8-r?Q?_=D7=D2=C5=CD=C5=CE=CE=D9=CD?= =?koi8-r?Q?_=CF=D4=CD=C5=D4=CB=C1=CD=2E?= From: Serge Pavlovsky To: ALT Linux Sisyphus discussion list In-Reply-To: <200410081748.07275.serpiph@nikiet.ru> References: <200410081748.07275.serpiph@nikiet.ru> Content-Type: text/plain; charset=KOI8-R Date: Mon, 11 Oct 2004 03:27:16 +0300 Message-Id: <1097454436.2793.0.camel@underdark.interexc.com> Mime-Version: 1.0 X-Mailer: Evolution 1.5.92.1 (1.5.92.1-alt0.5) Content-Transfer-Encoding: 8bit X-Virus-Scan: smtp-vilter X-SMTP-Vilter-Version: 1.1.4 X-SMTP-Vilter-Backend: vilter-clamd X-SMTP-Vilter-Status: clean X-BeenThere: sisyphus@altlinux.ru X-Mailman-Version: 2.1.5 Precedence: list Reply-To: ALT Linux Sisyphus discussion list List-Id: ALT Linux Sisyphus discussion list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 11 Oct 2004 00:27:27 -0000 Archived-At: List-Archive: It is not safe to call mutex functions from a signal handler. In particular, calling `pthread_mutex_lock' or `pthread_mutex_unlock' from a signal handler may deadlock the calling thread. On Птн, 2004-10-08 at 17:48 +0400, Epiphanov Sergei wrote: > Есть программа, которую решил привязать к таймеру для работы в реальном > времени. Принцип простой: поставил обработку setitimer на запуск SIG_ALARM > с шагом 10 мсек. > > #define _XOPEN_SOURCE 600 > #define _GNU_SOURCE > #include > #include > #include > #include > > > > volatile int nextnum=0; > volatile pthread_mutex_t fastmutex; > > void alarmsig(int i){ > pthread_mutex_lock( &fastmutex ); > nextnum++; > pthread_mutex_unlock( &fastmutex ); > } > > static struct sigaction oldsig; > > /*type<0.5 - drop timer > type>0.5 - set timer*/ > void settimer_(float *type, float *step){ > long int sec = *step; > long int usec = (*step-sec)*1e6; > struct itimerval tv,old; > struct sigaction newsig,temp; > pthread_mutexattr_t attr; > printf("sec=%ld usec=%ld\n",sec,usec); > if( *type>0.5 ){ > pthread_mutexattr_init( &attr ); > pthread_mutexattr_settype( &attr, PTHREAD_MUTEX_FAST_NP ); > pthread_mutex_init( &fastmutex, &attr ); > pthread_mutexattr_destroy( &attr ); > tv.it_interval.tv_sec = sec; > tv.it_interval.tv_usec = usec; > tv.it_value.tv_sec = sec; > tv.it_value.tv_usec = usec; > nextnum = 0; > newsig.sa_handler = alarmsig; > newsig.sa_flags = SA_NOMASK; > sigaction( SIGALRM, &newsig, &oldsig ); > setitimer( ITIMER_REAL, &tv, &old ); > } else{ > tv.it_interval.tv_sec = 0; > tv.it_interval.tv_usec = 0; > tv.it_value.tv_sec = 0; > tv.it_value.tv_usec = 0; > setitimer( ITIMER_REAL, &tv, &old ); > nextnum = 0; > sigaction( SIGALRM, &oldsig, &temp ); > pthread_mutex_destroy( &fastmutex ); > } > > } > > void waittime_( float *err ){ > int cur = nextnum; > if( cur>1 ){ > *err = cur; > return; > } > while( !cur ){ > pthread_mutex_lock( &fastmutex ); > cur = nextnum; > pthread_mutex_unlock( &fastmutex ); > } > *err = 0; > pthread_mutex_lock( &fastmutex ); > nextnum = 0; > pthread_mutex_unlock( &fastmutex ); > return; > } > > Затем: > 1)t=0 > 2)в цикле: > а) основная программа > б) t=t+10мсек > в) waittime_(err) > г) завершение цикла при t>=100сек. > > Так вот, при таком раскладе на ядре 2.6.8-std-smp-alt9 программа работает > 110сек (+10%). И этот расклад не зависит от шага (10мсек, 100мсек, 1сек). > На ядре 2.4.26-std-up-alt6 эта же программа без пересборки работает точно > 100 сек. Что это может быть? > > _______________________________________________ > Sisyphus mailing list > Sisyphus@altlinux.ru > https://lists.altlinux.ru/mailman/listinfo/sisyphus > Scanned by evaluation version of Dr.Web antivirus Daemon > http://drweb.ru/unix/