Skip to content

Commit 7681d96

Browse files
author
Sebastiano Merlino
committed
Aligned main trunk with cache development
1 parent 6d943e9 commit 7681d96

File tree

4 files changed

+79
-53
lines changed

4 files changed

+79
-53
lines changed

src/http_response.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ void unlock_on_close::do_action()
3737

3838
cache_response::~cache_response()
3939
{
40-
if(ce != 0x0 && locked_element)
40+
if(ce != 0x0)
4141
details::unlock_cache_entry(ce);
4242
}
4343

@@ -164,13 +164,12 @@ void http_file_response::get_raw_response(MHD_Response** response, webserver* ws
164164

165165
void cache_response::get_raw_response(MHD_Response** response, webserver* ws)
166166
{
167-
this->locked_element = true;
168167
bool valid;
169168
http_response* r;
170169
if(ce == 0x0)
171170
r = ws->get_from_cache(content, &valid, &ce, true, false);
172171
else
173-
r = details::get_response(ce);
172+
details::get_response(ce, &r);
174173
r->get_raw_response(response, ws);
175174
r->decorate_response(*response); //It is done here to avoid to search two times for the same element
176175

src/httpserver/http_response.hpp

Lines changed: 12 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,8 @@ class http_response
137137
const std::vector<std::string>& topics = std::vector<std::string>(),
138138
int keepalive_secs = -1,
139139
const std::string keepalive_msg = "",
140-
const std::string send_topic = ""
140+
const std::string send_topic = "",
141+
cache_entry* ce = 0x0
141142
):
142143
response_type(response_type),
143144
content(content),
@@ -152,7 +153,8 @@ class http_response
152153
keepalive_secs(keepalive_secs),
153154
keepalive_msg(keepalive_msg),
154155
send_topic(send_topic),
155-
ca(new closure_action())
156+
ca(0x0),
157+
ce(ce)
156158
{
157159
set_header(http_utils::http_header_content_type, content_type);
158160
}
@@ -177,9 +179,9 @@ class http_response
177179
keepalive_secs(b.keepalive_secs),
178180
keepalive_msg(b.keepalive_msg),
179181
send_topic(b.send_topic),
180-
ca(new closure_action())
182+
ca(0x0),
183+
ce(b.ce)
181184
{
182-
*ca = b.ca;
183185
}
184186
http_response& operator=(const http_response& b)
185187
{
@@ -205,6 +207,7 @@ class http_response
205207
ca = 0x0;
206208
}
207209
ca = b.ca;
210+
ce = b.ce;
208211
return *this;
209212
}
210213
virtual ~http_response()
@@ -441,6 +444,7 @@ class http_response
441444
std::string send_topic;
442445
struct MHD_Connection* underlying_connection;
443446
closure_action* ca;
447+
cache_entry* ce;
444448

445449
virtual void get_raw_response(MHD_Response** res, webserver* ws = 0x0);
446450
virtual void decorate_response(MHD_Response* res);
@@ -630,20 +634,14 @@ class cache_response : public http_response
630634
public:
631635
cache_response
632636
(
633-
const std::string& key,
634-
bool locked_element = false
635-
) : http_response(http_response::CACHED_CONTENT, key),
636-
ce(0x0),
637-
locked_element(locked_element)
637+
const std::string& key
638+
) : http_response(http_response::CACHED_CONTENT, key, 200, "", true, "", "", false, std::vector<std::string>(), -1, "", "", 0x0)
638639
{
639640
}
640641
cache_response
641642
(
642-
cache_entry* ce,
643-
bool locked_element = false
644-
) : http_response(http_response::CACHED_CONTENT, ""),
645-
ce(ce),
646-
locked_element(locked_element)
643+
cache_entry* ce
644+
) : http_response(http_response::CACHED_CONTENT, "", 200, "", true, "", "", false, std::vector<std::string>(), -1, "", "", ce)
647645
{
648646
if(ce == 0x0)
649647
throw bad_caching_attempt();
@@ -656,9 +654,6 @@ class cache_response : public http_response
656654
protected:
657655
virtual void get_raw_response(MHD_Response** res, webserver* ws = 0x0);
658656
virtual void decorate_response(MHD_Response* res);
659-
private:
660-
cache_entry* ce;
661-
bool locked_element;
662657
friend class webserver;
663658
};
664659

