author | llornkcor <llornkcor> | 2005-08-04 07:22:40 (UTC) |
---|---|---|
committer | llornkcor <llornkcor> | 2005-08-04 07:22:40 (UTC) |
commit | 77825e5455872ef0c6def793b38bc767a3838bc0 (patch) (side-by-side diff) | |
tree | adff22adfee3d6a17dd9e0a76ccc51f2a2a20a1f | |
parent | 32743ebb00d374ad18afbed69ab3e94b03699a57 (diff) | |
download | opie-77825e5455872ef0c6def793b38bc767a3838bc0.zip opie-77825e5455872ef0c6def793b38bc767a3838bc0.tar.gz opie-77825e5455872ef0c6def793b38bc767a3838bc0.tar.bz2 |
apply patch in # 0001662, fixes build with uclibc
-rw-r--r-- | core/opie-login/main.cpp | 5 | ||||
-rw-r--r-- | noncore/applets/keyhelper/keyhelperapplet/anylnk/ProcessInvoker.cpp | 4 | ||||
-rw-r--r-- | noncore/settings/sysinfo/benchmarkinfo.cpp | 2 |
3 files changed, 9 insertions, 2 deletions
diff --git a/core/opie-login/main.cpp b/core/opie-login/main.cpp index 554efd3..3f1077c 100644 --- a/core/opie-login/main.cpp +++ b/core/opie-login/main.cpp @@ -1,360 +1,363 @@ /* =. This file is part of the OPIE Project .=l. Copyright (c) 2002 Robert Griebl <sandman@handhelds.org> .>+-= _;:, .> :=|. This file is free software; you can .> <`_, > . <= redistribute it and/or modify it under :`=1 )Y*s>-.-- : the terms of the GNU General Public .="- .-=="i, .._ License as published by the Free Software - . .-<_> .<> Foundation; version 2 of the License. ._= =} : .%`+i> _;_. .i_,=:_. -<s. This file is distributed in the hope that + . -:. = it will be useful, but WITHOUT ANY WARRANTY; : .. .:, . . . without even the implied warranty of =_ + =;=|` MERCHANTABILITY or FITNESS FOR A _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU General ..}^=.= = ; Public License for more details. ++= -. .` .: : = ...= . :.=- You should have received a copy of the GNU -. .:....=;==+<; General Public License along with this file; -_. . . )=. = see the file COPYING. If not, write to the -- :-=` Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "loginapplication.h" #include "loginwindowimpl.h" #include "calibrate.h" /* OPIE */ #include <opie2/odevice.h> #include <qpe/qpestyle.h> #include <qpe/power.h> #include <qpe/config.h> /* QT */ #include <qwindowsystem_qws.h> #include <qmessagebox.h> #include <qlabel.h> #include <qtimer.h> #include <qfile.h> /* STD */ #include <sys/types.h> #include <time.h> #include <sys/time.h> #include <sys/resource.h> #include <unistd.h> #include <syslog.h> #include <sys/wait.h> #include <stdio.h> #include <stdlib.h> #include <signal.h> #include <getopt.h> #include <string.h> using namespace Opie::Core; int login_main ( int argc, char **argv, pid_t ppid ); void sigterm ( int sig ); void sigint ( int sig ); void exit_closelog ( ); int main ( int argc, char **argv ) { int userExited = 0; pid_t ppid = ::getpid ( ); if ( ::geteuid ( ) != 0 ) { ::fprintf ( stderr, "%s can only be executed by root. (or chmod +s)\n", argv [0] ); return 1; } if ( ::getuid ( ) != 0 ) // qt doesn't really like SUID and ::setuid ( 0 ); // messes up things like config files // struct rlimit rl; // ::getrlimit ( RLIMIT_NOFILE, &rl ); // for ( unsigned int i = 0; i < rl. rlim_cur; i++ ) // ::close ( i ); ::setpgid ( 0, 0 ); ::setsid ( ); ::signal ( SIGTERM, sigterm ); ::signal ( SIGINT, sigterm ); ::openlog ( "opie-login", LOG_CONS, LOG_AUTHPRIV ); ::atexit ( exit_closelog ); const char* autolog = 0; Config c( "opie-login" ); c.setGroup( "autologin" ); QString entry = c.readEntry( "user", "" ); if ( !entry.isEmpty() ) autolog = ::strdup( (const char*) entry ); while ( true ) { pid_t child = ::fork ( ); if ( child < 0 ) { ::syslog ( LOG_ERR, "Could not fork GUI process\n" ); break; } else if ( child > 0 ) { int status = 0; time_t started = ::time ( 0 ); while ( ::waitpid ( child, &status, 0 ) < 0 ) { } LoginApplication::logout ( ); if (( ::time ( 0 ) - started ) < 3 ) { if ( autolog ) { ::syslog ( LOG_ERR, "Respawning too fast -- disabling auto-login\n" ); autolog = 0; } else { ::syslog ( LOG_ERR, "Respawning too fast -- going down\n" ); break; } } int killedbysig = 0; userExited=0; if (WIFEXITED(status)!=0 ) { if (WEXITSTATUS(status)==137) { userExited=1; } } if ( WIFSIGNALED( status )) { switch ( WTERMSIG( status )) { case SIGTERM: case SIGINT : case SIGKILL: break; default : killedbysig = WTERMSIG( status ); break; } } if ( killedbysig ) { // qpe was killed by an uncaught signal qApp = 0; ::syslog ( LOG_ERR, "Opie was killed by a signal #%d", killedbysig ); QWSServer::setDesktopBackground ( QImage ( )); QApplication *app = new QApplication ( argc, argv, QApplication::GuiServer ); app-> setFont ( QFont ( "Helvetica", 10 )); app-> setStyle ( new QPEStyle ( )); -// const char *sig = ::strsignal ( killedbysig ); +#ifndef __UCLIBC__ const char *sig = ::sys_siglist[killedbysig]; +#else + const char *sig = ::strsignal ( killedbysig ); +#endif QLabel *l = new QLabel ( 0, "sig", Qt::WStyle_Customize | Qt::WStyle_NoBorder | Qt::WStyle_Tool ); l-> setText ( LoginWindowImpl::tr( "Opie was terminated\nby an uncaught signal\n(%1)\n" ). arg ( sig )); l-> setAlignment ( Qt::AlignCenter ); l-> move ( 0, 0 ); l-> resize ( app-> desktop ( )-> width ( ), app-> desktop ( )-> height ( )); l-> show ( ); QTimer::singleShot ( 3000, app, SLOT( quit())); app-> exec ( ); delete app; qApp = 0; } } else { if ( !autolog ) { QString confFile=QPEApplication::qpeDir() + "etc/opie-login.conf"; Config cfg ( confFile, Config::File ); cfg. setGroup ( "General" ); QString user = cfg. readEntry ( "AutoLogin" ); if ( !user. isEmpty ( )) autolog = ::strdup ( user. latin1 ( )); } if ( autolog && !userExited ) { QWSServer::setDesktopBackground( QImage() ); ODevice::inst()->setDisplayStatus( true ); LoginApplication *app = new LoginApplication ( argc, argv, ppid ); LoginApplication::setLoginAs( autolog ); if ( LoginApplication::changeIdentity ( )) ::exit ( LoginApplication::login ( )); else ::exit ( 0 ); } else { ::exit ( login_main ( argc, argv, ppid )); } } } return 0; } void sigterm ( int /*sig*/ ) { ::exit ( 0 ); } void exit_closelog ( ) { ::closelog ( ); } class LoginScreenSaver : public QWSScreenSaver { public: LoginScreenSaver ( ) { m_lcd_status = true; m_backlight_bright = -1; m_backlight_forcedoff = false; // Make sure the LCD is in fact on, (if opie was killed while the LCD is off it would still be off) ODevice::inst ( )-> setDisplayStatus ( true ); } void restore() { if ( !m_lcd_status ) // We must have turned it off ODevice::inst ( ) -> setDisplayStatus ( true ); setBacklight ( -3 ); } bool save( int level ) { switch ( level ) { case 0: if ( backlight() > 1 ) setBacklight( 1 ); // lowest non-off return true; break; case 1: setBacklight( 0 ); // off return true; break; case 2: // We're going to suspend the whole machine if ( PowerStatusManager::readStatus().acStatus() != PowerStatus::Online ) { QWSServer::sendKeyEvent( 0xffff, Qt::Key_F34, FALSE, TRUE, FALSE ); return true; } break; } return false; } private: public: void setIntervals( int i1 = 30, int i2 = 20, int i3 = 60 ) { int v [4]; v [ 0 ] = QMAX( 1000 * i1, 100 ); v [ 1 ] = QMAX( 1000 * i2, 100 ); v [ 2 ] = QMAX( 1000 * i3, 100 ); v [ 3 ] = 0; if ( !i1 && !i2 && !i3 ) QWSServer::setScreenSaverInterval ( 0 ); else QWSServer::setScreenSaverIntervals ( v ); } int backlight ( ) { if ( m_backlight_bright == -1 ) m_backlight_bright = 255; return m_backlight_bright; } void setBacklight ( int bright ) { if ( bright == -3 ) { // Forced on m_backlight_forcedoff = false; bright = -1; } if ( m_backlight_forcedoff && bright != -2 ) return ; if ( bright == -2 ) { // Toggle between off and on bright = m_backlight_bright ? 0 : -1; m_backlight_forcedoff = !bright; } m_backlight_bright = bright; bright = backlight ( ); ODevice::inst ( ) -> setDisplayBrightness ( bright ); m_backlight_bright = bright; } private: bool m_lcd_status; int m_backlight_bright; bool m_backlight_forcedoff; }; int login_main ( int argc, char **argv, pid_t ppid ) { QWSServer::setDesktopBackground( QImage() ); LoginApplication *app = new LoginApplication ( argc, argv, ppid ); app-> setFont ( QFont ( "Helvetica", 10 )); app-> setStyle ( new QPEStyle ( )); if ( QWSServer::mouseHandler() && QWSServer::mouseHandler() ->inherits("QCalibratedMouseHandler") ) { if ( !QFile::exists ( "/etc/pointercal" )) { // Make sure calibration widget starts on top. Calibrate *cal = new Calibrate; cal-> exec ( ); delete cal; } } LoginScreenSaver *saver = new LoginScreenSaver; saver-> setIntervals ( ); QWSServer::setScreenSaver ( saver ); saver-> restore ( ); LoginWindowImpl *lw = new LoginWindowImpl ( ); app-> setMainWidget ( lw ); lw-> setGeometry ( 0, 0, app-> desktop ( )-> width ( ), app-> desktop ( )-> height ( )); lw-> show ( ); int rc = app-> exec ( ); if ( app-> loginAs ( )) { if ( app-> changeIdentity ( )) { app-> login ( ); // if login succeeds, it never comes back QMessageBox::critical ( 0, LoginWindowImpl::tr( "Failure" ), LoginWindowImpl::tr( "Could not start Opie." )); rc = 1; } else { QMessageBox::critical ( 0, LoginWindowImpl::tr( "Failure" ), LoginWindowImpl::tr( "Could not switch to new user identity" )); rc = 2; } } return rc; } diff --git a/noncore/applets/keyhelper/keyhelperapplet/anylnk/ProcessInvoker.cpp b/noncore/applets/keyhelper/keyhelperapplet/anylnk/ProcessInvoker.cpp index 09605bd..ff06551 100644 --- a/noncore/applets/keyhelper/keyhelperapplet/anylnk/ProcessInvoker.cpp +++ b/noncore/applets/keyhelper/keyhelperapplet/anylnk/ProcessInvoker.cpp @@ -1,424 +1,428 @@ #include "ProcessInvoker.h" +#ifndef PIPE_BUF // uClibc or similar +#include <linux/limits.h> +#endif + static ProcessInvoker* g_this; /* ------------------------------------------------------------------------ */ /* static functions */ /* ------------------------------------------------------------------------ */ static Sigfunc* setSignalHandler(int signo, Sigfunc* handler) { struct sigaction act,oact; act.sa_handler = handler; ::sigemptyset(&act.sa_mask); act.sa_flags = 0; #ifdef SA_RESTART act.sa_flags |= SA_RESTART; #endif if(::sigaction(signo, &act, &oact) < 0){ return(NULL); } return(oact.sa_handler); } static void childHandler(int /*signo*/) { pid_t pid; int status; while((pid = ::waitpid(-1, &status, WNOHANG)) > 0){ if(pid == g_this->m_child){ g_this->notifyFinish(status); } } } /* ------------------------------------------------------------------------ */ /* ProcessInvoker Class : parent process */ /* ------------------------------------------------------------------------ */ ProcessInvoker::ProcessInvoker() { g_this = this; m_isRunning = false; m_child = 0; m_defChildHandler = SIG_DFL; m_pTimer = new QTimer(this); m_stdfd[0] = m_stdfd[1] = -1; m_errfd[0] = m_errfd[1] = -1; connect(m_pTimer, SIGNAL(timeout()), this, SLOT(readOutputs())); } ProcessInvoker::~ProcessInvoker() { qDebug("ProcessInvoker::~ProcessInvoker()"); } bool ProcessInvoker::openPipe() { if(m_stdfd[0] >= 0) closePipe(m_stdfd, 0); if(m_stdfd[1] >= 0) closePipe(m_stdfd, 1); if(::pipe(m_stdfd) < 0){ return(false); } if(m_errfd[0] >= 0) closePipe(m_errfd, 0); if(m_errfd[1] >= 0) closePipe(m_errfd, 1); if(::pipe(m_errfd) < 0){ closePipe(m_stdfd); return(false); } m_maxfdp1 = m_stdfd[0]; if(m_errfd[0] > m_maxfdp1){ m_maxfdp1 = m_errfd[0]; } m_maxfdp1++; return(true); } void ProcessInvoker::closePipe(int fd[], int n) { if(fd == NULL){ closePipe(m_stdfd, n); closePipe(m_errfd, n); } else { if(n != 1 && fd[0] >= 0){ ::close(fd[0]); fd[0] = -1; } if(n != 0 && fd[1] >= 0){ ::close(fd[1]); fd[1] = -1; } } } void ProcessInvoker::setRunning(int pid) { m_child = pid; m_isRunning = true; } bool ProcessInvoker::run(const QString& args) { //setArguments(KHUtil::parseArgs(args)); setArguments(StringParser::split(' ', args)); return(run()); } bool ProcessInvoker::run() { if(m_isRunning){ return(false); } m_isRunning = true; if(m_arguments.isEmpty()){ m_isRunning = false; return(false); } if(m_arguments[0][0] != '/'){ m_isRunning = false; return(false); } for(QStringList::Iterator it=m_arguments.begin(); it!=m_arguments.end(); ++it){ qDebug("arguments[%s]", (*it).ascii()); } /* open pipe */ if(openPipe() == false){ m_isRunning = false; return(false); } /* signal handler reset */ m_defChildHandler = setSignalHandler(SIGCHLD, SIG_DFL); m_child = ::fork(); if(m_child < 0){ /* fork error */ closePipe(); setSignalHandler(SIGCHLD, m_defChildHandler); m_isRunning = false; return(false); } else if(m_child == 0){ /* child process */ qDebug("child process[%d]", ::getpid()); m_child = ::getpid(); //setSignalHandler(SIGCHLD, SIG_DFL); workerProc(); /* no return */ } /* close pipe(write) */ closePipe(NULL, 1); #if 0 m_pTimer = new QTimer(this); connect(m_pTimer, SIGNAL(timeout()), this, SLOT(readOutputs())); #endif m_pTimer->start(500); { emit start(m_child, m_arguments); QCopEnvelope e(SC_CHANNEL, "start(int,QStringList)"); e << m_child << m_arguments; if(m_isNotify){ int idx = m_arguments[0].findRev('/'); notifyStatus(m_arguments[0].mid(idx+1), m_child); } } int status; if(::waitpid(-1, &status, WNOHANG) > 0){ qDebug("finish"); notifyFinish(status); } else { /* signal handler set */ setSignalHandler(SIGCHLD, childHandler); } return(true); } void ProcessInvoker::terminate() { if(m_isRunning && m_child > 0){ terminate(m_child); } } void ProcessInvoker::terminate(pid_t pid) { ::kill(pid, SIGTERM); } void ProcessInvoker::kill() { if(m_isRunning && m_child > 0){ kill(m_child); } } void ProcessInvoker::kill(pid_t pid) { ::kill(pid, SIGKILL); } #if 0 const QStringList ProcessInvoker::parseArgs(const QString& arguments) { QString str; QStringList args; char quote = 0; char c; for(unsigned int i=0; i<arguments.length(); i++){ c = arguments[i]; switch(c){ case '\"': if(quote == 0){ quote = c; } else if(quote == '\"'){ if(str.length() > 0){ args.append(str); } str = ""; quote = 0; } else { str += c; } break; case '\'': if(quote == 0){ quote = c; } else if(quote == '\''){ if(str.length() > 0){ args.append(str); } str = ""; quote = 0; } else { str += c; } break; case ' ': if(quote == 0){ if(str.length() > 0){ args.append(str); str = ""; } } else { str += c; } break; default: str += c; break; } } if(str.length() > 0){ args.append(str); } return(args); } #endif void ProcessInvoker::readOutputs() { struct timeval tmval; tmval.tv_sec = 0; tmval.tv_usec = 0; fd_set rset; QByteArray stdBuf, errBuf, resBuf; QDataStream stdStream(stdBuf, IO_WriteOnly); QDataStream errStream(errBuf, IO_WriteOnly); int iRet; bool running; char buf[PIPE_BUF+1]; while(true){ running = false; FD_ZERO(&rset); if(m_stdfd[0] >= 0){ FD_SET(m_stdfd[0], &rset); running = true; } if(m_errfd[0] >= 0){ FD_SET(m_errfd[0], &rset); running = true; } if(running == false){ m_pTimer->stop(); //delete m_pTimer; break; } if((iRet = ::select(m_maxfdp1, &rset, NULL, NULL, &tmval)) <= 0){ qDebug("select[%d]", iRet); break; } if(m_stdfd[0] >= 0 && FD_ISSET(m_stdfd[0], &rset)){ int n = ::read(m_stdfd[0], buf, PIPE_BUF); if(n > 0){ stdStream.writeRawBytes(buf, n); } else { qDebug("stdout close"); closePipe(m_stdfd, 0); } } if(m_errfd[0] >= 0 && FD_ISSET(m_errfd[0], &rset)){ int n = ::read(m_errfd[0], buf, PIPE_BUF); if(n > 0){ errStream.writeRawBytes(buf, n); } else { qDebug("stderr close"); closePipe(m_errfd, 0); } } } if(stdBuf.size() > 0){ QCopEnvelope e(SC_CHANNEL, "stdout(int,QByteArray)"); e << m_child << stdBuf; } if(errBuf.size() > 0){ QCopEnvelope e(SC_CHANNEL, "stderr(int,QByteArray)"); e << m_child << errBuf; } if(running == false){ QCopEnvelope e(SC_CHANNEL, "close(int)"); e << m_child; } } #if 0 void ProcessInvoker::waitFinish() { int status; if(::waitpid(m_child, &status, 0) > 0){ notifyFinish(status); } else { notifyFinish(0, false); } } #endif void ProcessInvoker::notifyFinish(int status, bool success) { bool stopped = false; QString result; int code; if(success){ if(WIFEXITED(status)){ code = WEXITSTATUS(status); if(code == 127){ result = "error"; } else { result = "exit"; } } else if(WIFSIGNALED(status)){ result = "terminated"; code = WTERMSIG(status); } else if(WIFSTOPPED(status)){ result = "stopped"; code = WSTOPSIG(status); stopped = true; } else { /* ¤³¤ì¤Ï̵¤¤¤Ï¤º? */ result = "error"; code = -2; qWarning("ProcessInvoker: unknown status"); } } else { result = "error"; code = -1; qWarning("ProcessInvoker: wait error"); } emit finish(result, code); QCopEnvelope e(SC_CHANNEL, "finish(int,QString,int)"); e << m_child << result << code; if(m_isNotify){ notifyStatus(result, code); setNotify(false); } if(stopped == false){ setSignalHandler(SIGCHLD, m_defChildHandler); m_isRunning = false; } } void ProcessInvoker::notifyStatus(const QString& result, int code) { QString message = QString::number(code); message.append(":"); message.append(result); Global::statusMessage(message); } /* ------------------------------------------------------------------------ */ /* ProcessInvoker Class : child process */ /* ------------------------------------------------------------------------ */ void ProcessInvoker::workerProc() { closePipe(m_stdfd, 0); closePipe(m_errfd, 0); if(m_stdfd[1] != STDOUT_FILENO){ ::dup2(m_stdfd[1], STDOUT_FILENO); closePipe(m_stdfd, 1); } if(m_errfd[1] != STDERR_FILENO){ ::dup2(m_errfd[1], STDERR_FILENO); closePipe(m_errfd, 1); } QCString* arglist = new QCString[m_arguments.count()+1]; const char** argv = new const char*[m_arguments.count()+1]; unsigned int i; for(i=0; i<m_arguments.count(); i++){ //arglist[i] = m_arguments[i].local8Bit(); arglist[i] = m_arguments[i]; argv[i] = arglist[i]; } argv[i] = 0; ::execv(argv[0], (char*const*)argv); delete[] arglist; delete[] argv; ::_exit(127); } diff --git a/noncore/settings/sysinfo/benchmarkinfo.cpp b/noncore/settings/sysinfo/benchmarkinfo.cpp index ac6e1fa..8de9aa1 100644 --- a/noncore/settings/sysinfo/benchmarkinfo.cpp +++ b/noncore/settings/sysinfo/benchmarkinfo.cpp @@ -1,406 +1,406 @@ /********************************************************************** ** BenchmarkInfo ** ** A benchmark widget for Qt/Embedded ** ** Copyright (C) 2004 Michael Lauer <mickey@vanille.de> ** Inspired by ZBench (C) 2002 Satoshi <af230533@im07.alpha-net.ne.jp> ** ** This file may be distributed and/or modified under the terms of the ** GNU General Public License version 2 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. ** ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** **********************************************************************/ #include "benchmarkinfo.h" /* OPIE */ #include <opie2/odebug.h> #include <opie2/ostorageinfo.h> #include <opie2/olistview.h> #include <opie2/oresource.h> #include <qpe/qpeapplication.h> #include <qpe/qcopenvelope_qws.h> #include <qpe/qpedecoration_qws.h> #include <qpe/config.h> using namespace Opie::Core; using namespace Opie::Ui; /* QT */ #include <qclipboard.h> #include <qcolor.h> #include <qcombobox.h> #include <qdirectpainter_qws.h> #include <qfile.h> #include <qtextstream.h> #include <qfiledialog.h> #include <qlabel.h> #include <qlayout.h> #include <qpainter.h> #include <qpushbutton.h> #include <qtimer.h> #include <qwhatsthis.h> /* STD */ #include <time.h> #include <stdio.h> #include <stdlib.h> #include <math.h> -#if defined (__GNUC__) && (__GNUC__ < 3) +#if (defined (__GNUC__) && (__GNUC__ < 3)) || defined(__UCLIBC__) #define round qRound #endif extern "C" { void BenchFFT( void ); double dhry_main( int ); } #define DHRYSTONE_RUNS 20000000 #define TEST_DURATION 3 //=========================================================================== class BenchmarkPaintWidget : public QWidget { public: BenchmarkPaintWidget() : QWidget( 0, "Benchmark Paint Widget", WStyle_Customize|WStyle_StaysOnTop|WPaintUnclipped|WPaintClever ) { resize( QApplication::desktop()->size() ); show(); p.begin( this ); }; ~BenchmarkPaintWidget() { p.end(); hide(); }; QPainter p; }; //=========================================================================== BenchmarkInfo::BenchmarkInfo( QWidget *parent, const char *name, int wFlags ) : QWidget( parent, name, wFlags ) { setMinimumSize( 200, 150 ); QVBoxLayout* vb = new QVBoxLayout( this ); vb->setSpacing( 4 ); vb->setMargin( 4 ); tests = new OListView( this ); QWhatsThis::add( tests->viewport(), tr( "This area shows the available tests, the results for which the tests " "have been performed, and comparison values for one selected device. " "Use the checkboxes to define which tests you want to perform." ) ); tests->setMargin( 0 ); tests->addColumn( tr( "Tests" ) ); tests->addColumn( tr( "Results" ) ); tests->addColumn( tr( "Comparison" ) ); tests->setShowSortIndicator( true ); test_alu = new OCheckListItem( tests, tr( "1. Integer Arithmetic " ), OCheckListItem::CheckBox ); test_fpu = new OCheckListItem( tests, tr( "2. Floating Point Unit " ), OCheckListItem::CheckBox ); test_txt = new OCheckListItem( tests, tr( "3. Text Rendering " ), OCheckListItem::CheckBox ); test_gfx = new OCheckListItem( tests, tr( "4. Gfx Rendering " ), OCheckListItem::CheckBox ); test_ram = new OCheckListItem( tests, tr( "5. RAM Performance " ), OCheckListItem::CheckBox ); #ifndef QT_QWS_RAMSES test_sd = new OCheckListItem( tests, tr( "6. SD Card Performance " ), OCheckListItem::CheckBox ); test_cf = new OCheckListItem( tests, tr( "7. CF Card Performance " ), OCheckListItem::CheckBox ); #endif test_alu->setText( 1, "n/a" ); test_fpu->setText( 1, "n/a" ); test_txt->setText( 1, "n/a" ); test_gfx->setText( 1, "n/a" ); test_ram->setText( 1, "n/a" ); #ifndef QT_QWS_RAMSES test_sd->setText( 1, "n/a" ); test_cf->setText( 1, "n/a" ); #endif test_alu->setText( 2, "n/a" ); test_fpu->setText( 2, "n/a" ); test_txt->setText( 2, "n/a" ); test_gfx->setText( 2, "n/a" ); test_ram->setText( 2, "n/a" ); #ifndef QT_QWS_RAMSES test_sd->setText( 2, "n/a" ); test_cf->setText( 2, "n/a" ); #endif startButton = new QPushButton( tr( "&Start Tests!" ), this ); QWhatsThis::add( startButton, tr( "Click here to perform the selected tests." ) ); connect( startButton, SIGNAL( clicked() ), this, SLOT( run() ) ); vb->addWidget( tests, 2 ); QHBoxLayout* hb = new QHBoxLayout( vb ); hb->addWidget( startButton, 2 ); QFile f( QPEApplication::qpeDir() + "share/sysinfo/results" ); if ( f.open( IO_ReadOnly ) ) { machineCombo = new QComboBox( this ); QWhatsThis::add( machineCombo, tr( "Choose a model to compare your results with." ) ); QTextStream ts( &f ); while( !ts.eof() ) { QString machline = ts.readLine(); odebug << "sysinfo: parsing benchmark results for '" << machline << "'" << oendl; QString resline = ts.readLine(); machines.insert( machline, new QStringList( QStringList::split( ",", resline ) ) ); machineCombo->insertItem( machline ); } hb->addWidget( machineCombo, 2 ); connect( machineCombo, SIGNAL( activated(int) ), this, SLOT( machineActivated(int) ) ); } } BenchmarkInfo::~BenchmarkInfo() {} void BenchmarkInfo::machineActivated( int index ) { QStringList* results = machines[ machineCombo->text( index ) ]; if ( !results ) { odebug << "sysinfo: no results available." << oendl; return; } QStringList::Iterator it = results->begin(); test_alu->setText( 2, *(it++) ); test_fpu->setText( 2, *(it++) ); test_txt->setText( 2, *(it++) ); test_gfx->setText( 2, *(it++) ); test_ram->setText( 2, *(it++) ); #ifndef QT_QWS_RAMSES test_sd->setText( 2, *(it++) ); test_cf->setText( 2, *(it++) ); #endif } void BenchmarkInfo::run() { startButton->setText( "> Don't touch! <" ); qApp->processEvents(); QTime t; if ( test_alu->isOn() ) { int d = round( dhry_main( DHRYSTONE_RUNS ) ); test_alu->setText( 1, QString().sprintf( "%d dhrys", d ) ); test_alu->setOn( false ); } if ( test_fpu->isOn() ) { t.start(); BenchFFT(); test_fpu->setText( 1, QString().sprintf( "%.2f secs", t.elapsed() / 1000.0 ) );; test_fpu->setOn( false ); } if ( test_txt->isOn() ) { int value = textRendering( TEST_DURATION ); test_txt->setText( 1, QString().sprintf( "%d chars/sec", value / TEST_DURATION ) ); test_txt->setOn( false ); } if ( test_gfx->isOn() ) { int value = gfxRendering( TEST_DURATION ); test_gfx->setText( 1, QString().sprintf( "%.2f gops/sec", value / 4.0 / TEST_DURATION ) ); // 4 tests test_gfx->setOn( false ); } if ( test_ram->isOn() ) // /tmp is supposed to be in RAM on a PDA { performFileTest( "/tmp/benchmarkFile.dat", test_ram ); } #ifndef QT_QWS_RAMSES if ( test_cf->isOn() ) { OStorageInfo storage; performFileTest( storage.cfPath() + "/benchmarkFile.dat", test_cf ); } if ( test_sd->isOn() ) { OStorageInfo storage; performFileTest( storage.sdPath() + "/benchmarkFile.dat", test_sd ); } #endif startButton->setText( tr( "&Start Tests!" ) ); } int BenchmarkInfo::textRendering( int seconds ) { QTime t; t.start(); int stop = t.elapsed() + seconds * 1000; int rr[] = { 255, 255, 255, 0, 0, 0, 0, 128, 128 }; int gg[] = { 0, 255, 0, 0, 255, 255, 0, 128, 128 }; int bb[] = { 0, 0, 255, 0, 0, 255, 255, 128, 0 }; const QString text( "Opie Benchmark Test" ); int w = QApplication::desktop()->width(); int h = QApplication::desktop()->height(); srand( time( NULL ) ); BenchmarkPaintWidget bpw; int loops = 0; while ( t.elapsed() < stop ) { int k = rand() % 9; int s = rand() % 100; bpw.p.setPen( QColor( rr[ k ], gg[ k ], bb[ k ] ) ); bpw.p.setFont( QFont( "Vera", s ) ); bpw.p.drawText( rand() % w, rand() % h, text, text.length() ); ++loops; } return loops * text.length(); } int BenchmarkInfo::gfxRendering( int seconds ) { int rr[] = { 255, 255, 255, 0, 0, 0, 0, 128, 128 }; int gg[] = { 0, 255, 0, 0, 255, 255, 0, 128, 128 }; int bb[] = { 0, 0, 255, 0, 0, 255, 255, 128, 0 }; int w = QApplication::desktop()->width(); int h = QApplication::desktop()->height(); srand( time( NULL ) ); BenchmarkPaintWidget bpw; QTime t; t.start(); int stop = t.elapsed() + seconds*1000; int loops = 0; while ( t.elapsed() < stop ) { int k = rand() % 9; bpw.p.setPen( QColor( rr[ k ], gg[ k ], bb[ k ] ) ); bpw.p.drawLine( rand()%w, rand()%h, rand()%w, rand()%h ); ++loops; } t.restart(); stop = t.elapsed() + seconds*1000; while ( t.elapsed() < stop ) { int k = rand() % 9; bpw.p.setPen( QColor( rr[ k ], gg[ k ], bb[ k ] ) ); bpw.p.drawArc( rand()%w, rand()%h, rand()%w, rand()%h, 360 * 16, 360 * 16 ); ++loops; } QBrush br1; br1.setStyle( SolidPattern ); t.restart(); stop = t.elapsed() + seconds*1000; while ( t.elapsed() < stop ) { int k = rand() % 9; br1.setColor( QColor( rr[ k ], gg[ k ], bb[ k ] ) ); bpw.p.fillRect( rand()%w, rand()%h, rand()%w, rand()%h, br1 ); ++loops; } QPixmap p = Opie::Core::OResource::loadPixmap( "sysinfo/pattern" ); t.restart(); stop = t.elapsed() + seconds*1000; while ( t.elapsed() < stop ) { bpw.p.drawPixmap( rand()%w, rand()%h, p ); ++loops; } return loops; } const unsigned int FILE_TEST_COUNT = 8000; const unsigned int FILE_TEST_BLOCKSIZE = 1024; void BenchmarkInfo::performFileTest( const QString& fname, OCheckListItem* item ) { QString filename = fname == "/benchmarkFile.dat" ? QString( "/tmp/bla" ) : fname; odebug << "performing file test on " << filename << oendl; QString writeCommand = QString( "dd if=/dev/zero of=%1 count=%2 bs=%3 && sync" ).arg( filename ) .arg( FILE_TEST_COUNT ) .arg( FILE_TEST_BLOCKSIZE ); QString readCommand = QString( "dd if=%1 of=/dev/null count=%2 bs=%3").arg( filename ) .arg( FILE_TEST_COUNT ) .arg( FILE_TEST_BLOCKSIZE ); ::system( "sync" ); odebug << "performing file test on " << filename << oendl; int write = 0; int read = 0; QTime time; time.start(); if ( ::system( writeCommand ) == 0 ) { write = time.elapsed(); } else { item->setText( 1, tr( "error" ) ); return; } time.restart(); if ( ::system( readCommand ) == 0 ) { read = time.elapsed(); } else { item->setText( 1, tr( "error" ) ); return; } QFile::remove( filename ); double readSpeed = FILE_TEST_COUNT / ( read / 1000.0 ); QString readUnit = "kB/s"; if ( readSpeed > 1024 ) { readSpeed /= 1024.0; readUnit = "MB/s"; } double writeSpeed = FILE_TEST_COUNT / ( write / 1000.0 ); QString writeUnit = "kb/s"; if ( writeSpeed > 1024 ) { writeSpeed /= 1024.0; writeUnit = "MB/s"; } item->setText( 1, QString().sprintf( "%.2f %s; %.2f %s", readSpeed, readUnit.latin1(), writeSpeed, writeUnit.latin1() ) ); item->setOn( false ); } |