Example #1
0
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;
}
Example #2
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;
}