Esempio n. 1
0
set<TS_UINT64> CBlock::scanMissingPackets() {
	set<TS_UINT64> answers;			// 将数组号转换成的序列号
	
	iop_lock(&mapLock);
	for (auto iter = blockContents.begin(); iter != blockContents.end();) {		// 搜包
		set<int> results;														// 获取保存的位置号
		CPackage* pack = iter->second;
		if (pack->isFull()) {
			straWrite->onMsgScanStrategy(pack);									// 写文件扫描触发

			if (straDestroy->onMsgScanStrategy(pack)) {							// 销毁包扫描触发
				delete iter->second;											// 若返回true则销毁
				iter->second = NULL;
				blockContents.erase(iter++);
			} else {
				iter++;
			}
		} else {
			int answer = pack->scanMissingPackets(results);						// 获取包内丢失packet的位置
			for (auto i = results.begin(); i != results.end(); i++) {	
				answers.insert(getSequence(iter->first, (*i)));					// 根据包号,位置号,得到序号
			}
			iter++;
		}
	}

	iop_unlock(&mapLock);
	return answers;
}
Esempio n. 2
0
int CBlock::readMsg(TS_UINT64 seq, ts_msg& pout) {
	DWORD packageNum, pos;
	getArrayNumberAndPos(seq, packageNum, pos);
	
	iop_lock(&mapLock);
	if (curPackage == NULL || packageNum != curPackage->getID()) {
		auto iter = blockContents.find(packageNum);
		if (iter != blockContents.end()) {							// 若seq在内存范围内,则去内存中找
			curPackage = iter->second;
		} else {													// 不行只能找文件去了
			string zipName = fileNamePrefix + "_" + int2string(_uid) + ".zip";
			if (CPackage::isZipFileExist(zipName, packageNum)) {	// 先尝试找文件是否存在
				CPackage *p = new CPackage;
				p->load(zipName, packageNum);
				p->setID(packageNum);
				p->setSaved(true);
				blockContents.insert(make_pair(packageNum, p));		// 从文件里挖出来的CPackage
				curPackage = p;
				straWrite->onMsgAddStrategy(p);						// 加入销毁策略
			} else {
				return -1;
			}
		}
	}
	int result = curPackage->query(pout, pos);
	iop_unlock(&mapLock);
	return result;
}
static thread_ret_type thread_func_call __log_service_start_routine(void *arg)
{
    thread_ret_type r = (thread_ret_type)0;
    iop_log_service_t *log = (iop_log_service_t *)arg;
    int nloop = 0;
    while(!(log->stop_flag))
    {
        ++nloop;
        iop_msleep(100);

        iop_lock(&(log->lock));
        __log_service_flush(log);

        if(nloop > 60)
        {
            __iop_log_reopen(log);
            nloop = 0;
        }
        iop_unlock(&(log->lock));

    }
    if(log->fp)
    {
        fclose(log->fp);
        log->fp = (FILE *)0;
    }
    iop_lock_destroy(&(log->lock));
    if(log == g_iop_log_service)
    {
        g_iop_log_service = (iop_log_service_t *)0;
    }
    free(log);
    return r;
}
static int iop_log_write(iop_log_service_t *log,const void *buf, unsigned int len)
{
    int ret = 0;
    if(!log){fwrite(buf,len, 1, stdout);return 0;}
    iop_lock(&(log->lock));
    if(log->log_buf_size + len <= IOP_MAX_LOG_BUF_SIZE)
    {
        memcpy(log->log_buf + log->log_buf_size, buf, len);
        log->log_buf_size += len;
        ret = (int)len;
    }
    else
    {
        if(!(log->fp))
        {
            __iop_log_reopen(log);
        }
        if(log->fp)
        {
            if(log->log_buf_size > 0)
            {
                fwrite(log->log_buf, log->log_buf_size, 1, log->fp);
                log->log_buf_size = 0;
            }
            fwrite(buf, len,1, log->fp);
            ret = (int)len;
        }
    }
    iop_unlock(&(log->lock));
    return ret;
}
Esempio n. 5
0
void CBlock::saveAll() {
	iop_lock(&mapLock);
	for (auto iter = blockContents.begin(); iter != blockContents.end(); ) {
		straWrite->onMsgAddStrategy(iter->second);
		iter++;
	}
	iop_unlock(&mapLock);
}
int iop_log_service_stop()
{
    if(!g_iop_log_service){return 0;}
    iop_log_flush(g_iop_log_service);
    iop_lock(&(g_iop_log_service->lock));
    if((g_iop_log_service->fp))
    {
        fclose(g_iop_log_service->fp);
        g_iop_log_service->fp
= 0;
    }
    iop_thread_cancel((g_iop_log_service->tid));
    iop_unlock(&(g_iop_log_service->lock));
    iop_lock_destroy(&(g_iop_log_service->lock));
    free(g_iop_log_service);
    g_iop_log_service = 0;
    return 0;
}
Esempio n. 7
0
int CBlock::addMsg(const ts_msg& msg) {
	int pLen = -1;

	DWORD packageNum, pos;
	TS_UINT64 seq = getSeq(msg);
	if (seq > maxSeq)
		maxSeq = seq;
	getArrayNumberAndPos(seq, packageNum, pos);			// 获取package号,msg在package的位置

	iop_lock(&mapLock);
	if (curPackage == NULL || packageNum != curPackage->getID()) {	// 若是使用最近一个包,省去find步骤
		auto iter = blockContents.find(packageNum);
		if (iter != blockContents.end()) {				// 在map中找到package
			curPackage = iter->second;
		} else {
			for (auto it2 = blockContents.begin(); it2 != blockContents.end(); it2++) {
				it2->second->needAll();					// 收到一个需要新开Package的情况下,那之前的包应该全部收满
			}

			CPackage* cpa;
			if (isFirstMsg) {							// 若是没有,创建一个,第一个包可能不是0,这里忽略pos之前的miss包
				cpa = new CPackage(pos);
				isFirstMsg = false;
			} else {
				cpa = new CPackage(0);
			}
			curPackage = cpa;
			cpa->setID(packageNum);
			blockContents.insert(make_pair(packageNum, curPackage));	// 新package加入map中

			straDestroy->onMsgAddStrategy(curPackage);						// 新package加入销毁等待。
		}
	}
	pLen = curPackage->insert(msg, pos);			// 若是已有该array,则直接写入
	iop_unlock(&mapLock);

#ifdef _DEBUG_INFO_
	if (pLen <= 0)
		cout << "block: add fail ";
	else
		cout << "block: add okok ";
#endif
	return pLen;
}
int iop_log_flush(iop_log_service_t *log)
{
    if(!log){fflush(stdout);return 0;}
    iop_lock(&(log->lock));
    {
        if(!(log->fp))
        {
            __iop_log_reopen(log);
        }
        if(log->fp)
        {
            if(log->log_buf_size > 0)
            {
                fwrite(log->log_buf, log->log_buf_size, 1, log->fp);
                log->log_buf_size = 0;
                fflush(log->fp);
            }
        }
    }
    iop_unlock(&(log->lock));
    return 0;
}