r602: Fix baver's code... don't insert timecode when show_tc is not set
[cinelerra_cv/mob.git] / cinelerra / loadbalance.C
blob9f4e9f26ce392874c25b69426516384fb192fe8b
1 #include "condition.h"
2 #include "mutex.h"
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)
26  : Thread()
28         Thread::set_synchronous(1);
29         this->server = server;
30         done = 0;
31         package_number = 0;
32         input_lock = new Condition(0, "LoadClient::input_lock");
33         completion_lock = new Condition(0, "LoadClient::completion_lock");
36 LoadClient::~LoadClient()
38         done = 1;
39         input_lock->unlock();
40         Thread::join();
41         delete input_lock;
42         delete completion_lock;
45 int LoadClient::get_package_number()
47         return package_number;
50 LoadServer* LoadClient::get_server()
52         return server;
56 void LoadClient::run()
58         while(!done)
59         {
60                 input_lock->lock("LoadClient::run");
62                 if(!done)
63                 {
64 // Read packet
65                         LoadPackage *package;
66                         
67                         
68                         server->client_lock->lock("LoadClient::run");
69                         if(server->current_package < server->total_packages)
70                         {
71                                 package_number = server->current_package;
72                                 package = server->packages[server->current_package++];
73                                 server->client_lock->unlock();
74                                 input_lock->unlock();
76                                 process_package(package);
78                                 package->completion_lock->unlock();
79                         }
80                         else
81                         {
82                                 completion_lock->unlock();
83                                 server->client_lock->unlock();
84                         }
85                 }
86         }
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;
102         current_package = 0;
103         clients = 0;
104         packages = 0;
105         client_lock = new Mutex("LoadServer::client_lock");
108 LoadServer::~LoadServer()
110         delete_clients();
111         delete_packages();
112         delete client_lock;
115 void LoadServer::delete_clients()
117         if(clients)
118         {
119                 for(int i = 0; i < total_clients; i++)
120                         delete clients[i];
121                 delete [] clients;
122         }
123         clients = 0;
126 void LoadServer::delete_packages()
128         if(packages)
129         {
130                 for(int i = 0; i < total_packages; i++)
131                         delete packages[i];
132                 delete [] packages;
133         }
134         packages = 0;
137 void LoadServer::set_package_count(int total_packages)
139         delete_packages();
140         this->total_packages = total_packages;
141         create_packages();
145 void LoadServer::create_clients()
147         if(!clients)
148         {
149                 clients = new LoadClient*[total_clients];
150                 for(int i = 0; i < total_clients; i++)
151                 {
152                         clients[i] = new_client();
153                         clients[i]->start();
154                 }
155         }
158 void LoadServer::create_packages()
160         if(!packages)
161         {
162                 packages = new LoadPackage*[total_packages];
163                 for(int i = 0; i < total_packages; i++)
164                         packages[i] = new_package();
165         }
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();
192         
193         
194         
195 // Set up packages
196         init_packages();
198         current_package = 0;
199 // Start all clients
200         for(int i = 0; i < total_clients; i++)
201         {
202                 clients[i]->input_lock->unlock();
203         }
204         
205 // Wait for packages to get finished
206         for(int i = 0; i < total_packages; i++)
207         {
208                 packages[i]->completion_lock->lock("LoadServer::process_packages 1");
209         }
211 // Wait for clients to finish before allowing changes to packages
212         for(int i = 0; i < total_clients; i++)
213         {
214                 clients[i]->completion_lock->lock("LoadServer::process_packages 2");
215         }