title: how to run the function in parallel?
body: <pre><code>#define million 1000000L
  
  timer_t firstTimerID, secondTimerID, thirdTimerID;
  double Task2ms_Raster, Task10ms_Raster, Task100ms_Raster;
  
  struct sockaddr_in addr, client;
  int acceptSocket;
  char buf[256];
  long rc, sentbytes;
  int port = 18033;
  
  
  void TASK1(Task2ms_Raster)
  {
  
       struct timespec start, stop;
       uint32 startTime, stopTime;
  
          if( (startTime = clock_gettime( CLOCK_REALTIME, &amp;start)) == -1 ) {
            perror("clock gettime");
  
          }
  
          startTime =start.tv_sec + 0.0000001 * start.tv_nsec;
               //  printf("start time is %lf", StartTime);
  
  
         // return EXIT_SUCCESS;
  
      /* Trigger DAQ for the 2ms XCP raster. */
      if( XCPEVENT_DAQ_OVERLOAD &amp; Xcp_DoDaqForEvent_2msRstr( ))
      {
          ++numDaqOverload2ms;
      }
  
      /* Update those variables which are modified every 2ms. */
   counter32 += slope32;
  
      /* Trigger STIM for the 2ms XCP raster. */
    if( enableBypass2ms )
     {
          if( XCPEVENT_MISSING_DTO &amp; Xcp_DoStimForEvent_2msRstr( ) )
          {
       ++numMissingDto2ms;
          }
          }
    if( (stopTime = clock_gettime( CLOCK_REALTIME, &amp;stop)) == -1 ) {
            perror( "clock gettime" );
  
          }
    stopTime =  stop.tv_sec + 0.0000001 * stop.tv_nsec;
      //printf("stop time is %ld", stopTime);
  
              duration2ms = (uint32)(stopTime- startTime);
             // printf( "time difference is= %ld\n", duration2ms );
  
  
  
  }
  
  
  
  void TASK3(Task100ms_Raster)
  {
       struct timespec start, stop;
       uint32 startTime, stopTime;
  
  
  
              if( (startTime = clock_gettime( CLOCK_REALTIME, &amp;start)) == -1 )
              {
                perror("clock gettime");
  
              }
             startTime =start.tv_sec + 0.0000001 * start.tv_nsec;
            // printf("start time is %lf", startTime);
  
      /* Trigger DAQ for the 100ms XCP raster. */
      if( XCPEVENT_DAQ_OVERLOAD &amp; Xcp_DoDaqForEvent_100msRstr( ))
      {
          ++numDaqOverload100ms;
      }
  
      /* Update those variables which are modified every 100ms. */
      counter8 += slope8;
  
  
      /* Trigger STIM for the 100ms XCP raster. */
      if( enableBypass100ms )
      {
          if( XCPEVENT_MISSING_DTO &amp; Xcp_DoStimForEvent_100msRstr( ) )
          {
              ++numMissingDto100ms;
          }
      }
  
  
  
      if((stopTime = clock_gettime( CLOCK_REALTIME, &amp;stop)) == -1 ) {
                perror( "clock gettime" );
  
              }
  
      stopTime =  stop.tv_sec + 0.0000001 * stop.tv_nsec;
       // printf("stop time is %lf", stopTime);
  
      Xcp_CmdProcessor();
  
      duration100ms = ( stop.tv_sec - start.tv_sec )
                       + (double)( stop.tv_nsec - start.tv_nsec )
                         / (double)million;
            //  printf( "time difference is= %ld\n", duration100ms );
  }
  
  /*The handler checks that the value stored in sival_ptr matches a given timerID
  variable.  The sival_ptr is the same as the one we set in makeTimer(),
  though here it lives in a different structure.
  Obviously, it got copied from there to here on the way to this signal handler.
  The point is that the timerID is what is used to determine which timer just went off
  and determine what to do next */
  
  
  static void timerHandler( int sig, siginfo_t *si, void *uc )
  {
      timer_t *tidp;
  
      tidp = si-&gt;si_value.sival_ptr;
  
      if ( *tidp == firstTimerID )
  
          TASK1(Task2ms_Raster);
     else if ( *tidp == secondTimerID )
         TASK2(Task10ms_Raster);
      else if ( *tidp == thirdTimerID )
          TASK3(Task100ms_Raster);
  }
  
  /*
  The function takes a pointer to a timer_t variable that will be filled with the
  timer ID created by timer_create().  This pointer is also saved in the sival_ptr
  variable right before calling timer_create().  In this function notice that we
  always use the SIGRTMIN signal, so expiration of any timer causes this signal to
  be raised.  The signal handler I've written for that signal is timerHandler.
  */
  
   static int makeTimer( char *name, timer_t *timerID, int expireMS, int intervalMS )
  {
      struct sigevent         te;
      struct itimerspec       its;
      struct sigaction        sa;
      int                     sigNo = SIGRTMIN;
  
      /* Set up signal handler. */
      sa.sa_flags = SA_SIGINFO;
      sa.sa_sigaction = timerHandler;
      sigemptyset(&amp;sa.sa_mask);
      if (sigaction(sigNo, &amp;sa, NULL) == -1)
      {
          perror("sigaction");
      }
  
      /* Set and enable alarm */
      te.sigev_notify = SIGEV_SIGNAL;
      te.sigev_signo = sigNo;
      te.sigev_value.sival_ptr = timerID;
      timer_create(CLOCK_REALTIME, &amp;te, timerID);
  
      its.it_interval.tv_sec = 0;
      its.it_interval.tv_nsec = intervalMS * 1000000;
      its.it_value.tv_sec = 0;
      its.it_value.tv_nsec = expireMS * 1000000;
      timer_settime(*timerID, 0, &amp;its, NULL);
  
      return 1;
  }
  
  
  
  int CreateSocket()
  {
  
      socklen_t len = sizeof(client);
         // Socket creation for UDP
  
         acceptSocket=socket(AF_INET,SOCK_DGRAM,0);
  
         if(acceptSocket==-1)
  
         {
  
           printf("Failure: socket creation is failed, failure code\n");
  
           return 1;
  
         }
  
         else
  
         {
  
           printf("Socket started!\n");
  
         }
  
       memset(&amp;addr, 0, sizeof(addr));
  
       addr.sin_family=AF_INET;
  
       addr.sin_port=htons(port);
  
       addr.sin_addr.s_addr=htonl(INADDR_ANY);
  
       rc=bind(acceptSocket,(struct sockaddr*)&amp;addr,sizeof(addr));
  
       if(rc== -1)
  
       {
  
         printf("Failure: listen, failure code:\n");
  
         return 1;
  
       }
  
       else
  
       {
  
         printf("Socket an port %d \n",port);
  
       }
  
  
       if(acceptSocket == -1)
       {
           printf("Fehler: accept, fehler code:\n");
  
            return 1;
       }
       else
       {
  
       while(rc!=-1)
           {
  
  
           rc=recvfrom(acceptSocket,buf, 256, 0, (struct sockaddr*) &amp;client, &amp;len);
           if(rc==0)
           {
             printf("Server has no connection..\n");
             break;
           }
           if(rc==-1)
           {
               printf("something went wrong with data %s", strerror(errno));
             break;
           }
  
  
           XcpIp_RxCallback( (uint16) rc, (uint8*) buf, (uint16) port );
  
  
           //  create a timer
  
                  makeTimer("First Timer", &amp;firstTimerID, 2, 2);   //2ms
               makeTimer("Second Timer", &amp;secondTimerID, 10, 10);    //10ms
                  makeTimer("Third Timer", &amp;thirdTimerID, 100, 100);  //100ms
            }
  
  
       }
  
         close(acceptSocket);
  
  
  
         return 0;
  
       }
  
  
  
  int main()
  {
  
       Xcp_Initialize();
       CreateSocket();
       return 0;
  }
  
  
  
  
  void XcpApp_IpTransmit( uint16 XcpPort,  Xcp_StatePtr8 pBytes, uint16 numBytes )
  {
  
  
          if ((long)XcpPort==port){
                  sentbytes = sendto(acceptSocket,(char*)pBytes,(long)numBytes,0, (struct sockaddr*)&amp;client, sizeof(client));
          }
          XcpIp_TxCallback(port,(uint16)sentbytes);
      }
  </code></pre>
  
  <p>I am working on a client and server architecture. Server code is shown above and I created a socket to recieve the request from the client via the ip address and port number. Server is waiting for a request from the client and send a response back to the client. I also created timer to call te task for every 2ms, 10ms and 100ms. I have not created a seperated thread for the timer task. Just created a handler to handle (signal handler).  when the client sends a request to the server then I am recieving the data in the recvfrom api and later it is calling the maketimer (which is of 2ms) and after that it is not coming out of the 2ms task.</p>
  
  <p>Client is a tool (INCA) used to send data to the server. I am working on linux operating system.</p>
  
  <p>Could someone tell me what is wrong in the above program ??</p>