bool SemHelper::wait(int timeout) { #ifdef WIN32 if (timeout <= 0) { timeout = INFINITE; } if (WaitForSingleObject(_hSem, timeout) != WAIT_OBJECT_0) { return false; } #elif defined(__APPLE__) if (dispatch_semaphore_wait(_semid, dispatch_time(DISPATCH_TIME_NOW, timeout*1000)) != 0) { return false; } #else if (timeout <= 0) { return (sem_wait(&_semid) == 0); } else { struct timeval tm; gettimeofday(&tm, NULL); long long endtime = tm.tv_sec *1000 + tm.tv_usec/1000 + timeout; do { sleepMillisecond(50); int ret = sem_trywait(&_semid); if (ret == 0) { return true; } struct timeval tv_cur; gettimeofday(&tv_cur, NULL); if (tv_cur.tv_sec*1000 + tv_cur.tv_usec/1000 > endtime) { return false; } if (ret == -1 && errno == EAGAIN) { continue; } else { return false; } } while (true); return false; } #endif return true; }
int main(int argc, char* argv[]) { #ifndef _WIN32 //! linux下需要屏蔽的一些信号 signal( SIGHUP, SIG_IGN ); signal( SIGALRM, SIG_IGN ); signal( SIGPIPE, SIG_IGN ); signal( SIGXCPU, SIG_IGN ); signal( SIGXFSZ, SIG_IGN ); signal( SIGPROF, SIG_IGN ); signal( SIGVTALRM, SIG_IGN ); signal( SIGQUIT, SIG_IGN ); signal( SIGCHLD, SIG_IGN); setenv("TZ", "GMT-8", 1); #else //system("chcp 65001"); #endif srand((ui32)time(NULL)); //AoeViewer(); //vectorViewer(); ILog4zManager::getPtr()->start(); SessionManager::getRef().start(); LOGA("version released by " << __DATE__ << " " << __TIME__); arith_prime(); arith_gray_code(); arith_sort(); TestUtls(checkOther, "checkOther"); TestUtls(checkString, "checkString"); TestUtls(checkFile, "checkFile"); TestUtls(checkFloat, "checkFloat"); TestUtls(checkBalance, "checkBalance"); TestUtls(checkRandom, "checkRandom"); TestUtls(checkTime, "checkTime"); LOGA("check all success."); sleepMillisecond(3000); return 0; }
void LogerManager::run() { _runing = true; pushLog(0, LOG_LEVEL_ALARM, "----------------- log4z thread started! ----------------------------", NULL, 0); for (int i = 0; i <= _lastId; i++) { if (_loggers[i]._enable) { std::stringstream ss; ss <<"logger id=" <<i <<" key=" <<_loggers[i]._key <<" name=" <<_loggers[i]._name <<" path=" <<_loggers[i]._path <<" level=" << _loggers[i]._level <<" display=" << _loggers[i]._display; pushLog(0, LOG_LEVEL_ALARM, ss.str().c_str(), NULL, 0); } } _semaphore.post(); LogData * pLog = NULL; int needFlush[LOG4Z_LOGGER_MAX] = {0}; time_t lastCheckUpdate = time(NULL); while (true) { while(popLog(pLog)) { // _ullStatusTotalPopLog ++; //discard LoggerInfo & curLogger = _loggers[pLog->_id]; if (!curLogger._enable || pLog->_level <curLogger._level ) { delete pLog; pLog = NULL; continue; } if (curLogger._display && !LOG4Z_ALL_SYNCHRONOUS_OUTPUT) { showColorText(pLog->_content, pLog->_level); } if (LOG4Z_ALL_DEBUGOUTPUT_DISPLAY && !LOG4Z_ALL_SYNCHRONOUS_OUTPUT) { #ifdef WIN32 OutputDebugStringA(pLog->_content); #endif } if (curLogger._outfile && !LOG4Z_ALL_SYNCHRONOUS_OUTPUT) { if (!openLogger(pLog)) { delete pLog; pLog = NULL; continue; } curLogger._handle.write(pLog->_content, pLog->_contentLen); curLogger._curWriteLen += (unsigned int)pLog->_contentLen; needFlush[pLog->_id] ++; _ullStatusTotalWriteFileCount++; _ullStatusTotalWriteFileBytes += pLog->_contentLen; } else if (!LOG4Z_ALL_SYNCHRONOUS_OUTPUT) { _ullStatusTotalWriteFileCount++; _ullStatusTotalWriteFileBytes += pLog->_contentLen; } delete pLog; pLog = NULL; } for (int i=0; i<=_lastId; i++) { if (_loggers[i]._enable && needFlush[i] > 0) { _loggers[i]._handle.flush(); needFlush[i] = 0; } if(!_loggers[i]._enable && _loggers[i]._handle.isOpen()) { _loggers[i]._handle.close(); } } //! delay. sleepMillisecond(100); //! quit if (!_runing && _logs.empty()) { break; } if (_hotUpdateInterval != 0 && time(NULL) - lastCheckUpdate > _hotUpdateInterval) { updateConfig(); lastCheckUpdate = time(NULL); } } for (int i=0; i <= _lastId; i++) { if (_loggers[i]._enable) { _loggers[i]._enable = false; closeLogger(i); } } }