1 #include "minimumselector.h"
2
3 Define_Module( MinimumSelector );
4
5 void MinimumSelector::activity()
6 {
7 // get parameters
8 int rg = par("random_generator");
9 int serverCount = par("server_count");
10
11 // search servers and save reference to its workload parameter
12 cModule *compound = parentModule();
13
14 for (int i = 0; i<serverCount; i++) {
15 cModule *svr = compound->submodule("server", i);
16 if ((svr==0) || (strcmp(svr->className(), "Server")!=0)) {
17 throw cException("server[] contains non-Server");
18 }
19 server[i] = (Server*) svr;
20 }
21
22 // message loop
23 for (;;) {
24 // get message
25 cMessage *msg = receive();
26
27 // search server with minimum workload (count the number of occurences)
28 int i;
29 int count = 0;
30 long load = 100000000;
31 for (i = 0; i<serverCount; i++) {
32 long l = server[i]->getJobsInSystem();
33 if (l<load) {
34 load = l;
35 count = 1;
36 } else if (l==load) {
37 count++;
38 }
39 }
40 // choose one server with minimum workload randomly
41 int serverNo = (int) uniform(0, count, rg);
42 // find this server
43 for (i = 0; i<serverCount; i++) {
44 if (load==server[i]->getJobsInSystem()) {
45 if (serverNo==0) break;
46 serverNo--;
47 }
48 }
49
50 if (serverNo!=0) throw cException("error while choosing server");
51
52 // and send it to that server
53 send(msg, "out", i);
54 }
55
56 }
57
58 void MinimumSelector::initialize()
59 {
60 server = new Server *[par("server_count")];
61 }
62
63 void MinimumSelector::finish()
64 {
65 delete [] server;
66 }
67