📄 snrkpsos.c
字号:
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 + -