📄 testhash.cxx
字号:
#include <iostream>#ifndef WIN32#include <unistd.h>#endif#include <limits.h>#include <signal.h>#include <sys/fcntl.h>#include "rutil/Logger.hxx"#include "resip/stack/HeaderTypes.hxx"#include "resip/stack/ParameterTypeEnums.hxx"#include "resip/stack/ParameterTypes.hxx"#include "resip/stack/MethodTypes.hxx"using namespace resip;using namespace std;#define RESIPROCATE_SUBSYSTEM resip::Subsystem::TESTvolatile bool signalled = false;void tick(int sig){ signalled = true;}static struct { char * keyword; Headers::Type type; int len;} headerInfo[(int)(Headers::MAX_HEADERS)];unsigned int InitHeaderInfo(){ int i = static_cast<int>(Headers::UNKNOWN)+1; int max = static_cast<int>(Headers::MAX_HEADERS); for( ; i < max; ++i) { Headers::Type t = static_cast<Headers::Type>(i); char* p = strdup(resip::Headers::getHeaderName(i).c_str()); headerInfo[i].len = Headers::getHeaderName(i).size(); headerInfo[i].keyword = p; headerInfo[i].type = t; DebugLog(<< headerInfo[i].keyword << " [" << headerInfo[i].type <<"]"); } return i; }bool checkMethods(){ int i = static_cast<int>(resip::UNKNOWN)+1; int max = static_cast<int>(resip::MAX_METHODS); bool failure = false; for( ; i < max ; ++i) { MethodTypes t = static_cast<MethodTypes>(i); const Data& d(resip::getMethodName(t)); MethodTypes nt = resip::getMethodType(d.data(),d.size()); bool ok = nt == t; // DebugLog(<<resip::MethodNames[t]<<" : " << (ok ? "OK":"FAIL")); DebugLog(<< (ok ? " " : "***" ) << ' ' << t << ' ' << resip::getMethodName(t) << '(' << d << ')' << " -> " << nt << ' ' << resip::getMethodName(nt)); // if (!ok) ErrLog(<<resip::getMethodName(t) << " : HASH FAILURE"); failure |= !ok; } return !failure;}boolcheckParameters(){ int i = static_cast<int>(ParameterTypes::UNKNOWN)+1; int max = static_cast<int>(ParameterTypes::MAX_PARAMETER); bool failure = false; for( ; i < max ; ++i) { ParameterTypes::Type t = static_cast<ParameterTypes::Type>(i); Data& d = ParameterTypes::ParameterNames[t]; bool ok = ParameterTypes::getType(d.data(),d.size()) == t; DebugLog(<<ParameterTypes::ParameterNames[t]<<" : " << (ok?"OK":"FAIL")); failure |= !ok; } return !failure;}unsigned short randomUShort(){ static int fd = 0; static bool init = false; if (!init) { fd = open("/dev/urandom",O_RDONLY); if (fd < 0) { cerr << "randomShort(): unable to open /dev/urandom -- degraded mode" << endl; } init = true; } if (init && fd >= 0) { unsigned short r; int n = 0; if ((n=read(fd,&r,sizeof(r))) == sizeof(r)) { return r; } } // degraded mode return (unsigned short)((USHRT_MAX + 1.0) * rand() / (RAND_MAX+1.0));}intmain(){ bool failure = false; register unsigned int i = 0; // Load up the main table unsigned short nKeywords = InitHeaderInfo(); // Verify that the hash function works. InfoLog(<<"Checking that hash function works for all known headers"); for(i=0;i<nKeywords;i++) { Headers::Type t = Headers::getType(headerInfo[i].keyword, headerInfo[i].len); bool ok = headerInfo[i].type == t; InfoLog(<< headerInfo[i].keyword << " " << (ok?"OK":"FAIL")); if (!ok) { ErrLog(<<headerInfo[i].keyword << "[" <<headerInfo[i].type << "] hashed to " << t << " [" << Headers::getHeaderName(i) << "]"); } } InfoLog(<<"Checking methods."); bool p = checkMethods(); InfoLog(<<" methods: " << (p?"OK":"FAIL")); p = checkParameters(); InfoLog(<<" parameters: " << (p?"OK":"FAIL")); #if defined (TIME_HASH_TEST) int randomList[100*1024]; // Make a large random list so we don't take a hit with // random() calcs during the hash. unsigned int nRandom = sizeof(randomList)/sizeof(*randomList); InfoLog(<< "Pre-loading random list of " << nRandom << " entries"); for(i = 0; i < nRandom ; i++) { short r = randomUShort()%nKeywords; randomList[i] = r; } i=0; InfoLog(<<"Starting timing loop"); register int totalTime=30; register int interval=5; register int timer=totalTime; register int elapsed=0; signal(SIGALRM, tick); register unsigned long long counter = 0; assert(totalTime/interval*interval == totalTime); while (timer>0) { alarm(interval); while (!signalled) { volatile register Headers::Type hdr = Headers::getType(headerInfo[randomList[i]].keyword, headerInfo[randomList[i]].len); counter++; i++; if (i >= nRandom) i = 0; } timer-=interval; elapsed+=interval; InfoLog(<< timer <<" sec rem: " << counter << " hashes " << counter/elapsed << " h/sec"); signalled=false; }#endif if (failure) CritLog(<<"Problems in hashes. See above"); return failure?1:0; }/* ==================================================================== * The Vovida Software License, Version 1.0 * * Copyright (c) 2000 Vovida Networks, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The names "VOCAL", "Vovida Open Communication Application Library", * and "Vovida Open Communication Application Library (VOCAL)" must * not be used to endorse or promote products derived from this * software without prior written permission. For written * permission, please contact vocal@vovida.org. * * 4. Products derived from this software may not be called "VOCAL", nor * may "VOCAL" appear in their name, without prior written * permission of Vovida Networks, Inc. * * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND * NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL VOVIDA * NETWORKS, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT DAMAGES * IN EXCESS OF $1,000, NOR FOR ANY INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. * * ==================================================================== * * This software consists of voluntary contributions made by Vovida * Networks, Inc. and many individuals on behalf of Vovida Networks, * Inc. For more information on Vovida Networks, Inc., please see * <http://www.vovida.org/>. * */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -