int main(int argc, char * argv[]) { BigAllocUseHugePages = false; if (3 != argc && 4 != argc) { usage(); } if (4 == argc) { if (!strcmp(argv[3],"-b")) { matchBothWays = true; } else { usage(); } } static const char *genomeSuffix = "Genome"; size_t filenameLen = strlen(argv[1]) + 1 + strlen(genomeSuffix) + 1; char *fileName = new char[strlen(argv[1]) + 1 + strlen(genomeSuffix) + 1]; snprintf(fileName,filenameLen,"%s%c%s",argv[1],PATH_SEP,genomeSuffix); genome = Genome::loadFromFile(fileName); if (NULL == genome) { fprintf(stderr,"Unable to load genome from file '%s'\n",fileName); return -1; } delete [] fileName; fileName = NULL; inputFileName = argv[2]; unsigned nThreads; #ifdef _DEBUG nThreads = 1; #else // _DEBUG nThreads = GetNumberOfProcessors(); #endif // _DEBUG nRunningThreads = nThreads; _int64 fileSize = QueryFileSize(argv[2]); rangeSplitter = new RangeSplitter(fileSize, nThreads); CreateSingleWaiterObject(&allThreadsDone); ThreadContext *contexts = new ThreadContext[nThreads]; for (unsigned i = 0; i < nThreads; i++) { contexts[i].whichThread = i; StartNewThread(WorkerThreadMain, &contexts[i]); } WaitForSingleWaiterObject(&allThreadsDone); _int64 nUnaligned = 0; for (unsigned i = 0; i < nThreads; i++) { nUnaligned += contexts[i].nUnaligned; } printf("%lld total unaligned\nMAPQ\tnReads\tnMisaligned\n",nUnaligned); for (int i = 0; i <= MaxMAPQ; i++) { _int64 nReads = 0; _int64 nMisaligned = 0; for (unsigned j = 0; j < nThreads; j++) { nReads += contexts[j].countOfReads[i]; nMisaligned += contexts[j].countOfMisalignments[i]; } printf("%d\t%lld\t%lld\n", i, nReads, nMisaligned); } int maxEditDistanceSeen = 0; for (unsigned i = 0; i < nThreads; i++) { } return 0; }
bool ThreadMgr::Listen(const Address & Server) { int err; SessionMgr * Mgr = SessionMgr::Instance(); TunHandler * Handle = TunHandler::Instance(); PolicyMgr * policy = (PolicyMgr *)PolicyMgr::Instance(); Options * options = Options::Instance(); if (!Mgr->InitSSL()) { return false; } int sock; if (options->UDPMode) { sock = (int)socket(AF_INET, SOCK_DGRAM, 0); } else { sock = (int)socket(AF_INET, SOCK_STREAM, 0); // 设置 socket 为不延时方式,否则效率极低 uint32_t flag = 1; if (setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (char *)&flag, sizeof(flag)) == -1) { perror("setsockopt TCP_NODELAY"); } /* flag = 2048; if (setsockopt(sock, SOL_SOCKET, SO_SNDBUF, (char *)&flag, sizeof(flag))) { perror("setsockopt"); } */ } if (sock == -1) { return false; } sockaddr_in dst; dst.sin_family = AF_INET; dst.sin_port = Server.m_Port; dst.sin_addr.s_addr = Server.m_IPv4; err = bind(sock, (sockaddr*)&dst, sizeof dst); if (err == -1) { closesocket(sock); return false; } if (!options->UDPMode) { listen(sock, MAX_LISTEN_SIZE); } // 启动 SockRouter 线程 m_Sock.SetSock(sock); m_Sock.Start(); Mgr->SetSock(sock); // 得到网关策略 Subnet gateways[MAX_GATEWAY_COUNT]; uint32_t count = policy->GetGateway("", gateways); // 检测count值 in_addr addr; addr.s_addr = gateways[0].Address; std::string Address = inet_ntoa(addr); addr.s_addr = gateways[0].Mask; std::string Mask = inet_ntoa(addr); // 启动Tun网卡 if (!Handle->Start(Address, Mask)) { fprintf(stderr, "start tun/tap driver failed\n"); return false; } for (unsigned i = 1; i < count; ++i) { addr.s_addr = gateways[i].Address; Address = inet_ntoa(addr); addr.s_addr = gateways[i].Mask; Mask = inet_ntoa(addr); Handle->AddIP(Address, Mask); } // 启动Tun监视线程 if (!StartNewThread(ThreadMgr::TUN_THREAD)) { // 启动线程失败 closesocket(sock); return false; } return true; }