FD_ZERO(&writefds);
FD_ZERO(&exceptfds);
- for (list<Socket::WeakPtr>::iterator i = Socket::Sockets.begin(); i != Socket::Sockets.end(); i++) {
+ for (Socket::CollectionType::iterator i = Socket::Sockets.begin(); i != Socket::Sockets.end(); i++) {
Socket::Ptr socket = i->lock();
if (socket == NULL)
EventArgs ea;
ea.Source = shared_from_this();
- list<Socket::WeakPtr>::iterator prev, i;
+ Socket::CollectionType::iterator prev, i;
for (i = Socket::Sockets.begin(); i != Socket::Sockets.end(); ) {
prev = i;
i++;
#include <memory>
#include <string>
#include <vector>
+#include <set>
#include <iostream>
#include <list>
#include <typeinfo>
using namespace icinga;
-list<Socket::WeakPtr> Socket::Sockets;
+Socket::CollectionType Socket::Sockets;
Socket::Socket(void)
{
OnException += bind_weak(&Socket::ExceptionEventHandler, shared_from_this());
- Sockets.push_front(static_pointer_cast<Socket>(shared_from_this()));
+ Sockets.insert(static_pointer_cast<Socket>(shared_from_this()));
}
void Socket::Stop(void)
{
- Sockets.remove_if(weak_ptr_eq_raw<Socket>(this));
+ Socket::Ptr self = static_pointer_cast<Socket>(shared_from_this());
+ Socket::CollectionType::iterator i = Sockets.find(self);
+
+ if (i != Sockets.end())
+ Sockets.erase(i);
}
void Socket::SetFD(SOCKET fd)
void Socket::CloseAllSockets(void)
{
- for (list<Socket::WeakPtr>::iterator i = Sockets.begin(); i != Sockets.end(); ) {
+ for (Socket::CollectionType::iterator i = Sockets.begin(); i != Sockets.end(); ) {
Socket::Ptr socket = i->lock();
i++;
typedef shared_ptr<Socket> Ptr;
typedef weak_ptr<Socket> WeakPtr;
- static list<Socket::WeakPtr> Sockets;
+ typedef set< Socket::WeakPtr, owner_less<Socket::WeakPtr> > CollectionType;
+
+ static Socket::CollectionType Sockets;
~Socket(void);
Close();
return;
}
-
- Start();
}
int TCPServer::ReadableEventHandler(const EventArgs& ea)
fd = accept(GetFD(), (sockaddr *)&addr, &addrlen);
if (fd == INVALID_SOCKET) {
-#ifdef _WIN32
- if (WSAGetLastError() == WSAEWOULDBLOCK)
-#else /* _WIN32 */
- if (errno == EINPROGRESS)
-#endif /* _WIN32 */
- return 0;
-
SocketErrorEventArgs sea;
#ifdef _WIN32
sea.Code = WSAGetLastError();
using namespace icinga;
time_t Timer::NextCall;
-list<Timer::WeakPtr> Timer::Timers;
+Timer::CollectionType Timer::Timers;
Timer::Timer(void)
{
/* Make sure we wake up at least once every 30 seconds */
NextCall = time(NULL) + 30;
- for (list<Timer::WeakPtr>::iterator i = Timers.begin(); i != Timers.end(); i++) {
+ for (Timer::CollectionType::iterator i = Timers.begin(); i != Timers.end(); i++) {
Timer::Ptr timer = i->lock();
if (timer == NULL)
time(&now);
- for (list<Timer::WeakPtr>::iterator i = Timers.begin(); i != Timers.end(); ) {
+ for (Timer::CollectionType::iterator i = Timers.begin(); i != Timers.end(); ) {
Timer::Ptr timer = Timer::Ptr(*i);
i++;
void Timer::StopAllTimers(void)
{
- for (list<Timer::WeakPtr>::iterator i = Timers.begin(); i != Timers.end(); ) {
+ for (Timer::CollectionType::iterator i = Timers.begin(); i != Timers.end(); ) {
Timer::Ptr timer = i->lock();
i++;
void Timer::Start(void)
{
- Stop();
-
- Timers.push_front(static_pointer_cast<Timer>(shared_from_this()));
+ Timers.insert(static_pointer_cast<Timer>(shared_from_this()));
Reschedule(time(NULL) + m_Interval);
}
void Timer::Stop(void)
{
- Timers.remove_if(weak_ptr_eq_raw<Timer>(this));
+ Timer::Ptr self = static_pointer_cast<Timer>(shared_from_this());
+ Timer::CollectionType::iterator i = Timers.find(self);
+
+ if (i != Timers.end())
+ Timers.erase(i);
}
void Timer::Reschedule(time_t next)
typedef shared_ptr<Timer> Ptr;
typedef weak_ptr<Timer> WeakPtr;
- static list<Timer::WeakPtr> Timers;
+ typedef set< Timer::WeakPtr, owner_less<Timer::WeakPtr> > CollectionType;
+
+ static Timer::CollectionType Timers;
Timer(void);
map<string, Event<NewRequestEventArgs> >::iterator i = m_MethodHandlers.find(method);
if (i == m_MethodHandlers.end())
- throw InvalidArgumentException();
+ return;
NewRequestEventArgs nrea;
nrea.Source = shared_from_this();