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()
39 Thread::set_synchronous(1);
43 input_lock = new Condition(0, "LoadClient::input_lock");
44 completion_lock = new Condition(0, "LoadClient::completion_lock");
47 LoadClient::~LoadClient()
53 delete completion_lock;
56 int LoadClient::get_package_number()
58 return package_number;
61 LoadServer* LoadClient::get_server()
67 void LoadClient::run()
71 input_lock->lock("LoadClient::run");
79 server->client_lock->lock("LoadClient::run");
80 if(server->current_package < server->total_packages)
82 package_number = server->current_package;
83 package = server->packages[server->current_package++];
84 server->client_lock->unlock();
87 process_package(package);
89 package->completion_lock->unlock();
93 completion_lock->unlock();
94 server->client_lock->unlock();
107 LoadServer::LoadServer(int total_clients, int total_packages)
109 if(total_clients <= 0)
110 printf("LoadServer::LoadServer total_clients == %d\n", total_clients);
111 this->total_clients = total_clients;
112 this->total_packages = total_packages;
116 client_lock = new Mutex("LoadServer::client_lock");
119 LoadServer::~LoadServer()
126 void LoadServer::delete_clients()
130 for(int i = 0; i < total_clients; i++)
137 void LoadServer::delete_packages()
141 for(int i = 0; i < total_packages; i++)
148 void LoadServer::set_package_count(int total_packages)
151 this->total_packages = total_packages;
156 void LoadServer::create_clients()
160 clients = new LoadClient*[total_clients];
161 for(int i = 0; i < total_clients; i++)
163 clients[i] = new_client();
164 clients[i]->server = this;
170 void LoadServer::create_packages()
174 packages = new LoadPackage*[total_packages];
175 for(int i = 0; i < total_packages; i++)
176 packages[i] = new_package();
180 LoadPackage* LoadServer::get_package(int number)
182 return packages[number];
185 LoadClient* LoadServer::get_client(int number)
187 return clients[number];
190 int LoadServer::get_total_packages()
192 return total_packages;
195 int LoadServer::get_total_clients()
197 return total_clients;
200 void LoadServer::process_packages()
202 if(!clients) create_clients();
203 if(!packages) create_packages();
212 for(int i = 0; i < total_clients; i++)
214 clients[i]->input_lock->unlock();
217 // Wait for packages to get finished
218 for(int i = 0; i < total_packages; i++)
220 packages[i]->completion_lock->lock("LoadServer::process_packages 1");
223 // Wait for clients to finish before allowing changes to packages
224 for(int i = 0; i < total_clients; i++)
226 clients[i]->completion_lock->lock("LoadServer::process_packages 2");