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

📄 snrkpsos.c

📁 wm PNE 3.3 source code, running at more than vxworks6.x version.
💻 C
📖 第 1 页 / 共 2 页
字号:
  int instance = 0;#if SC_PNET || SC_PNA  netconfig_find_one(NF_DOWN | NF_DRIVER_DOWN | NF_ARP, 6, 10000000L,		     (long (*)(unsigned long, void *)) MuxLan,		     BSP_LAN1_FLAGS, ++instance);#else  netconfig_find_one(NF_DOWN | NF_DRIVER_DOWN | NF_ARP, 6, 10000000L,		     BSP_LAN1_ENTRY, BSP_LAN1_FLAGS, ++instance);#endif#if INSTALL_SNARK_PSOS_BSP_LAN2  netconfig_find_one(NF_DOWN | NF_DRIVER_DOWN | NF_ARP, 6, 10000000L,		     BSP_LAN2_ENTRY, BSP_LAN2_FLAGS, ++instance);#endif#if INSTALL_SNARK_PSOS_SLIP  /*   * This must happen before the NI_INIT call to NiSlip.   * May as well do it here.   */  NiSlipSetup(9600L);  netconfig_find_one(NF_DOWN | NF_DRIVER_DOWN, 6, 9600L, NiSlip,		     IFF_NOARP|IFF_POINTTOPOINT|IFF_RAWMEM|IFF_POLL,		     ++instance);#endif /* INSTALL_SNARK_PSOS_SLIP */}#endif /* INSTALL_ATTACHE *//* Initialization and shutdown. */void snark_init(){  sty_init();#if INSTALL_SNARK_BUG_CONF  bug_config();#endif  tasks_init();#if INSTALL_ATTACHE  ATTACHE_LOCK();  attache_init();   ATTACHE_UNLOCK();#endif#if INSTALL_ENVOY  envoy_init();#endif#if INSTALL_ATTACHE  netconfig (); #endif}void snark_shutdown(){#if INSTALL_ATTACHE && INSTALL_ATTACHE_SHUTDOWN  attache_shutdown();#endif#if INSTALL_ATTACHE_THREADS  ATTACHE_UNLOCK();  task_kick();  ETC_THD_YIELD();#endif}#if INSTALL_ATTACHE_SOCKETSstatic void (*deferred_io_handler)(void);static void (*deferred_io_first)(void);void glue_set_deferred_io_handler (void (*first)(void), void (*handler)(void)){  deferred_io_first = first;  deferred_io_handler = handler;}#endif#if INSTALL_ATTACHE_THREADSstatic ULONG TKRDTid;etc_cond_t task_cond;#define CLIENT_USRSTACK   16384      /* User stack size of  client task */#define CLIENT_SYSSTACK   4096      /* Supervisor stack size */#define CLIENT_FLAGS      0x00      /* Flags for client task */#define CLIENT_INITMODE   T_SUPV    /* Initial mode of the client task */void tasks_run_guts(void){  struct task *task;  ATTACHE_LOCK();  while (!snark_exit_flag) {    while ((task = task_deq()) != 0 && task->func != 0)       {	task->func(task, task->cookie);	if (snark_exit_flag)	  break;	        }    if (snark_exit_flag)      break;    ETC_COND_WAIT(&task_cond, &attache_lock);  }  ATTACHE_UNLOCK();  t_suspend(0);}void task_kick(void){  /* this gets called from task_enq from task_add, before tasks_run,   * where the condition variable is actually initialized   */  if (TKRDTid != 0)    ETC_COND_BROADCAST(&task_cond, &attache_lock);}#endif /* INSTALL_ATTACHE_THREADS *//* * tasks_run() function, using system-independent tasking queue. *//* * This is the main body of the task dispatcher. * If it ever returns, main() should exit immediately with the same value. */extern int snark_exit_flag;extern int snark_exit_value;int tasks_run(){#if !INSTALL_ATTACHE_THREADS  struct task *task;#endif  unsigned long rc, events, msg[4], PacketQueue;  ATTACHE_LOCK();  /*   * Find out where to get Attache packets from.   */  PacketQueue = GetAttacheQueueId ();  /*   * Register my task ID so I get ATTACHE_PSOS_QEVENT notifications from the    * NIDD task.    */  RegisterAttacheReceiver (0L, ATTACHE_NIDRV_SEND_PKTEVENTS);#if INSTALL_ATTACHE_THREADS  {    ULONG parms[4];    if ((rc = ETC_COND_INIT(&task_cond, &attache_lock)) != 0) {      printf("tasks_run: ETC_COND_INIT failed!\n");      return rc;    }    /* !!! priority?? */    rc = t_create("TKRD", 190, CLIENT_SYSSTACK, CLIENT_USRSTACK,		  CLIENT_FLAGS, &TKRDTid);    if (rc != 0)      {	BUG(BUG_ATTACHE_PSOS_NIDRV_INFO, BUG_CONTINUABLE, (void *) 0, 	    (BUG_OUT, "Task creation error %lx (TKRD)\n", rc));	return rc;      }    rc = t_start(TKRDTid, CLIENT_INITMODE, tasks_run_guts, parms);       if (rc != 0)      {	BUG(BUG_ATTACHE_PSOS_NIDRV_INFO, BUG_CONTINUABLE, (void *) 0, 	    (BUG_OUT, "Task start error %lx (TKRD)\n", rc));	return rc;      }  }#endif /* INSTALL_ATTACHE_THREADS */  /*   * Wait on events. The daemon task waits "forever" processing various   * events (packet receive, timer, and keystroke).   */  while (!snark_exit_flag) {    /*     * First look for a received packet, callback, or keystroke.     */    while ((rc = q_receive(PacketQueue, Q_NOWAIT, 0, msg)) == 0) {      switch (GET_ATTACHE_PSOS_MSG_OPCODE(msg)) {      case ATTACHE_PSOS_MSG_CALLBACK:	/*	 * This is an Attache callback function; call it	 */	{	  void (*callback)(void) = GET_ATTACHE_PSOS_MSG_CBFUNC(msg);	  BUG_ASSERT(callback != NULL);	  (*callback)();	  continue;	}      case ATTACHE_PSOS_MSG_PKTFUNC:	/*	 * This is a packet for Attache	 */	{	  packet *p = GET_ATTACHE_PSOS_MSG_PKTBUF(msg);	  void (*receiver)(packet *) = GET_ATTACHE_PSOS_MSG_PKTRCV(msg);	  BUG_ASSERT(receiver != NULL);	  	  (*receiver)(p);	  continue;	}      case ATTACHE_PSOS_MSG_KBDCHAR:	/*	 * This is a snark keyboard event.	 */	if (kbd_handler) {	  unsigned char ch = GET_ATTACHE_PSOS_MSG_CHAR(msg);	  (*kbd_handler) (&ch, 1);	  continue;	}      }      printf("ATTD: unexpected queue message\n");    }    if (rc != ERR_NOMSG) {      printf("ATTD: q_receive failed\n");	        break;    }#if !INSTALL_ATTACHE_THREADS    /*     * Next, look for a snark "task" to run.     */    if ((task = task_deq()) != 0 && task->func != 0) {      task->func(task, task->cookie);      continue;    }	#endif    ATTACHE_UNLOCK();#if INSTALL_ATTACHE_SOCKETS    if (deferred_io_handler) {      if (deferred_io_first) {	(*deferred_io_first)();	deferred_io_first = NULL;      }      (*deferred_io_handler)();    }#endif    /*     * When we get here, we've run out of things to do, so go to sleep.     */    if (ev_receive(ATTACHE_PSOS_QEVENT, EV_ANY, 0, &events)) {      printf("ATTD: ev_receive() failed\n");      break;    }    ATTACHE_LOCK();    /*     * This is the only event we expect to receive.     */    BUG_ASSERT(events == ATTACHE_PSOS_QEVENT);  }  snark_shutdown();#if INSTALL_SNARK_POOL_TEST_METRICS  {    void pool_report(void);    pool_report();  }#endif  t_suspend(0);  return snark_exit_value;}int etc_isascii (char c){  return !(c & ~0x7f);}#if INSTALL_SNARK_PSOS_NEEDS_UNLINKint unlink (char *f){  return (int) remove_f (f);}#endif

⌨️ 快捷键说明

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