blocxx
SelectEngine.cpp
Go to the documentation of this file.
1/*******************************************************************************
2* Copyright (C) 2005, Vintela, Inc. All rights reserved.
3* Copyright (C) 2006, Novell, Inc. All rights reserved.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7*
8* * Redistributions of source code must retain the above copyright notice,
9* this list of conditions and the following disclaimer.
10* * Redistributions in binary form must reproduce the above copyright
11* notice, this list of conditions and the following disclaimer in the
12* documentation and/or other materials provided with the distribution.
13* * Neither the name of
14* Vintela, Inc.,
15* nor Novell, Inc.,
16* nor the names of its contributors or employees may be used to
17* endorse or promote products derived from this software without
18* specific prior written permission.
19*
20* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30* POSSIBILITY OF SUCH DAMAGE.
31*******************************************************************************/
32
33
39#include "blocxx/BLOCXX_config.h"
41#include "blocxx/Select.hpp"
43#include "blocxx/Timeout.hpp"
45
46namespace BLOCXX_NAMESPACE
47{
48
51void
54{
55 m_table.insert(std::make_pair(obj, Data(cb, eventType)));
56}
57
59bool
64
66void
68{
69 TimeoutTimer timer(timeout);
70 timer.start();
71 m_stopFlag = false;
72 do
73 {
76 for (citer_t iter = m_table.begin(); iter != m_table.end(); ++iter)
77 {
78 Select::SelectObject so(iter->first);
79 if (iter->second.eventType & SelectableCallbackIFC::E_READ_EVENT)
80 {
81 so.waitForRead = true;
82 }
83 if (iter->second.eventType & SelectableCallbackIFC::E_WRITE_EVENT)
84 {
85 so.waitForWrite = true;
86 }
87 selObjs.push_back(so);
88 }
89
90 if (selObjs.empty())
91 {
92 return;
93 }
94
95 int selected = Select::selectRW(selObjs, timer.asTimeout());
96 if (selected == Select::SELECT_ERROR)
97 {
99 }
100 else if (selected == Select::SELECT_TIMEOUT)
101 {
102 BLOCXX_THROW(SelectException, "Select Timeout");
103 }
104 else
105 {
106 for (size_t i = 0; i < selObjs.size() && selected > 0; ++i)
107 {
108 const Select::SelectObject& selObj(selObjs[i]);
109 if (selObj.readAvailable || selObj.writeAvailable)
110 {
111 --selected;
113 iter_t iter = m_table.find(selObj.s);
114 if (selObj.readAvailable)
115 {
116 iter->second.callback->selected(iter->first, SelectableCallbackIFC::E_READ_EVENT);
117 }
118 if (selObj.writeAvailable)
119 {
120 iter->second.callback->selected(iter->first, SelectableCallbackIFC::E_WRITE_EVENT);
121 }
122 }
123 }
124 }
125 timer.resetOnLoop();
126 } while (!m_stopFlag);
127}
129void
131{
132 m_stopFlag = true;
133}
134
138 , m_engine(engine)
139{
140}
141
143void
145{
146 m_engine.stop();
147}
148
149} // end namespace BLOCXX_NAMESPACE
150
#define BLOCXX_DEFINE_EXCEPTION_WITH_ID(NAME)
Define a new exception class named <NAME>Exception that derives from Exception.
#define BLOCXX_THROW(exType, msg)
Throw an exception using FILE and LINE.
#define BLOCXX_THROW_ERRNO_MSG(exType, msg)
Throw an exception using FILE, LINE, errno and strerror(errno)
ThreadDoneCallbackRef cb
Definition Thread.cpp:84
Array<> wraps std::vector<> in COWReference<> adding ref counting and copy on write capability.
Definition ArrayFwd.hpp:46
void push_back(const T &x)
Append an element to the end of the Array.
size_type size() const
bool removeSelectableObject(const Select_t &obj, SelectableCallbackIFC::EEventType eventType)
return indicates if obj was removed
void addSelectableObject(const Select_t &obj, const SelectableCallbackIFCRef &cb, SelectableCallbackIFC::EEventType eventType)
Add an object to the set.
void go(const Timeout &timeout)
SortedVectorMap< Select_t, Data > m_table
virtual void doSelected(Select_t &selectedObject, EEventType eventType)
SelectEngineStopper(SelectEngine &engine)
container_t::const_iterator const_iterator
A timeout can be absolute, which means that it will happen at the specified DateTime.
Definition Timeout.hpp:56
A TimeoutTimer is used by an algorithm to determine when a timeout has expired.
void start()
Meant to be called by timeout functions which loop.
void resetOnLoop()
Meant to be called by timeout functions which loop, and that want to reset the interval.
const int SELECT_TIMEOUT
The value returned from select when the timeout value has expired.
Definition Select.hpp:59
int selectRW(SelectObjectArray &selarray, UInt32 ms)
Definition Select.cpp:92
const int SELECT_ERROR
The value returned from select when any error occurs other than timeout.
Definition Select.hpp:63
Taken from RFC 1321.
bool waitForRead
Input parameter. Set it to true to indicate that waiting for read availability on s is desired.
Definition Select.hpp:103
bool writeAvailable
Ouput parameter. Will be set to true to indicate that s has become available for writing.
Definition Select.hpp:109
bool waitForWrite
Input parameter. Set it to true to indicate that waiting for write availability on s is desired.
Definition Select.hpp:105
bool readAvailable
Ouput parameter. Will be set to true to indicate that s has become available for reading.
Definition Select.hpp:107