nptl and signals

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

 



--- Begin Message ---
Hi,
   I have problem regarding nptl in multi-threading environment.I am
creating three threads and each thread is calling a functions in which I
am setting the time for each thread using setitimer.On expiration of
that timer SIGALRM is called which calls a signal handler function in
which I am setting the flag and when control return to the main program
I am checking that flag if it is one then I am sending the packet and
again make that flag 0.I am using thread specific data and use set
specific and getspecific to read the threads data.
But the problem is that in signal handler instead of 3 there are 4
threads running(4th one suppose to be main thread) which disturbs the
timing of other threads.Which results in to the packet drooping.Also the
control is not returning to the main program So kindly help me out,I am
also attaching the copy of source code.

Thanks in Advance
Divij




#include<pthread.h>
#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netdb.h>
#include<string.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<sys/times.h>
#include<semaphore.h>
#include<sys/time.h>
#include<signal.h>
#define CNTR 3 

int sd,rc,i=0,sockfd,len,which=ITIMER_REAL,mark=0;
struct sockaddr_in cliaddr,remoteservaddr;
struct hostent *h;
time_t timeval;
struct itimerval value;
struct timespec ts;
struct timeval tz;
struct sigaction act;
FILE *fp;
char ch,buffer[1000];
volatile sig_atomic_t flag[CNTR]={0},k=0;
int n,j,z=0,t,track=0;

static pthread_key_t key;
pthread_t tid[CNTR];
pthread_attr_t attr;
pthread_mutex_t mylock;
long int thid[3];


void myflag(int sig) //This is a signal handler
{
    int s=0,ret;
    pthread_mutex_lock(&mylock);
    int k =(int)pthread_getspecific(key);
    printf("\nIn signal Value of K:%d and thread id is:%lu\n",k,pthread_self());   
    switch(k)
    {
      case 0: printf("I am the main thread\t \n");
              break;
      
      case 1:
              flag[k-1] = 1;
              break;
      case 2:
              flag[k-1] = 1;
              break;
     
      case 3:
              flag[k-1] = 1;
              break;
   
   }
   pthread_mutex_unlock(&mylock);
   return;
}

void *mytimer(void *argv) //Thread is using that function
{
   int interval,ret;
   pthread_mutex_lock(&mylock);
   interval = *(int *)argv;
   free(argv);
   switch(interval)
   {
     case 1:
             value.it_interval.tv_sec  = 1;
             value.it_interval.tv_usec = 0;
             value.it_value.tv_sec = 1;
             value.it_value.tv_usec = 0;
             setitimer(which,&value,NULL);
             ret=pthread_setspecific(key,(void *)1); //Thread specific data is generated
             if(ret!=0) {printf("Value cann't set\n"); exit(0); }
             break;
     
     case 2:
             value.it_interval.tv_sec = 2;
             value.it_interval.tv_usec =0;
             value.it_value.tv_sec = 1;
             value.it_value.tv_usec = 0;
             setitimer(which,&value,NULL);
	     ret=pthread_setspecific(key,(void *)2); //Thread specific data is generated
             if(ret!=0) {printf("Value cann't set\n"); exit(0); }
             break;
     
     case 3:
             value.it_interval.tv_sec = 3;
             value.it_interval.tv_usec = 0;
             value.it_value.tv_sec = 1;
             value.it_value.tv_usec = 0;
             setitimer(which,&value,NULL);
             ret=pthread_setspecific(key,(void *)3); //Thread specific data is generated
             if(ret!=0) { printf("Value cann't set\n"); exit(0); }
             break;    
            
     }
pthread_mutex_unlock(&mylock);
while(1);
}

int main()
{
  int ret,*q;
  pthread_attr_init(&attr);
  pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);

   sigset_t block_mask;
   sigemptyset(&block_mask);
   sigaddset(&block_mask,SIGALRM);
   
   signal(SIGALRM,myflag);

   char buf1[64]="11111111111111111111111111111111111111111";
   char buf2[64]="22222222222222222222222222222222222222222";
   char buf3[64]="33333333333333333333333333333333333333333";
   pthread_mutex_init(&mylock,NULL);
   //=========================================SOCKET CREATION======================================================
   sockfd= socket(AF_INET,SOCK_DGRAM,0);
   if(sockfd<0) { printf("Error in creating socket"); return;}

   remoteservaddr.sin_family = AF_INET;
   remoteservaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
   remoteservaddr.sin_port = htons(9734);
   len=sizeof(remoteservaddr);
  
   cliaddr.sin_family = AF_INET;
   cliaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
   cliaddr.sin_port = htons(9734);
  
   ret=pthread_key_create(&key,NULL);
   if(ret!=0)
   {        printf("cann't create the key"); exit(0); }
   else
            printf("Key is created\n");
//=======================================THREAD CREATION=========================================================
  for(i=0;i<CNTR;i++)
  {
   q=(int *)malloc(sizeof(int));
   *q=i+1;
   pthread_create(&tid[CNTR],&attr,&mytimer,(void *)q);
   sleep(1);
  }
  //printf("Exiting main thread");
  //pthread_exit(NULL);

//===============================================================================================================

//=======================================FILE TRANSFERING========================================================
printf("In main kvalue %d flag %d\n",k,flag[k-1]);

while(1) {
sigprocmask(SIG_BLOCK,&block_mask,NULL);
  	if(flag[k-1]==1)  {
     		flag[k-1]=0;
	      	rc=sendto(sockfd,buf1,strlen(buf1),0,(struct sockaddr *)&remoteservaddr,sizeof(remoteservaddr));
      		if ( rc < 0 ) {
			perror("send failed for buf1");
			return;
		}
 		printf("sent udp packet for child 1\n");
     	} 
sigprocmask(SIG_UNBLOCK,&block_mask,NULL);

sigprocmask(SIG_BLOCK,&block_mask,NULL);
	if(flag[k-2]==1)  {
     		flag[k-2]=0;
	      	rc=sendto(sockfd,buf2,strlen(buf2),0,(struct sockaddr *)&remoteservaddr,sizeof(remoteservaddr));
      		if ( rc < 0 ) {
			perror("send failed for buf2");
			return;
		}
		printf("sent udp packet for child 2\n");
     	} 
sigprocmask(SIG_UNBLOCK,&block_mask,NULL);
sigprocmask(SIG_BLOCK,&block_mask,NULL);
   	if(flag[k-3]==1)  {
     		flag[k-3]=0;
	      	rc=sendto(sockfd,buf3,strlen(buf3),0,(struct sockaddr *)&remoteservaddr,sizeof(remoteservaddr));
      		if ( rc < 0 ) {
			perror("send failed for buf3");
			return;
		}
		printf("sent udp packet for child 3\n");
      	} 
sigprocmask(SIG_UNBLOCK,&block_mask,NULL);
}
return;
}
//=================================================================================================================

--- End Message ---
-- 
fedora-devel-list mailing list
fedora-devel-list@xxxxxxxxxx
http://www.redhat.com/mailman/listinfo/fedora-devel-list

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Fedora Announce]     [Fedora Kernel]     [Fedora Testing]     [Fedora Formulas]     [Fedora PHP Devel]     [Kernel Development]     [Fedora Legacy]     [Fedora Maintainers]     [Fedora Desktop]     [PAM]     [Red Hat Development]     [Gimp]     [Yosemite News]
  Powered by Linux