34
34
SocketMonitor SocketMonitor::self;
36
class SocketMonitor::Private
39
Private(SocketMonitor* p) : mutex(QMutex::Recursive),ut(0),dt(0),next_group_id(1)
41
dt = new DownloadThread(p);
42
ut = new UploadThread(p);
36
SocketMonitor::SocketMonitor() : mutex(QMutex::Recursive),ut(0),dt(0),next_group_id(1)
58
SocketMonitor::SocketMonitor() : d(new Private(this))
38
dt = new DownloadThread(this);
39
ut = new UploadThread(this);
43
64
SocketMonitor::~SocketMonitor()
48
69
void SocketMonitor::shutdown()
74
void SocketMonitor::Private::shutdown()
50
76
if (ut && ut->isRunning())
92
118
DownloadThread::setCap(bytes_per_sec);
121
Uint32 SocketMonitor::getDownloadCap()
123
return DownloadThread::cap();
95
127
void SocketMonitor::setUploadCap(Uint32 bytes_per_sec)
97
129
UploadThread::setCap(bytes_per_sec);
132
Uint32 SocketMonitor::getUploadCap()
134
return UploadThread::cap();
100
138
void SocketMonitor::setSleepTime(Uint32 sleep_time)
102
140
DownloadThread::setSleepTime(sleep_time);
106
144
void SocketMonitor::add(BufferedSocket* sock)
108
QMutexLocker lock(&mutex);
110
bool start_threads = smap.size() == 0;
111
smap.push_back(sock);
146
QMutexLocker lock(&d->mutex);
148
if (!d->dt || !d->ut)
151
bool start_threads = sockets.size() == 0;
152
sockets.push_back(sock);
113
154
if (start_threads)
115
156
Out(SYS_CON|LOG_DEBUG) << "Starting socketmonitor threads" << endl;
117
if (!dt->isRunning())
118
dt->start(QThread::IdlePriority);
119
if (!ut->isRunning())
120
ut->start(QThread::IdlePriority);
158
if (!d->dt->isRunning())
159
d->dt->start(QThread::IdlePriority);
160
if (!d->ut->isRunning())
161
d->ut->start(QThread::IdlePriority);
122
163
// wake up download thread so that it can start polling the new socket
126
167
void SocketMonitor::remove(BufferedSocket* sock)
128
QMutexLocker lock(&mutex);
129
if (smap.size() == 0)
169
QMutexLocker lock(&d->mutex);
170
if (sockets.size() == 0)
173
sockets.remove(sock);
135
176
void SocketMonitor::signalPacketReady()
138
ut->signalDataReady();
179
d->ut->signalDataReady();
141
182
Uint32 SocketMonitor::newGroup(GroupType type,Uint32 limit,Uint32 assured_rate)
144
Uint32 gid = next_group_id++;
184
QMutexLocker lock(&d->mutex);
185
if (!d->dt || !d->ut)
188
Uint32 gid = d->next_group_id++;
145
189
if (type == UPLOAD_GROUP)
146
ut->addGroup(gid,limit,assured_rate);
190
d->ut->addGroup(gid,limit,assured_rate);
148
dt->addGroup(gid,limit,assured_rate);
192
d->dt->addGroup(gid,limit,assured_rate);
153
197
void SocketMonitor::setGroupLimit(GroupType type,Uint32 gid,Uint32 limit)
199
QMutexLocker lock(&d->mutex);
200
if (!d->dt || !d->ut)
156
203
if (type == UPLOAD_GROUP)
157
ut->setGroupLimit(gid,limit);
204
d->ut->setGroupLimit(gid,limit);
159
dt->setGroupLimit(gid,limit);
206
d->dt->setGroupLimit(gid,limit);
163
209
void SocketMonitor::setGroupAssuredRate(GroupType type,Uint32 gid,Uint32 as)
211
QMutexLocker lock(&d->mutex);
212
if (!d->dt || !d->ut)
166
215
if (type == UPLOAD_GROUP)
167
ut->setGroupAssuredRate(gid,as);
216
d->ut->setGroupAssuredRate(gid,as);
169
dt->setGroupAssuredRate(gid,as);
218
d->dt->setGroupAssuredRate(gid,as);
173
221
void SocketMonitor::removeGroup(GroupType type,Uint32 gid)
223
QMutexLocker lock(&d->mutex);
224
if (!d->dt || !d->ut)
176
227
if (type == UPLOAD_GROUP)
177
ut->removeGroup(gid);
228
d->ut->removeGroup(gid);
179
dt->removeGroup(gid);
230
d->dt->removeGroup(gid);