예제 #1
0
void
timeout(const struct timespec *when, void (*func)(void *), void *arg)
{
    struct timespec now;
    struct timeval  tv;
    struct to_info  *tip;
    int             err;

    gettimeofday(&tv, NULL);
    now.tv_sec = tv.tv_sec;
    now.tv_nsec = tv.tv_usec * USECTONSEC;
    if ((when->tv_sec > now.tv_sec) ||
      (when->tv_sec == now.tv_sec && when->tv_nsec > now.tv_nsec)) {
        tip = malloc(sizeof(struct to_info));
        if (tip != NULL) {
            tip->to_fn = func;
            tip->to_arg = arg;
            tip->to_wait.tv_sec = when->tv_sec - now.tv_sec;
            if (when->tv_nsec >= now.tv_nsec ) {
                tip->to_wait.tv_nsec = when->tv_nsec - now.tv_sec;
            } else {
                tip->to_wait.tv_sec--;
                tip->to_wait.tv_nsec = SECTONSEC - now.tv_nsec +
                  when->tv_nsec;
           }
           err = makethread(timeout_helper, (void *)tip);
           if (err == 0)
               return;
    }
  }
  (*func)(arg);
}
예제 #2
0
파일: timeout.c 프로젝트: kingfree/haut
void timeout(const struct timespec *when, void (*func)(void *), void *arg)
{
    struct timespec now;
    struct to_info *tip;
    int err;

    clock_gettime(CLOCK_REALTIME, &now);
    if ((when->tv_sec > now.tv_sec) ||
        (when->tv_sec == now.tv_sec && when->tv_nsec > now.tv_nsec)) {
        tip = malloc(sizeof(struct to_info));
        if (tip != NULL) {
            tip->to_fn = func;
            tip->to_arg = arg;
            tip->to_wait.tv_sec = when->tv_sec - now.tv_sec;
            if (when->tv_nsec >= now.tv_nsec) {
                tip->to_wait.tv_nsec = when->tv_nsec - now.tv_nsec;
            } else {
                tip->to_wait.tv_sec--;
                tip->to_wait.tv_nsec = SECTONSEC - now.tv_nsec + when->tv_nsec;
            }
            err = makethread(timeout_helper, (void *)tip);
            if (err == 0)
                return;
            else
                free(tip);
        }
    }

    /*
         * We get here if (a) when <= now, or (b) malloc fails, or
         * (c) we can't make a thread, so we just call the function now.
         */
    (*func)(arg);
}
예제 #3
0
파일: 12_1.c 프로젝트: xiaobudongzhang/lib
int main(void){

  int errno;
  errno=makethread(thr_fn1,NULL);
  printf("errno=%d\n",errno);
  //sleep(20);
  exit(0);
}
void timeout(const struct timespec *when, void (*func)(void *), void *arg)
{
     struct timespec    now;
     to_info            *tip = NULL;
     int                err = 0;

     clock_gettime(CLOCK_REALTIME, &now);

     if ((when->tv_sec > now.tv_sec)
             || (when->tv_sec == now.tv_sec && when->tv_nsec > now.tv_nsec))
     {
          tip = (to_info *)malloc(sizeof(to_info));
          if (tip != NULL)
          {
              tip->to_fn = func;
              tip->to_arg = arg;
              tip->to_wait.tv_sec = when->tv_sec - now.tv_sec;
              if (when->tv_nsec >= now.tv_nsec)
              {
                   tip->to_wait.tv_nsec = when->tv_nsec - now.tv_nsec;
              }
              else
              {
                  tip->to_wait.tv_sec--;
                  tip->to_wait.tv_nsec = SECTONSEC - now.tv_nsec + when->tv_nsec;
              }

              err = makethread(timeout_helper, (void *)tip);
              if (err == 0)
              {
                   return ;
              }
              else
              {
                  free(tip);
              }
          }
     }

     //
     (*func)(arg);
}
예제 #5
0
파일: 12.3.c 프로젝트: cedarli/linux
int main(int argc,char *argv []){
    return makethread(thread_fn,NULL);
}