⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ptask.c

📁 思科路由器仿真器,用来仿7200系列得,可以在电脑上模拟路由器
💻 C
字号:
/* * Cisco router simulation platform. * Copyright (c) 2005,2006 Christophe Fillot (cf@utc.fr) * * Periodic tasks centralization. Used for TX part of network devices. */#include <stdio.h>#include <stdlib.h>#include <string.h>#include <stdarg.h>#include <unistd.h>#include <errno.h>#include <signal.h>#include <fcntl.h>#include <ctype.h>#include <time.h>#include <sys/time.h>#include <sys/types.h>#include <pthread.h>#include <assert.h>#include "ptask.h"static pthread_t ptask_thread;static pthread_mutex_t ptask_mutex = PTHREAD_MUTEX_INITIALIZER;static ptask_t *ptask_list = NULL;static u_int ptask_sleep_time = 10;static ptask_id_t ptask_current_id = 0;#define PTASK_LOCK() pthread_mutex_lock(&ptask_mutex)#define PTASK_UNLOCK() pthread_mutex_unlock(&ptask_mutex)/* Periodic task thread */static void *ptask_run(void *arg){   pthread_mutex_t umutex = PTHREAD_MUTEX_INITIALIZER;   pthread_cond_t ucond = PTHREAD_COND_INITIALIZER;   ptask_t *task;   for(;;) {      PTASK_LOCK();      for(task=ptask_list;task;task=task->next)         task->cbk(task->object,task->arg);      PTASK_UNLOCK();      /* For testing! */      {         struct timespec t_spc;         m_tmcnt_t expire;         expire = m_gettime_usec() + 2000;         pthread_mutex_lock(&umutex);         t_spc.tv_sec = expire / 1000000;         t_spc.tv_nsec = (expire % 1000000) * 1000;         pthread_cond_timedwait(&ucond,&umutex,&t_spc);         pthread_mutex_unlock(&umutex);      }      /* Old method... */      //usleep(ptask_sleep_time*1000);   }   return NULL;}/* Add a new task */ptask_id_t ptask_add(ptask_callback cbk,void *object,void *arg){   ptask_t *task;   ptask_id_t id;   if (!(task = malloc(sizeof(*task)))) {      fprintf(stderr,"ptask_add: unable to add new task.\n");      return(-1);   }   memset(task,0,sizeof(*task));   task->cbk = cbk;   task->object = object;   task->arg = arg;   PTASK_LOCK();   id = ++ptask_current_id;   assert(id != 0);   task->id = id;   task->next = ptask_list;   ptask_list = task;   PTASK_UNLOCK();   return(id);}/* Remove a task */int ptask_remove(ptask_id_t id){      ptask_t **task,*p;   int res = -1;   PTASK_LOCK();   for(task=&ptask_list;*task;task=&(*task)->next)      if ((*task)->id == id) {         p = *task;         *task = (*task)->next;         free(p);         res = 0;         break;      }      PTASK_UNLOCK();   return(res);}/* Initialize ptask module */int ptask_init(u_int sleep_time){   if (sleep_time)      ptask_sleep_time = sleep_time;   if (pthread_create(&ptask_thread,NULL,ptask_run,NULL) != 0) {      fprintf(stderr,"ptask_init: unable to create thread.\n");      return(-1);   }   return(0);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -