From c10c33f86903c93611023197a7f812459c2dfe2d Mon Sep 17 00:00:00 2001 From: Roman I Khimov Date: Fri, 28 May 2010 16:34:33 +0400 Subject: iperf 2.0.4: import Debian patches Fixes a lot of real bugs. Signed-off-by: Roman I Khimov --- .../iperf/iperf-2.0.4/000-Iperf_Fix-CPU-Usage.diff | 164 +++++++++++++++++++ .../001-cast-to-max_size_t-instead-of-int.patch | 11 ++ .../003-fix-hyphen-used-as-minus-sign.patch | 174 +++++++++++++++++++++ recipes/iperf/iperf-2.0.4/004-svn-r43-ro.patch | 113 +++++++++++++ .../iperf-2.0.4/005-iperf-die-on-bind-fail.patch | 11 ++ .../006-iperf-die-on-connect-fail.patch | 11 ++ .../iperf-2.0.4/007-iperf-reporter-deadlock.patch | 65 ++++++++ recipes/iperf/iperf-2.0.4/008-numofreport.patch | 13 ++ recipes/iperf/iperf-2.0.4/009-delayloop.patch | 19 +++ recipes/iperf/iperf_2.0.4.bb | 16 +- 10 files changed, 595 insertions(+), 2 deletions(-) create mode 100644 recipes/iperf/iperf-2.0.4/000-Iperf_Fix-CPU-Usage.diff create mode 100644 recipes/iperf/iperf-2.0.4/001-cast-to-max_size_t-instead-of-int.patch create mode 100644 recipes/iperf/iperf-2.0.4/003-fix-hyphen-used-as-minus-sign.patch create mode 100644 recipes/iperf/iperf-2.0.4/004-svn-r43-ro.patch create mode 100644 recipes/iperf/iperf-2.0.4/005-iperf-die-on-bind-fail.patch create mode 100644 recipes/iperf/iperf-2.0.4/006-iperf-die-on-connect-fail.patch create mode 100644 recipes/iperf/iperf-2.0.4/007-iperf-reporter-deadlock.patch create mode 100644 recipes/iperf/iperf-2.0.4/008-numofreport.patch create mode 100644 recipes/iperf/iperf-2.0.4/009-delayloop.patch (limited to 'recipes') diff --git a/recipes/iperf/iperf-2.0.4/000-Iperf_Fix-CPU-Usage.diff b/recipes/iperf/iperf-2.0.4/000-Iperf_Fix-CPU-Usage.diff new file mode 100644 index 0000000000..7e8995383b --- /dev/null +++ b/recipes/iperf/iperf-2.0.4/000-Iperf_Fix-CPU-Usage.diff @@ -0,0 +1,164 @@ +[Thread]: Replace thread_rest() with condition variables + +This applies the patch by Ingo Molnar from + + http://marc.info/?l=linux-kernel&m=119088670113210&w=2 + +by reverting previous changes that coincided with changes made by this +patch. Other than that, the patch is the original from the above URL. + +Gerrit +--- + compat/Thread.c | 6 ------ + src/Reporter.c | 37 +++++++++---------------------------- + src/main.cpp | 2 ++ + 3 files changed, 11 insertions(+), 34 deletions(-) + +rover: changed two remaining thread_rest. + +--- a/compat/Thread.c ++++ b/compat/Thread.c +@@ -405,12 +405,6 @@ int thread_numuserthreads( void ) { + void thread_rest ( void ) { + #if defined( HAVE_THREAD ) + #if defined( HAVE_POSIX_THREAD ) +-#if defined( _POSIX_PRIORITY_SCHEDULING ) +- sched_yield(); +-#else +- usleep( 0 ); +-#endif +- + #else // Win32 + SwitchToThread( ); + #endif +--- a/src/Reporter.c ++++ b/src/Reporter.c +@@ -110,9 +110,8 @@ + + char buffer[64]; // Buffer for printing + ReportHeader *ReportRoot = NULL; +-int threadWait = 0; +-int threadSleeping = 0; + extern Condition ReportCond; ++extern Condition ReportDoneCond; + int reporter_process_report ( ReportHeader *report ); + void process_report ( ReportHeader *report ); + int reporter_handle_packet( ReportHeader *report ); +@@ -340,7 +339,7 @@ + // item + while ( index == 0 ) { + Condition_Signal( &ReportCond ); +- thread_rest(); ++ Condition_Wait( &ReportDoneCond ); + index = agent->reporterindex; + } + agent->agentindex = 0; +@@ -348,11 +347,9 @@ + // Need to make sure that reporter is not about to be "lapped" + while ( index - 1 == agent->agentindex ) { + Condition_Signal( &ReportCond ); +- thread_rest(); ++ Condition_Wait( &ReportDoneCond ); + index = agent->reporterindex; + } +- if (threadSleeping) +- Condition_Signal( &ReportCond ); + + // Put the information there + memcpy( agent->data + agent->agentindex, packet, sizeof(ReportStruct) ); +@@ -382,9 +379,6 @@ + packet->packetLen = 0; + ReportPacket( agent, packet ); + packet->packetID = agent->report.cntDatagrams; +- if (threadSleeping) +- Condition_Signal( &ReportCond ); +- + } + } + +@@ -396,11 +390,8 @@ + void EndReport( ReportHeader *agent ) { + if ( agent != NULL ) { + int index = agent->reporterindex; +- if (threadSleeping) +- Condition_Signal( &ReportCond ); +- + while ( index != -1 ) { +- thread_rest(); ++ Condition_Wait( &ReportDoneCond ); + index = agent->reporterindex; + } + agent->agentindex = -1; +@@ -421,7 +412,7 @@ + Transfer_Info *GetReport( ReportHeader *agent ) { + int index = agent->reporterindex; + while ( index != -1 ) { +- thread_rest(); ++ Condition_Wait( &ReportDoneCond ); + index = agent->reporterindex; + } + return &agent->report.info; +@@ -467,10 +458,6 @@ + * Update the ReportRoot to include this report. + */ + Condition_Lock( ReportCond ); +- if ( isUDP(agent) ) +- threadWait = 0; +- else +- threadWait = 1; + reporthdr->next = ReportRoot; + ReportRoot = reporthdr; + Condition_Signal( &ReportCond ); +@@ -567,6 +554,7 @@ + } + Condition_Unlock ( ReportCond ); + ++again: + if ( ReportRoot != NULL ) { + ReportHeader *temp = ReportRoot; + //Condition_Unlock ( ReportCond ); +@@ -589,19 +577,12 @@ + // finished with report so free it + free( temp ); + Condition_Unlock ( ReportCond ); ++ Condition_Signal( &ReportDoneCond ); ++ if (ReportRoot) ++ goto again; + } +- // yield control of CPU is another thread is waiting +- // sleep on a condition variable, as it is much cheaper +- // on most platforms than issuing schedyield or usleep +- // syscalls +- Condition_Lock ( ReportCond ); +- if ( threadWait && ReportRoot != NULL) { +- threadSleeping = 1; +- Condition_TimedWait (& ReportCond, 1 ); +- threadSleeping = 0; +- } +- Condition_Unlock ( ReportCond ); +- ++ Condition_Signal( &ReportDoneCond ); ++ usleep(10000); + } else { + //Condition_Unlock ( ReportCond ); + } +--- a/src/main.cpp ++++ b/src/main.cpp +@@ -96,6 +96,7 @@ extern "C" { + // records being accessed in a report and also to + // serialize modification of the report list + Condition ReportCond; ++ Condition ReportDoneCond; + } + + // global variables only accessed within this file +@@ -142,6 +143,7 @@ int main( int argc, char **argv ) { + + // Initialize global mutexes and conditions + Condition_Initialize ( &ReportCond ); ++ Condition_Initialize ( &ReportDoneCond ); + Mutex_Initialize( &groupCond ); + Mutex_Initialize( &clients_mutex ); + + + diff --git a/recipes/iperf/iperf-2.0.4/001-cast-to-max_size_t-instead-of-int.patch b/recipes/iperf/iperf-2.0.4/001-cast-to-max_size_t-instead-of-int.patch new file mode 100644 index 0000000000..3a90175191 --- /dev/null +++ b/recipes/iperf/iperf-2.0.4/001-cast-to-max_size_t-instead-of-int.patch @@ -0,0 +1,11 @@ +--- iperf-2.0.4.orig/src/Settings.cpp.orig 2008-04-08 04:37:54.000000000 +0200 ++++ iperf-2.0.4/src/Settings.cpp 2008-05-07 17:41:03.923942801 +0200 +@@ -458,7 +458,7 @@ + case 't': // seconds to write for + // time mode (instead of amount mode) + setModeTime( mExtSettings ); +- mExtSettings->mAmount = (int) (atof( optarg ) * 100.0); ++ mExtSettings->mAmount = (max_size_t) (atof( optarg ) * 100.0); + break; + + case 'u': // UDP instead of TCP diff --git a/recipes/iperf/iperf-2.0.4/003-fix-hyphen-used-as-minus-sign.patch b/recipes/iperf/iperf-2.0.4/003-fix-hyphen-used-as-minus-sign.patch new file mode 100644 index 0000000000..54896b1091 --- /dev/null +++ b/recipes/iperf/iperf-2.0.4/003-fix-hyphen-used-as-minus-sign.patch @@ -0,0 +1,174 @@ +--- iperf-2.0.4.orig/man/iperf.1 2008-08-21 00:21:49.290527643 +0200 ++++ iperf-2.0.4/man/iperf.1 2008-08-21 00:35:17.850640445 +0200 +@@ -2,21 +2,21 @@ + .SH NAME + iperf \- perform network throughput tests + .SH SYNOPSIS +-.B iperf -s [ ++.B iperf \-s [ + .I options + .B ] + +-.B iperf -c ++.B iperf \-c + .I server + .B [ + .I options + .B ] + +-.B iperf -u -s [ ++.B iperf \-u \-s [ + .I options + .B ] + +-.B iperf -u -c ++.B iperf \-u \-c + .I server + .B [ + .I options +@@ -28,103 +28,103 @@ + traffic). + .SH "GENERAL OPTIONS" + .TP +-.BR -f ", " --format " " ++.BR \-f ", " \-\-format " " + [kmKM] format to report: Kbits, Mbits, KBytes, MBytes + .TP +-.BR -h ", " --help " " ++.BR \-h ", " \-\-help " " + print a help synopsis + .TP +-.BR -i ", " --interval " \fIn\fR" ++.BR \-i ", " \-\-interval " \fIn\fR" + pause \fIn\fR seconds between periodic bandwidth reports + .TP +-.BR -l ", " --len " \fIn\fR[KM]" ++.BR \-l ", " \-\-len " \fIn\fR[KM]" + set length read/write buffer to \fIn\fR (default 8 KB) + .TP +-.BR -m ", " --print_mss " " ++.BR \-m ", " \-\-print_mss " " + print TCP maximum segment size (MTU - TCP/IP header) + .TP +-.BR -o ", " --output " " ++.BR \-o ", " \-\-output " " + output the report or error message to this specified file + .TP +-.BR -p ", " --port " \fIn\fR" ++.BR \-p ", " \-\-port " \fIn\fR" + set server port to listen on/connect to to \fIn\fR (default 5001) + .TP +-.BR -u ", " --udp " " ++.BR \-u ", " \-\-udp " " + use UDP rather than TCP + .TP +-.BR -w ", " --window " \fIn\fR[KM]" ++.BR \-w ", " \-\-window " \fIn\fR[KM]" + TCP window size (socket buffer size) + .TP +-.BR -B ", " --bind " " ++.BR \-B ", " \-\-bind " " + bind to , an interface or multicast address + .TP +-.BR -C ", " --compatibility " " ++.BR \-C ", " \-\-compatibility " " + for use with older versions does not sent extra msgs + .TP +-.BR -M ", " --mss " \fIn\fR" ++.BR \-M ", " \-\-mss " \fIn\fR" + set TCP maximum segment size (MTU - 40 bytes) + .TP +-.BR -N ", " --nodelay " " ++.BR \-N ", " \-\-nodelay " " + set TCP no delay, disabling Nagle's Algorithm + .TP +-.BR -v ", " --version " " ++.BR \-v ", " \-\-version " " + print version information and quit + .TP +-.BR -V ", " --IPv6Version " " ++.BR \-V ", " \-\-IPv6Version " " + Set the domain to IPv6 + .TP +-.BR -x ", " --reportexclude " " ++.BR \-x ", " \-\-reportexclude " " + [CDMSV] exclude C(connection) D(data) M(multicast) S(settings) V(server) reports + .TP +-.BR -y ", " --reportstyle " C|c" ++.BR \-y ", " \-\-reportstyle " C|c" + if set to C or c report results as CSV (comma separated values) + .SH "SERVER SPECIFIC OPTIONS" + .TP +-.BR -s ", " --server " " ++.BR \-s ", " \-\-server " " + run in server mode + .TP +-.BR -U ", " --single_udp " " ++.BR \-U ", " \-\-single_udp " " + run in single threaded UDP mode + .TP +-.BR -D ", " --daemon " " ++.BR \-D ", " \-\-daemon " " + run the server as a daemon + .SH "CLIENT SPECIFIC OPTIONS" + .TP +-.BR -b ", " --bandwidth " \fIn\fR[KM]" ++.BR \-b ", " \-\-bandwidth " \fIn\fR[KM]" + set target bandwidth to \fIn\fR bits/sec (default 1 Mbit/sec). +-This setting requires UDP (-u). ++This setting requires UDP (\-u). + .TP +-.BR -c ", " --client " " ++.BR \-c ", " \-\-client " " + run in client mode, connecting to + .TP +-.BR -d ", " --dualtest " " ++.BR \-d ", " \-\-dualtest " " + Do a bidirectional test simultaneously + .TP +-.BR -n ", " --num " \fIn\fR[KM]" +-number of bytes to transmit (instead of -t) ++.BR \-n ", " \-\-num " \fIn\fR[KM]" ++number of bytes to transmit (instead of \-t) + .TP +-.BR -r ", " --tradeoff " " ++.BR \-r ", " \-\-tradeoff " " + Do a bidirectional test individually + .TP +-.BR -t ", " --time " \fIn\fR" ++.BR \-t ", " \-\-time " \fIn\fR" + time in seconds to transmit for (default 10 secs) + .TP +-.BR -F ", " --fileinput " " ++.BR \-F ", " \-\-fileinput " " + input the data to be transmitted from a file + .TP +-.BR -I ", " --stdin " " ++.BR \-I ", " \-\-stdin " " + input the data to be transmitted from stdin + .TP +-.BR -L ", " --listenport " \fIn\fR" ++.BR \-L ", " \-\-listenport " \fIn\fR" + port to recieve bidirectional tests back on + .TP +-.BR -P ", " --parallel " \fIn\fR" ++.BR \-P ", " \-\-parallel " \fIn\fR" + number of parallel client threads to run + .TP +-.BR -T ", " --ttl " \fIn\fR" ++.BR \-T ", " \-\-ttl " \fIn\fR" + time-to-live, for multicast (default 1) + .TP +-.BR -Z ", " --linux-congestion " " ++.BR \-Z ", " \-\-linux\-congestion " " + set TCP congestion control algorithm (Linux only) + .SH ENVIRONMENT + .TP +@@ -143,6 +143,6 @@ + Kevin Gibbs, + John Estabrook , + Andrew Gallatin , +-Stephen Hemminger ++Stephen Hemminger + .SH "SEE ALSO" + http://iperf.sourceforge.net/ diff --git a/recipes/iperf/iperf-2.0.4/004-svn-r43-ro.patch b/recipes/iperf/iperf-2.0.4/004-svn-r43-ro.patch new file mode 100644 index 0000000000..cab9e18a41 --- /dev/null +++ b/recipes/iperf/iperf-2.0.4/004-svn-r43-ro.patch @@ -0,0 +1,113 @@ +--- iperf-2.0.4-4/AUTHORS 2009-07-06 12:02:24.159696747 +0200 ++++ iperf-2.0.4/AUTHORS 2009-07-06 12:14:32.236079541 +0200 +@@ -28,3 +28,7 @@ + + Stephen Hemminger + * Linux congestion control selection and theading improvements ++ ++Nathan Jones ++ * patch for underflow when value specified in -n is not a multiple of -l ++ +--- iperf-2.0.4-4/ChangeLog 2009-07-06 12:02:24.166276642 +0200 ++++ iperf-2.0.4/ChangeLog 2009-07-06 12:15:28.883699655 +0200 +@@ -1,3 +1,18 @@ ++2008-05-09 Jon Dugan ++ ++* change currLen to unsigned to squelch warning generated by Nathan's patch ++ ++2008-05-09 Nathan Jones ++ ++* prevent underflow when the amount of data to be transmitted (-n) is not a ++multiple of the buffer size (-l) Patch: ++https://sourceforge.net/tracker/index.php?func=detail&aid=1943432&group_id=128336&atid=711373 ++ ++2008-04-08 Jon Dugan ++ ++* print report headers only once ++* use appropriate report header for UDP tests ++ + 2008-04-07 Jon Dugan + + * Add man page to autoconf goo +diff -urN 204orig/src/Client.cpp trunk/src/Client.cpp +--- 204orig/src/Client.cpp 2008-04-08 04:37:54.000000000 +0200 ++++ trunk/src/Client.cpp 2008-05-10 05:18:35.000000000 +0200 +@@ -116,7 +116,7 @@ + const int kBytes_to_Bits = 8; + + void Client::RunTCP( void ) { +- long currLen = 0; ++ unsigned long currLen = 0; + struct itimerval it; + max_size_t totLen = 0; + +@@ -170,7 +170,12 @@ + } + + if ( !mMode_Time ) { +- mSettings->mAmount -= currLen; ++ /* mAmount may be unsigned, so don't let it underflow! */ ++ if( mSettings->mAmount >= currLen ) { ++ mSettings->mAmount -= currLen; ++ } else { ++ mSettings->mAmount = 0; ++ } + } + + } while ( ! (sInterupted || +@@ -198,7 +203,7 @@ + + void Client::Run( void ) { + struct UDP_datagram* mBuf_UDP = (struct UDP_datagram*) mBuf; +- long currLen = 0; ++ unsigned long currLen = 0; + + int delay_target = 0; + int delay = 0; +@@ -310,7 +315,12 @@ + delay_loop( delay ); + } + if ( !mMode_Time ) { +- mSettings->mAmount -= currLen; ++ /* mAmount may be unsigned, so don't let it underflow! */ ++ if( mSettings->mAmount >= currLen ) { ++ mSettings->mAmount -= currLen; ++ } else { ++ mSettings->mAmount = 0; ++ } + } + + } while ( ! (sInterupted || +diff -urN 204orig/src/ReportDefault.c trunk/src/ReportDefault.c +--- 204orig/src/ReportDefault.c 2008-04-08 04:37:54.000000000 +0200 ++++ trunk/src/ReportDefault.c 2008-04-09 02:08:11.000000000 +0200 +@@ -67,6 +67,7 @@ + * Prints transfer reports in default style + */ + void reporter_printstats( Transfer_Info *stats ) { ++ static char header_printed = 0; + + byte_snprintf( buffer, sizeof(buffer)/2, (double) stats->TotalLen, + toupper( stats->mFormat)); +@@ -76,13 +77,19 @@ + + if ( stats->mUDP != (char)kMode_Server ) { + // TCP Reporting +- printf( report_bw_header); ++ if( !header_printed ) { ++ printf( report_bw_header); ++ header_printed = 1; ++ } + printf( report_bw_format, stats->transferID, + stats->startTime, stats->endTime, + buffer, &buffer[sizeof(buffer)/2] ); + } else { + // UDP Reporting +- printf( report_bw_jitter_loss_header); ++ if( !header_printed ) { ++ printf( report_bw_jitter_loss_header); ++ header_printed = 1; ++ } + printf( report_bw_jitter_loss_format, stats->transferID, + stats->startTime, stats->endTime, + buffer, &buffer[sizeof(buffer)/2], diff --git a/recipes/iperf/iperf-2.0.4/005-iperf-die-on-bind-fail.patch b/recipes/iperf/iperf-2.0.4/005-iperf-die-on-bind-fail.patch new file mode 100644 index 0000000000..29500d3877 --- /dev/null +++ b/recipes/iperf/iperf-2.0.4/005-iperf-die-on-bind-fail.patch @@ -0,0 +1,11 @@ +--- iperf-2.0.4/src/Listener.cpp 2009-02-23 16:20:31.000000000 -0500 ++++ iperf-2.0.4-fixed/src/Listener.cpp 2009-02-23 16:20:40.000000000 -0500 +@@ -333,7 +333,7 @@ + #endif + { + rc = bind( mSettings->mSock, (sockaddr*) &mSettings->local, mSettings->size_local ); +- WARN_errno( rc == SOCKET_ERROR, "bind" ); ++ FAIL_errno( rc == SOCKET_ERROR, "bind", mSettings ); + } + // listen for connections (TCP only). + // default backlog traditionally 5 diff --git a/recipes/iperf/iperf-2.0.4/006-iperf-die-on-connect-fail.patch b/recipes/iperf/iperf-2.0.4/006-iperf-die-on-connect-fail.patch new file mode 100644 index 0000000000..968a19aa48 --- /dev/null +++ b/recipes/iperf/iperf-2.0.4/006-iperf-die-on-connect-fail.patch @@ -0,0 +1,11 @@ +--- iperf-2.0.4/src/Client.cpp 2008-04-07 22:37:54.000000000 -0400 ++++ iperf-2.0.4-fixed/src/Client.cpp 2009-03-03 12:30:02.000000000 -0500 +@@ -403,7 +403,7 @@ + // connect socket + rc = connect( mSettings->mSock, (sockaddr*) &mSettings->peer, + SockAddr_get_sizeof_sockaddr( &mSettings->peer )); +- WARN_errno( rc == SOCKET_ERROR, "connect" ); ++ FAIL_errno( rc == SOCKET_ERROR, "connect", mSettings ); + + getsockname( mSettings->mSock, (sockaddr*) &mSettings->local, + &mSettings->size_local ); diff --git a/recipes/iperf/iperf-2.0.4/007-iperf-reporter-deadlock.patch b/recipes/iperf/iperf-2.0.4/007-iperf-reporter-deadlock.patch new file mode 100644 index 0000000000..1383548170 --- /dev/null +++ b/recipes/iperf/iperf-2.0.4/007-iperf-reporter-deadlock.patch @@ -0,0 +1,65 @@ +# by Kirby Zhou < kirbyzhou \x40 sohu-rd.com > +# add a Condition_Wait_Event for ReporterDoneCond +--- iperf-2.0.4.orig/include/Condition.h 2007-08-30 00:06:19.000000000 +0200 ++++ iperf-2.0.4/include/Condition.h 2009-07-06 11:45:02.407700310 +0200 +@@ -115,6 +115,11 @@ typedef struct Condition { + // sleep this thread, waiting for condition signal + #if defined( HAVE_POSIX_THREAD ) + #define Condition_Wait( Cond ) pthread_cond_wait( &(Cond)->mCondition, &(Cond)->mMutex ) ++ #define Condition_Wait_Event( Cond ) do { \ ++ Mutex_Lock( &(Cond)->mMutex ); \ ++ pthread_cond_wait( &(Cond)->mCondition, &(Cond)->mMutex ); \ ++ Mutex_Unlock( &(Cond)->mMutex ); \ ++ } while ( 0 ) + #elif defined( HAVE_WIN32_THREAD ) + // atomically release mutex and wait on condition, + // then re-acquire the mutex +@@ -122,6 +127,10 @@ typedef struct Condition { + SignalObjectAndWait( (Cond)->mMutex, (Cond)->mCondition, INFINITE, false ); \ + Mutex_Lock( &(Cond)->mMutex ); \ + } while ( 0 ) ++ #define Condition_Wait_Event( Cond ) do { \ ++ Mutex_Lock( &(Cond)->mMutex ); \ ++ SignalObjectAndWait( (Cond)->mMutex, (Cond)->mCondition, INFINITE, false ); \ ++ } while ( 0 ) + #else + #define Condition_Wait( Cond ) + #endif +--- iperf-2.0.4.orig/src/Reporter.c 2009-07-06 11:49:05.996443011 +0200 ++++ iperf-2.0.4/src/Reporter.c 2009-07-06 11:46:52.919699530 +0200 +@@ -339,7 +339,7 @@ void ReportPacket( ReportHeader* agent, + // item + while ( index == 0 ) { + Condition_Signal( &ReportCond ); +- Condition_Wait( &ReportDoneCond ); ++ Condition_Wait_Event( &ReportDoneCond ); + index = agent->reporterindex; + } + agent->agentindex = 0; +@@ -347,7 +347,7 @@ void ReportPacket( ReportHeader* agent, + // Need to make sure that reporter is not about to be "lapped" + while ( index - 1 == agent->agentindex ) { + Condition_Signal( &ReportCond ); +- Condition_Wait( &ReportDoneCond ); ++ Condition_Wait_Event( &ReportDoneCond ); + index = agent->reporterindex; + } + +@@ -391,7 +391,7 @@ void EndReport( ReportHeader *agent ) { + if ( agent != NULL ) { + int index = agent->reporterindex; + while ( index != -1 ) { +- Condition_Wait( &ReportDoneCond ); ++ Condition_Wait_Event( &ReportDoneCond ); + index = agent->reporterindex; + } + agent->agentindex = -1; +@@ -412,7 +412,7 @@ void EndReport( ReportHeader *agent ) { + Transfer_Info *GetReport( ReportHeader *agent ) { + int index = agent->reporterindex; + while ( index != -1 ) { +- Condition_Wait( &ReportDoneCond ); ++ Condition_Wait_Event( &ReportDoneCond ); + index = agent->reporterindex; + } + return &agent->report.info; diff --git a/recipes/iperf/iperf-2.0.4/008-numofreport.patch b/recipes/iperf/iperf-2.0.4/008-numofreport.patch new file mode 100644 index 0000000000..0c6d312f40 --- /dev/null +++ b/recipes/iperf/iperf-2.0.4/008-numofreport.patch @@ -0,0 +1,13 @@ +# by Kirby Zhou < kirbyzhou \x40 sohu-rd.com > +# increase the queue length to avoid thread racing +--- iperf-2.0.4.orig/include/Reporter.h 2008-04-08 04:37:54.000000000 +0200 ++++ iperf-2.0.4/include/Reporter.h 2009-07-06 11:53:58.700541554 +0200 +@@ -61,7 +61,7 @@ struct server_hdr; + + #include "Settings.hpp" + +-#define NUM_REPORT_STRUCTS 700 ++#define NUM_REPORT_STRUCTS 5700 + #define NUM_MULTI_SLOTS 5 + + #ifdef __cplusplus diff --git a/recipes/iperf/iperf-2.0.4/009-delayloop.patch b/recipes/iperf/iperf-2.0.4/009-delayloop.patch new file mode 100644 index 0000000000..a1f8dac9f5 --- /dev/null +++ b/recipes/iperf/iperf-2.0.4/009-delayloop.patch @@ -0,0 +1,19 @@ +# by Kirby Zhou < kirbyzhou \x40 sohu-rd.com > +# using sched_yield to schedule other threads, so multiple iperf can run simultaneously +# using usleep with delay-loop between 2 package is long than 1.25ms. +--- iperf-2.0.4-4/compat/delay.cpp 2009-07-06 12:02:24.166276642 +0200 ++++ iperf-2.0.4/compat/delay.cpp 2009-07-06 12:01:33.858384005 +0200 +@@ -69,6 +69,13 @@ void delay_loop( unsigned long usec ) { + + Timestamp now; + while ( now.before( end ) ) { ++ long diff = end.subUsec(now); ++ if (diff >= 1250) { ++ usleep(0); ++ } ++ if (diff >= 2) { ++ sched_yield(); ++ } + now.setnow(); + } + } diff --git a/recipes/iperf/iperf_2.0.4.bb b/recipes/iperf/iperf_2.0.4.bb index 27e374f385..b302aa2add 100644 --- a/recipes/iperf/iperf_2.0.4.bb +++ b/recipes/iperf/iperf_2.0.4.bb @@ -1,8 +1,20 @@ require iperf.inc -PR = "${INC_PR}.0" +PR = "${INC_PR}.1" + +SRC_URI = " \ + ${SOURCEFORGE_MIRROR}/iperf/iperf-${PV}.tar.gz \ + file://000-Iperf_Fix-CPU-Usage.diff \ + file://001-cast-to-max_size_t-instead-of-int.patch \ + file://003-fix-hyphen-used-as-minus-sign.patch \ + file://004-svn-r43-ro.patch \ + file://005-iperf-die-on-bind-fail.patch \ + file://006-iperf-die-on-connect-fail.patch \ + file://007-iperf-reporter-deadlock.patch \ + file://008-numofreport.patch \ + file://009-delayloop.patch \ + " -SRC_URI = "${SOURCEFORGE_MIRROR}/iperf/iperf-${PV}.tar.gz" SRC_URI[md5sum] = "8c5bc14cc2ea55f18f22afe3c23e3dcb" SRC_URI[sha256sum] = "3b52f1c178d6a99c27114929d5469c009197d15379c967b329bafb956f397944" -- cgit v1.2.3