src/httpserver/webserver.hpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ namespace details
6565
struct daemon_item;
6666
void unlock_cache_entry(cache_entry*);
6767
void lock_cache_entry(cache_entry*);
68-
http_response* get_response(cache_entry*);
68+
void get_response(cache_entry*, http_response** res);
6969
}
7070

7171
using namespace http;
@@ -269,7 +269,9 @@ class webserver
269269
http_response* get_from_cache(const std::string& key, bool* valid, bool lock = false, bool write = false);
270270
http_response* get_from_cache(const std::string& key, bool* valid, cache_entry** ce, bool lock = false, bool write = false);
271271
void lock_cache_element(const std::string& key, bool write = false);
272+
void lock_cache_element(cache_entry* ce, bool write = false);
272273
void unlock_cache_element(const std::string& key);
274+
void unlock_cache_element(cache_entry* ce);
273275
cache_entry* put_in_cache(const std::string& key, http_response* value, bool* new_elem, bool lock = false, bool write = false, int validity = -1);
274276
void remove_from_cache(const std::string& key);
275277
bool is_valid(const std::string& key);
@@ -336,8 +338,8 @@ class webserver
336338

337339
std::map<details::http_endpoint, http_resource* > registered_resources;
338340

339-
pthread_rwlock_t cache_guard;
340341
std::map<std::string, cache_entry*> response_cache;
342+
pthread_rwlock_t cache_guard;
341343
#ifdef USE_CPP_ZEROX
342344
std::unordered_set<ip_representation> bans;
343345
std::unordered_set<ip_representation> allowances;

src/webserver.cpp

Lines changed: 61 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,27 @@ struct modded_request
162162
http_request* dhr;
163163
http_response_ptr dhrs;
164164
bool second;
165+
166+
modded_request():
167+
pp(0x0),
168+
complete_uri(0x0),
169+
ws(0x0),
170+
dhr(0x0),
171+
dhrs(0x0),
172+
second(false)
173+
{
174+
}
175+
~modded_request()
176+
{
177+
if (NULL != pp)
178+
{
179+
MHD_destroy_post_processor (pp);
180+
}
181+
if(second)
182+
delete dhr; //TODO: verify. It could be an error
183+
delete complete_uri;
184+
}
185+
165186
};
166187

167188
}
@@ -173,12 +194,11 @@ struct cache_entry
173194
details::http_response_ptr response;
174195
pthread_rwlock_t elem_guard;
175196
pthread_mutex_t lock_guard;
176-
bool locked;
197+
set<pthread_t> lockers;
177198

178199
cache_entry():
179200
ts(-1),
180-
validity(-1),
181-
locked(false)
201+
validity(-1)
182202
{
183203
pthread_rwlock_init(&elem_guard, NULL);
184204
pthread_mutex_init(&lock_guard, NULL);
@@ -195,8 +215,7 @@ struct cache_entry
195215
validity(b.validity),
196216
response(b.response),
197217
elem_guard(b.elem_guard),
198-
lock_guard(b.lock_guard),
199-
locked(b.locked)
218+
lock_guard(b.lock_guard)
200219
{
201220
}
202221

@@ -208,14 +227,12 @@ struct cache_entry
208227
pthread_rwlock_destroy(&elem_guard);
209228
pthread_mutex_destroy(&lock_guard);
210229
elem_guard = b.elem_guard;
211-
locked = b.locked;
212230
}
213231

214232
cache_entry(details::http_response_ptr response, long ts = -1, int validity = -1):
215233
ts(ts),
216234
validity(validity),
217-
response(response),
218-
locked(false)
235+
response(response)
219236
{
220237
pthread_rwlock_init(&elem_guard, NULL);
221238
pthread_mutex_init(&lock_guard, NULL);
@@ -224,24 +241,32 @@ struct cache_entry
224241
void lock(bool write = false)
225242
{
226243
pthread_mutex_lock(&lock_guard);
227-
if(!locked)
244+
if(!lockers.count(pthread_self()))
228245
{
229246
if(write)
247+
{
248+
lockers.insert(pthread_self());
249+
pthread_mutex_unlock(&lock_guard);
230250
pthread_rwlock_wrlock(&elem_guard);
251+
}
231252
else
253+
{
254+
lockers.insert(pthread_self());
255+
pthread_mutex_unlock(&lock_guard);
232256
pthread_rwlock_rdlock(&elem_guard);
233-
locked = true;
257+
}
234258
}
235-
pthread_mutex_unlock(&lock_guard);
259+
else
260+
pthread_mutex_unlock(&lock_guard);
236261
}
237262

238263
void unlock()
239264
{
240265
pthread_mutex_lock(&lock_guard);
241-
if(locked)
266+
if(lockers.count(pthread_self()))
242267
{
268+
lockers.erase(pthread_self());
243269
pthread_rwlock_unlock(&elem_guard);
244-
locked = false;
245270
}
246271
pthread_mutex_unlock(&lock_guard);
247272
}
@@ -260,9 +285,9 @@ void lock_cache_entry(cache_entry* ce)
260285
ce->lock();
261286
}
262287

