3 #include "loadbalance.h"
8 LoadPackage::LoadPackage()
10 completion_lock = new Condition(0, "LoadPackage::completion_lock");
12 LoadPackage::~LoadPackage()
14 delete completion_lock;
25 LoadClient::LoadClient(LoadServer *server)
28 Thread::set_synchronous(1);
29 this->server = server;
32 input_lock = new Condition(0, "LoadClient::input_lock");
33 completion_lock = new Condition(0, "LoadClient::completion_lock");
36 LoadClient::~LoadClient()
42 delete completion_lock;
45 int LoadClient::get_package_number()
47 return package_number;
50 LoadServer* LoadClient::get_server()
56 void LoadClient::run()
60 input_lock->lock("LoadClient::run");
68 server->client_lock->lock("LoadClient::run");
69 if(server->current_package < server->total_packages)
71 package_number = server->current_package;
72 package = server->packages[server->current_package++];
73 server->client_lock->unlock();
76 process_package(package);
78 package->completion_lock->unlock();
82 completion_lock->unlock();
83 server->client_lock->unlock();
96 LoadServer::LoadServer(int total_clients, int total_packages)
98 if(total_clients <= 0)
99 printf("LoadServer::LoadServer total_clients == %d\n", total_clients);
100 this->total_clients = total_clients;
101 this->total_packages = total_packages;
105 client_lock = new Mutex("LoadServer::client_lock");
108 LoadServer::~LoadServer()
115 void LoadServer::delete_clients()
119 for(int i = 0; i < total_clients; i++)
126 void LoadServer::delete_packages()
130 for(int i = 0; i < total_packages; i++)
137 void LoadServer::set_package_count(int total_packages)
140 this->total_packages = total_packages;
145 void LoadServer::create_clients()
149 clients = new LoadClient*[total_clients];
150 for(int i = 0; i < total_clients; i++)
152 clients[i] = new_client();
158 void LoadServer::create_packages()
162 packages = new LoadPackage*[total_packages];
163 for(int i = 0; i < total_packages; i++)
164 packages[i] = new_package();
168 LoadPackage* LoadServer::get_package(int number)
170 return packages[number];
173 LoadClient* LoadServer::get_client(int number)
175 return clients[number];
178 int LoadServer::get_total_packages()
180 return total_packages;
183 int LoadServer::get_total_clients()
185 return total_clients;
188 void LoadServer::process_packages()
190 if(!clients) create_clients();
191 if(!packages) create_packages();
200 for(int i = 0; i < total_clients; i++)
202 clients[i]->input_lock->unlock();
205 // Wait for packages to get finished
206 for(int i = 0; i < total_packages; i++)
208 packages[i]->completion_lock->lock("LoadServer::process_packages 1");
211 // Wait for clients to finish before allowing changes to packages
212 for(int i = 0; i < total_clients; i++)
214 clients[i]->completion_lock->lock("LoadServer::process_packages 2");