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; }
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; }
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; }
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; }