Hang with powerpc 2.6.21-rt3

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi everyone,

Attached is a small sample multithreaded test app.

When I run this with a 2.6.21-rt3 on powerpc (MPC5200), the handler
fires the first three times and then the shell hangs (no stack on the
serial console as well). I cannot telnet into the device anymore, but
however the kernel responds to ping requests.

I ran the same test on a x86 non-rt kernel 2.6.20 and that seems to
work ok. Is there something I am doing wrong in there ?

regards
/prady

-- 
htp://prady.livejournal.com
#include <sys/types.h>
#include <sys/signal.h>
#include <sys/errno.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <pthread.h>

void sig_handler(sigval_t sig );
void* threadFunc(void* p);

int main()
{
	struct itimerspec ts;
	struct sigevent evp; 
	
 	timer_t t_id;
	
	pthread_attr_t pt_attrib;
	struct sched_param sc_param;
	sc_param.sched_priority = 30; 
	pthread_attr_init( &pt_attrib ); 
	pthread_attr_setschedpolicy( &pt_attrib, SCHED_FIFO );
	pthread_attr_setschedparam( &pt_attrib, &sc_param );
	//pthread_attr_setdetachstate(&pt_attrib,PTHREAD_CREATE_DETACHED);
	pthread_attr_setinheritsched(&pt_attrib, PTHREAD_EXPLICIT_SCHED);

	memset(&evp, 0, sizeof(struct sigevent));
	evp.sigev_notify = SIGEV_THREAD;
	evp.sigev_notify_function = sig_handler;
	evp.sigev_notify_attributes = &pt_attrib;

	
	

	struct sched_param param;
	int policy;
/*
	param.sched_priority = 30;
	if( sched_setscheduler(0, SCHED_FIFO, &param) )
	{
		perror("sched_setscheduler");
	}
*/

	pthread_getschedparam ( pthread_self(), &policy, &param);
	printf("Hi, I'm main. My self is %d, and my pri is %d, policy=%d\n", (int)pthread_self(), param.sched_priority , policy);

	pthread_t tID;    
	
  if( timer_create( CLOCK_REALTIME, &evp, &t_id ) )
  {
  	perror("timer_create");
	}
	
	ts.it_interval.tv_sec = 1;
	ts.it_interval.tv_nsec = 0;

	ts.it_value.tv_sec = 1;
	ts.it_value.tv_nsec = 0;


	timer_settime( t_id, 0, &ts, NULL);
	
  pthread_create( &tID, NULL, threadFunc, NULL);

	for(;;) 
		pause();
}


void sig_handler(sigval_t signo)
{
	struct sched_param param;
	int policy;

	pthread_getschedparam ( pthread_self(), &policy, &param);
	printf("Hi, I'm sig_handler. My self is %d, and my pri is %d, policy=%d\n", (int)pthread_self(), param.sched_priority , policy);
}


void* threadFunc(void* p)
{
	struct sched_param param;
	
	printf("I'm %d\n",(int)pthread_self() );
	usleep(3*1000*1000);
	
	memset(&param, 0, sizeof(struct sched_param));
	param.sched_priority = 10;
	if( sched_setscheduler(0, SCHED_FIFO, &param) )
	{
		perror("sched_setscheduler");
	}

		
	for(;;)
	{
		//Waste cpu
	}
	return NULL;
}

[Index of Archives]     [RT Stable]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Video 4 Linux]     [Device Mapper]

  Powered by Linux