263-
http_response* get_response(cache_entry* ce)
288+
void get_response(cache_entry* ce, http_response** res)
264289
{
265-
return ce->response.ptr();
290+
*res = ce->response.ptr();
266291
}
267292

268293
};
@@ -509,7 +534,6 @@ webserver& webserver::operator=(const webserver& b)
509534
method_not_allowed_resource = b.method_not_allowed_resource;
510535
method_not_acceptable_resource = b.method_not_acceptable_resource;
511536
internal_error_resource = b.internal_error_resource;
512-
response_cache = b.response_cache;
513537
return *this;
514538
}
515539

@@ -558,23 +582,12 @@ void webserver::sweet_kill()
558582
void webserver::request_completed (void *cls, struct MHD_Connection *connection, void **con_cls, enum MHD_RequestTerminationCode toe)
559583
{
560584
details::modded_request* mr = (struct details::modded_request*) *con_cls;
561-
if(mr != 0x0 && mr->dhrs.res != 0x0)
585+
if (0x0 == mr)
562586
{
563-
if(mr->dhrs->ca != 0x0)
587+
if(mr->dhrs.res != 0x0 && mr->dhrs->ca != 0x0)
564588
mr->dhrs->ca->do_action();
589+
delete mr;
565590
}
566-
if (NULL == mr)
567-
{
568-
return;
569-
}
570-
if (NULL != mr->pp)
571-
{
572-
MHD_destroy_post_processor (mr->pp);
573-
}
574-
if(mr->second)
575-
delete mr->dhr; //TODO: verify. It could be an error
576-
delete mr->complete_uri;
577-
delete mr;
578591
}
579592

580593
void webserver::schedule_fd(int fd, fd_set* schedule_list, int* max)
@@ -1443,6 +1456,7 @@ int webserver::finalize_answer(MHD_Connection* connection, struct details::modde
14431456
catch(...)
14441457
{
14451458
internal_error_page(&dhrs, mr, true);
1459+
dhrs->get_raw_response(&raw_response, this);
14461460
}
14471461
dhrs->decorate_response(raw_response);
14481462
to_ret = dhrs->enqueue_response(connection, raw_response);
@@ -1782,8 +1796,18 @@ void webserver::lock_cache_element(const std::string& key, bool write)
17821796
pthread_rwlock_rdlock(&cache_guard);
17831797
map<string, cache_entry*>::iterator it(response_cache.find(key));
17841798
if(it != response_cache.end())
1799+
{
1800+
pthread_rwlock_unlock(&cache_guard);
17851801
(*it).second->lock(write);
1786-
pthread_rwlock_unlock(&cache_guard);
1802+
}
1803+
else
1804+
pthread_rwlock_unlock(&cache_guard);
1805+
}
1806+
1807+
void webserver::lock_cache_element(cache_entry* ce, bool write)
1808+
{
1809+
if(ce)
1810+
ce->lock(write);
17871811
}
17881812

17891813
void webserver::unlock_cache_element(const std::string& key)
@@ -1795,6 +1819,12 @@ void webserver::unlock_cache_element(const std::string& key)
17951819
pthread_rwlock_unlock(&cache_guard);
17961820
}
17971821

1822+
void webserver::unlock_cache_element(cache_entry* ce)
1823+
{
1824+
if(ce)
1825+
ce->unlock();
1826+
}
1827+
17981828
cache_entry* webserver::put_in_cache(const std::string& key, http_response* value, bool* new_elem, bool lock, bool write, int validity)
17991829
{
18001830
pthread_rwlock_wrlock(&cache_guard);

0 commit comments

Comments
 (0)