wint_t getKey(void) { uint32_t end = SysUpTime() + 200; while (!_kbhit()) if (SysUpTime() >= end) return 0; return ConReadKey(); }
u32_t sys_arch_mbox_fetch(sys_mbox_t *mbox, void **msg, u32_t timeout) { int wait; u64_t start, delta; if (timeout) wait = timeout; else wait = WAIT_FOREVER; start = SysUpTime(); if (ker_msgQReceive(mbox->sys_mbox, (char*)msg, sizeof(void*), wait) <= 0) { return SYS_ARCH_TIMEOUT; } delta = SysUpTime() - start; do_div(delta, 1000000); return (u32_t)delta; }
u32_t sys_arch_sem_wait(sys_sem_t *sem, u32_t timeout) { int wait, ret; u64_t start, delta; if (timeout) wait = timeout; else wait = WAIT_FOREVER; start = SysUpTime(); ret = ker_semCTake(sem->sys_sem, wait); if (ret == -1) { return SYS_ARCH_TIMEOUT; } if (ret == 0) return 0; delta = SysUpTime() - start; do_div(delta, 1000000); return (u32_t)delta; }
/***************************************************************************** name: main *****************************************************************************/ int main(void) { char Fell, NewShape, NewX, NewY; unsigned Shape, X, Y; wint_t Key; mglrc_t *rc; /* re-seed the random number generator */ srand(SysUpTime()); rc = mglCreateRc(NULL); if (rc == NULL) return EXIT_FAILURE; NEW: screenInit(); write_status(L"TETRIS by Alexei\n" L" Pazhitnov\n" L"Software by\n" L" Chris Giese\n" L"\x2018" L"1" L"\x2019" L" and " L"\x2018" L"2" L"\x2019" L" rotate\n" L"Arrow keys move\n" L"Esc or Q quits"); goto FOO; while(1) { Fell = 0; NewShape = Shape; NewX = X; NewY = Y; Key = getKey(); if (Key == 0) { NewY++; Fell = 1; } else { if(Key == 'q' || Key == 'Q' || Key == 27) break; //goto FIN; if (Key == '1' || Key == KEY_UP) NewShape = Shapes[Shape].Plus90; else if (Key == '2') NewShape = Shapes[Shape].Minus90; else if (Key == KEY_LEFT) { if (X > 0) NewX = X - 1; } else if (Key == KEY_RIGHT) { if (X < SCN_WID - 1) NewX = X + 1; } else if (Key == KEY_DOWN) { if (Y < SCN_HT - 1) NewY = Y + 1; } Fell = 0; } /* if nothing has changed, skip the bottom half of this loop */ if(NewX == X && NewY == Y && NewShape == Shape) continue; /* otherwise, erase old shape from the old pos'n */ shapeErase(X, Y, Shape); /* hit anything? */ if(shapeHit(NewX, NewY, NewShape) == 0) { /* no, update pos'n */ X = NewX; Y = NewY; Shape=NewShape; } /* yes -- did the piece hit something while falling on its own? */ else if(Fell) { /* yes, draw it at the old pos'n... */ shapeDraw(X, Y, Shape); /* ... and spawn new shape */ FOO: Y = 3; X = SCN_WID / 2; Shape = rand() % _countof(Shapes); collapse(); /* if newly spawned shape hits something, game over */ if (shapeHit(X, Y, Shape)) { write_status(L"GAME OVER"); ConReadKey(); goto NEW; } } /* hit something because of user movement/rotate OR no hit: just redraw it */ shapeDraw(X, Y, Shape); refresh(); } mglDeleteRc(rc); return 0; }
void *RAMainLoop(void *arg) { int err = 0; int iRet = 0; fd_set rdset; ND_OPT_FMT_LINK_ST *pstMsg = NULL; unsigned char buff[MAX_BUFFER]; int iRcvLen = -1; struct sockaddr_in6 stFrom; INTERFACE_RA_ST *p = (INTERFACE_RA_ST *)arg; struct timeval t; /* start of AU4D02338 by d00107688 2010-01-21 网关设置为SLAAC方式获取IPv6的地址,连续发起多次RS后,未收到RA,后续再也不发送RS请求 */ static long lTimeLft; /* select剩余的时间 */ long lTime; lTimeLft = SysUpTime(); /* end of AU4D02338 by d00107688 2010-01-21 网关设置为SLAAC方式获取IPv6的地址,连续发起多次RS后,未收到RA,后续再也不发送RS请求 */ int len; loginfo(FUNC, "begin to loop......"); fprintf(stderr, "RAMainLoop pid: %d\r\n\r\n\r\n", getpid()); sleep(1); while (!exit_ok) { iRet = 0; if (p->iFlags & en_st_start) { iRet = 1; } if (!iRet) { loginfo(FUNC, "ra will not eff....... %0x\r\n\r\n", p->iFlags & en_st_start ? 1:0); } /* 决定要不要发送RS消息 */ /* start of AU4D02338 by d00107688 2010-01-21 网关设置为SLAAC方式获取IPv6的地址,连续发起多次RS后,未收到RA,后续再也不发送RS请求 */ #if 0 if ( iRet && (MAX_RS_SEND_NUM > p->iRSNum) && (!(en_ra_rcv & p->iFlags))) #else if (iRet && (!(en_ra_rcv & p->iFlags))) #endif { len = SendRSPacket(p->iSockfd, p->iIfindex); /*BEGIN 2032203980 m00182044 2012-06-10 modify*/ loginfo(FUNC, "send rs len = %d \n", len); /*END 2032203980 m00182044 2012-06-10 modify*/ if (RS_NUM_MAX_VALUE < p->iRSNum) { p->iRSNum = 1; } if (0 == p->iRSNum) { t.tv_sec = 0; } else { t.tv_sec = (1 << p->iRSNum); } t.tv_usec = 0; p->iRSNum++; loginfo(FUNC, "the %d times to send, time: %0x\r\n", p->iRSNum, t.tv_sec); } else { t.tv_sec = PREFIX_UPDATE_TIME; t.tv_usec = 0; } if (!iRet) { t.tv_sec = PREFIX_UPDATE_TIME; } /* end of AU4D02338 by d00107688 2010-01-21 网关设置为SLAAC方式获取IPv6的地址,连续发起多次RS后,未收到RA,后续再也不发送RS请求 */ FD_ZERO(&rdset); FD_SET(p->iSockfd, &rdset); err = select((p->iSockfd + 1), &rdset, NULL, NULL, &t); loginfo(FUNC, "select return err %d", err); if (0 > err) { loginfo(FUNC, "select error %s", strerror(errno)); if (EINTR == err) { loginfo(FUNC, "because interrupt........"); } continue; } else if (FD_ISSET(p->iSockfd, &rdset)) { iRcvLen = RecvRAPacket(p->iSockfd, &stFrom, p->iIfindex, buff, MAX_BUFFER, iRet); if ((!iRet) || (0 >= iRcvLen)) { loginfo(FUNC, "receive msg error"); continue; } pstMsg = BuildTLVList((void *)buff, stFrom, iRcvLen); if (!pstMsg) { loginfo(FUNC, "Build TLV list error"); continue; } #if 0 DumpWholeTLVList(pstMsg); #endif ProcessRAOption(pstMsg, &p->stRAData); FreeTLVList(&pstMsg); UpdateRAInfo(p); p->iFlags |= en_ra_rcv; } /* start of AU4D02338 by d00107688 2010-01-21 网关设置为SLAAC方式获取IPv6的地址,连续发起多次RS后,未收到RA,后续再也不发送RS请求 */ if (iRet) { lTime = SysUpTime(); /* 如果lTime < lTimeLft 那么表示溢出了 */ if ((lTime < lTimeLft) || (PREFIX_UPDATE_TIME <= (lTime - lTimeLft))) { UpdateRAInfo(p); lTimeLft = SysUpTime(); } } /* end of AU4D02338 by d00107688 2010-01-21 网关设置为SLAAC方式获取IPv6的地址,连续发起多次RS后,未收到RA,后续再也不发送RS请求 */ } DelInterfaceByIndex(p->iIfindex); pthread_exit(0); return (0); }