#include <map>
#include <algorithm>
+#include "markpool.h"
#include "metacube.h"
#include "server.h"
#include "mutexlock.h"
Client::Client(int sock)
: sock(sock),
+ fwmark(0),
connect_time(time(NULL)),
state(Client::READING_REQUEST),
stream(NULL),
header_or_error_bytes_sent(serialized.header_or_error_bytes_sent()),
bytes_sent(serialized.bytes_sent())
{
+ if (stream->mark_pool != NULL) {
+ fwmark = stream->mark_pool->get_mark();
+ } else {
+ fwmark = 0; // No mark.
+ }
+ if (setsockopt(sock, SOL_SOCKET, SO_MARK, &fwmark, sizeof(fwmark)) == -1) {
+ if (fwmark != 0) {
+ perror("setsockopt(SO_MARK)");
+ }
+ }
}
ClientProto Client::serialize() const
Stream::Stream(const string &stream_id)
: stream_id(stream_id),
data(new char[BACKLOG_SIZE]),
- data_size(0)
+ data_size(0),
+ mark_pool(NULL)
{
memset(data, 0, BACKLOG_SIZE);
}
: stream_id(serialized.stream_id()),
header(serialized.header()),
data(new char[BACKLOG_SIZE]),
- data_size(serialized.data_size())
+ data_size(serialized.data_size()),
+ mark_pool(NULL)
{
assert(serialized.data().size() == BACKLOG_SIZE);
memcpy(data, serialized.data().data(), BACKLOG_SIZE);
}
}
}
+
+void Server::set_mark_pool(const std::string &stream_id, MarkPool *mark_pool)
+{
+ MutexLock lock(&mutex);
+ assert(clients.empty());
+ find_stream(stream_id)->mark_pool = mark_pool;
+}
void Server::add_data_deferred(const string &stream_id, const char *data, size_t bytes)
{
client->stream_id = request_tokens[1];
client->stream = find_stream(client->stream_id);
+ if (client->stream->mark_pool != NULL) {
+ client->fwmark = client->stream->mark_pool->get_mark();
+ } else {
+ client->fwmark = 0; // No mark.
+ }
+ if (setsockopt(client->sock, SOL_SOCKET, SO_MARK, &client->fwmark, sizeof(client->fwmark)) == -1) {
+ if (client->fwmark != 0) {
+ perror("setsockopt(SO_MARK)");
+ }
+ }
client->request.clear();
return 200; // OK!
if (client->stream != NULL) {
delete_from(&client->stream->sleeping_clients, client);
delete_from(&client->stream->to_process, client);
+ if (client->stream->mark_pool != NULL) {
+ int fwmark = client->fwmark;
+ client->stream->mark_pool->release_mark(fwmark);
+ }
}
-
+
// Bye-bye!
int ret;
do {