Skip to content

Commit d2b1c09

Browse files
author
Sebastiano Merlino
committed
Changed event supplier to avoid polymorphic inheritance
1 parent a18841b commit d2b1c09

File tree

2 files changed

+75
-26
lines changed

2 files changed

+75
-26
lines changed

src/httpserver/webserver.hpp

Lines changed: 39 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -96,30 +96,59 @@ class logging_delegate
9696
virtual void log_error(const std::string& s) const;
9797
};
9898

99+
template <typename CHILD>
99100
class event_supplier
100101
{
101102
public:
102-
event_supplier();
103+
event_supplier()
104+
{
105+
}
103106

104-
virtual ~event_supplier();
107+
~event_supplier()
108+
{
109+
}
105110

106-
virtual void supply_events(
111+
void supply_events(
107112
fd_set* read_fdset,
108113
fd_set* write_fdset,
109114
fd_set* exc_fdset,
110115
int* max
111-
) const ;
116+
) const
117+
{
118+
static_cast<CHILD*>(this)->supply_events(
119+
read_fdset, write_fdset, exc_fdset, max
120+
);
121+
}
112122

113-
virtual long get_timeout() const;
123+
long get_timeout() const
124+
{
125+
return static_cast<CHILD*>(this)->get_timeout();
126+
}
114127

115-
virtual void dispatch_events() const;
128+
void dispatch_events() const
129+
{
130+
static_cast<CHILD*>(this)->dispatch_events();
131+
}
116132
};
117133

118134
class create_webserver;
119135

120136
typedef bool(*validator_ptr)(const std::string&);
121137
typedef void(*unescaper_ptr)(char*);
122138

139+
typedef void(*supply_events_ptr)(
140+
fd_set*,
141+
fd_set*,
142+
fd_set*,
143+
int*
144+
);
145+
146+
typedef long(*get_timeout_ptr)();
147+
148+
typedef void(*dispatch_events_ptr)();
149+
150+
struct event_tuple;
151+
123152
/**
124153
* Class representing the webserver. Main class of the apis.
125154
**/
@@ -261,7 +290,9 @@ class webserver
261290
this->unescaper = unescaper;
262291
}
263292

264-
void register_event_supplier(const std::string& id, event_supplier* ev_supplier);
293+
template<typename T>
294+
void register_event_supplier(const std::string& id, event_supplier<T>* ev_supplier);
295+
void remove_event_supplier(const std::string& id);
265296

266297
void run();
267298

@@ -336,7 +367,7 @@ class webserver
336367
std::vector<details::daemon_item*> daemons;
337368
std::vector<pthread_t> threads;
338369

339-
std::map<std::string, event_supplier*> event_suppliers;
370+
std::map<std::string, event_tuple*> event_suppliers;
340371

341372
void init(http_resource* single_resource);
342373
static void* select(void* self);

src/webserver.cpp

Lines changed: 36 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,21 @@ struct cache_entry
281281
}
282282
};
283283

284+
struct event_tuple
285+
{
286+
supply_events_ptr supply_events;
287+
get_timeout_ptr get_timeout;
288+
dispatch_events_ptr dispatch_events;
289+
290+
template<typename T>
291+
event_tuple(event_supplier<T>* es)
292+
{
293+
supply_events(std::bind1st(std::mem_fun(&T::supply_events), es));
294+
get_timeout(std::bind1st(std::mem_fun(&T::get_timeout), es));
295+
dispatch_events(std::bind1st(std::mem_fun(&T::dispatch_events), es));
296+
}
297+
};
298+
284299
using namespace http;
285300

286301
int policy_callback (void *, const struct sockaddr*, socklen_t);
@@ -327,20 +342,6 @@ void logging_delegate::log_access(const string& s) const {}
327342

328343
void logging_delegate::log_error(const string& s) const {}
329344

330-
//EVENT SUPPLIER
331-
event_supplier::event_supplier() {}
332-
333-
event_supplier::~event_supplier() {}
334-
335-
void event_supplier::supply_events(fd_set* read_fdset, fd_set* write_fdset, fd_set* exc_fdset, int* max) const {}
336-
337-
long event_supplier::get_timeout() const
338-
{
339-
return 0L;
340-
}
341-
342-
void event_supplier::dispatch_events() const {}
343-
344345
//WEBSERVER CREATOR
345346
create_webserver& create_webserver::https_mem_key(const std::string& https_mem_key)
346347
{
@@ -654,7 +655,7 @@ void* webserver::select(void* self)
654655
}
655656

656657
{
657-
std::map<std::string, event_supplier*>::const_iterator it;
658+
std::map<std::string, event_tuple*>::const_iterator it;
658659
pthread_rwlock_rdlock(&di->ws->runguard);
659660
for(it = di->ws->event_suppliers.begin(); it != di->ws->event_suppliers.end(); ++it)
660661
{
@@ -704,7 +705,7 @@ void* webserver::select(void* self)
704705
::select (max + 1, &rs, &ws, &es, &timeout_value);
705706
MHD_run (di->daemon);
706707
{
707-
std::map<std::string, event_supplier*>::const_iterator it;
708+
std::map<std::string, event_tuple*>::const_iterator it;
708709
pthread_rwlock_rdlock(&di->ws->runguard);
709710
for(it = di->ws->event_suppliers.begin(); it != di->ws->event_suppliers.end(); ++it)
710711
{
@@ -1866,10 +1867,27 @@ void webserver::get_response(cache_entry* ce, http_response** res)
18661867
*res = ce->response.ptr();
18671868
}
18681869

1869-
void webserver::register_event_supplier(const std::string& id, event_supplier* ev)
1870+
template<typename T>
1871+
void webserver::register_event_supplier(const std::string& id, event_supplier<T>* ev)
1872+
{
1873+
pthread_rwlock_wrlock(&runguard);
1874+
map<string, event_tuple*>::iterator it = event_suppliers.find(id);
1875+
if(it != event_suppliers.end())
1876+
delete it->second;
1877+
event_suppliers[id] = new event_tuple(&ev);
1878+
pthread_rwlock_unlock(&runguard);
1879+
}
1880+
1881+
void webserver::remove_event_supplier(const std::string& id)
18701882
{
18711883
pthread_rwlock_wrlock(&runguard);
1872-
event_suppliers[id] = ev;
1884+
map<string, event_tuple*>::iterator it = event_suppliers.find(id);
1885+
if(it != event_suppliers.end())
1886+
{
1887+
event_tuple* evp(it->second);
1888+
event_suppliers.erase(it);
1889+
delete evp;
1890+
}
18731891
pthread_rwlock_unlock(&runguard);
18741892
}
18751893

0 commit comments

Comments
 (0)