]> sjero.net Git - iperf/blob - src/Launch.cpp
Original 2.0.2 iperf sources
[iperf] / src / Launch.cpp
1 /*--------------------------------------------------------------- 
2  * Copyright (c) 1999,2000,2001,2002,2003                              
3  * The Board of Trustees of the University of Illinois            
4  * All Rights Reserved.                                           
5  *--------------------------------------------------------------- 
6  * Permission is hereby granted, free of charge, to any person    
7  * obtaining a copy of this software (Iperf) and associated       
8  * documentation files (the "Software"), to deal in the Software  
9  * without restriction, including without limitation the          
10  * rights to use, copy, modify, merge, publish, distribute,        
11  * sublicense, and/or sell copies of the Software, and to permit     
12  * persons to whom the Software is furnished to do
13  * so, subject to the following conditions: 
14  *
15  *     
16  * Redistributions of source code must retain the above 
17  * copyright notice, this list of conditions and 
18  * the following disclaimers. 
19  *
20  *     
21  * Redistributions in binary form must reproduce the above 
22  * copyright notice, this list of conditions and the following 
23  * disclaimers in the documentation and/or other materials 
24  * provided with the distribution. 
25  * 
26  *     
27  * Neither the names of the University of Illinois, NCSA, 
28  * nor the names of its contributors may be used to endorse 
29  * or promote products derived from this Software without
30  * specific prior written permission. 
31  * 
32  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
33  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 
34  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
35  * NONINFRINGEMENT. IN NO EVENT SHALL THE CONTIBUTORS OR COPYRIGHT 
36  * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 
37  * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 
38  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE
39  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 
40  * ________________________________________________________________
41  * National Laboratory for Applied Network Research 
42  * National Center for Supercomputing Applications 
43  * University of Illinois at Urbana-Champaign 
44  * http://www.ncsa.uiuc.edu
45  * ________________________________________________________________ 
46  *
47  * Launch.cpp
48  * by Kevin Gibbs <kgibbs@nlanr.net> 
49  * ------------------------------------------------------------------- 
50  * Functions to launch new server and client threads from C while
51  * the server and client are in C++.
52  * The launch function for reporters is in Reporter.c since it is
53  * in C and does not need a special launching function.
54  * ------------------------------------------------------------------- */ 
55
56 #include "headers.h"
57 #include "Thread.h"
58 #include "Settings.hpp"
59 #include "Client.hpp"
60 #include "Listener.hpp"
61 #include "Server.hpp"
62 #include "PerfSocket.hpp"
63
64 /*
65  * listener_spawn is responsible for creating a Listener class
66  * and launching the listener. It is provided as a means for
67  * the C thread subsystem to launch the listener C++ object.
68  */
69 void listener_spawn( thread_Settings *thread ) {
70     Listener *theListener = NULL;
71
72     // start up a listener
73     theListener = new Listener( thread );
74 #ifndef WIN32
75     // handling of daemon mode in non-win32 builds
76     if ( isDaemon( thread ) ) {
77         theListener->runAsDaemon("iperf",LOG_DAEMON);
78     }
79 #endif
80
81     // Start listening
82     theListener->Run();
83     DELETE_PTR( theListener );
84 }
85
86 /*
87  * server_spawn is responsible for creating a Server class
88  * and launching the server. It is provided as a means for
89  * the C thread subsystem to launch the server C++ object.
90  */
91 void server_spawn( thread_Settings *thread) {
92     Server *theServer = NULL;
93
94     // Start up the server
95     theServer = new Server( thread );
96     
97     // Run the test
98     theServer->Run();
99     DELETE_PTR( theServer);
100 }
101
102 /*
103  * client_spawn is responsible for creating a Client class
104  * and launching the client. It is provided as a means for
105  * the C thread subsystem to launch the client C++ object.
106  */
107 void client_spawn( thread_Settings *thread ) {
108     Client *theClient = NULL;
109
110     //start up the client
111     theClient = new Client( thread );
112
113     // Let the server know about our settings
114     theClient->InitiateServer();
115
116     // Run the test
117     theClient->Run();
118     DELETE_PTR( theClient );
119 }
120
121 /*
122  * client_init handles multiple threaded connects. It creates
123  * a listener object if either the dual test or tradeoff were
124  * specified. It also creates settings structures for all the
125  * threads and arranges them so they can be managed and started
126  * via the one settings structure that was passed in.
127  */
128 void client_init( thread_Settings *clients ) {
129     thread_Settings *itr = NULL;
130     thread_Settings *next = NULL;
131
132     // Set the first thread to report Settings
133     setReport( clients );
134     itr = clients;
135
136     // See if we need to start a listener as well
137     Settings_GenerateListenerSettings( clients, &next );
138
139     // Create a multiple report header to handle reporting the
140     // sum of multiple client threads
141     Mutex_Lock( &groupCond );
142     groupID--;
143     clients->multihdr = InitMulti( clients, groupID );
144     Mutex_Unlock( &groupCond );
145
146 #ifdef HAVE_THREAD
147     if ( next != NULL ) {
148         // We have threads and we need to start a listener so
149         // have it ran before the client is launched
150         itr->runNow = next;
151         itr = next;
152     }
153 #endif
154     // For each of the needed threads create a copy of the
155     // provided settings, unsetting the report flag and add
156     // to the list of threads to start
157     for (int i = 1; i < clients->mThreads; i++) {
158         Settings_Copy( clients, &next );
159         unsetReport( next );
160         itr->runNow = next;
161         itr = next;
162     }
163 #ifndef HAVE_THREAD
164     if ( next != NULL ) {
165         // We don't have threads and we need to start a listener so
166         // have it ran after the client is finished
167         itr->runNext = next;
168     }
169 #endif
170 }
171