4
* Copyright (C) 2010 Eric Day (eday@oddments.org)
7
* Use and distribution licensed under the BSD license. See the
8
* COPYING file in the root project directory for full text.
13
* @brief libevent Event Service Provider Definitions
22
#include <scalestack/event/service.h>
23
#include <scalestack/event/libevent/handler_provider.h>
24
#include <scalestack/event/libevent/service_provider.h>
25
#include <scalestack/event/libevent/thread.h>
26
#include <scalestack/kernel/module.h>
27
#include <scalestack/kernel/option.h>
42
service_provider::service_provider(kernel::module& module):
43
event::service_provider(module),
47
size_t thread_count = _module.get_option("threads").get_size_value();
48
if (thread_count == 0)
49
_module.log_fatal("The 'threads' option must be greater than 0");
51
for (size_t thread_index = 0; thread_index < thread_count; thread_index++)
53
thread* new_thread = NULL;
56
new_thread = new thread(*this, thread_index);
57
_threads.push_back(new_thread);
61
if (new_thread != NULL)
73
service_provider::~service_provider()
78
void service_provider::add_handler(event::handler* handler)
80
handler_provider* new_handler_provider = new handler_provider(_module);
83
new_handler_provider->set_handler(handler);
85
/* Choose assigned thread by round-robin. */
87
new_handler_provider->set_thread(_threads[_current_thread % _threads.size()]);
91
delete new_handler_provider;
96
void service_provider::remove_handler_provider(handler_provider* handler_provider)
98
remove_handler(handler_provider->get_handler());
99
delete handler_provider;
106
void service_provider::_remove_threads(void)
108
for_each(_threads.begin(), _threads.end(), mem_fun(&thread::stop));
110
for (vector<thread*>::iterator thread = _threads.begin();
111
thread != _threads.end();
118
} /* namespace libevent */
119
} /* namespace event */
120
} /* namespace scalestack */