Files
Noor Ahsan 79d102b2c4 iperf: Add version 2.0.4 (initial recipe)
* Imported from oe.dev commit id 0ff10ecb88de73074ae4857046643cef15dc4e97 and c10c33f86903c93611023197a7f812459c2dfe2d.
* Combined .inc and bb file from oe.dev and made a single bb file.
* Removed EXTRA_OECONF_append_epia = " --disable-threads" while importing as this should go in epia layer.

Signed-off-by: Noor Ahsan <noor_ahsan@mentor.com>
2011-08-29 12:15:22 +05:00

165 lines
4.9 KiB
Diff

[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 );