1 // ANNA - Anna is Not Nothingness Anymore
3 // (c) Copyright 2005-2014 Eduardo Ramos Testillano & Francisco Ruiz Rayo
5 // http://redmine.teslayout.com/projects/anna-suite
7 // Redistribution and use in source and binary forms, with or without
8 // modification, are permitted provided that the following conditions
11 // * Redistributions of source code must retain the above copyright
12 // notice, this list of conditions and the following disclaimer.
13 // * Redistributions in binary form must reproduce the above
14 // copyright notice, this list of conditions and the following disclaimer
15 // in the documentation and/or other materials provided with the
17 // * Neither the name of the copyright holder nor the names of its
18 // contributors may be used to endorse or promote products derived from
19 // this software without specific prior written permission.
21 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33 // Authors: eduardo.ramos.testillano@gmail.com
34 // cisco.tierra@gmail.com
37 #ifndef anna_comm_ReceiverFactory_hpp
38 #define anna_comm_ReceiverFactory_hpp
40 #include <anna/core/RuntimeException.hpp>
41 #include <anna/core/mt/Mutex.hpp>
42 #include <anna/config/defines.hpp>
55 Interface for receivers factories.
57 Is recommended (performance issues) to use #Recycler<T> as in the following example:
63 class MyReceiverFactory : public ReceiverFactory {
65 MyReceiverFactory () : ReceiverFactory ("MyReceiverFactory") {;}
68 anna::Recycler<MyReceiver> a_receivers;
70 Receiver* do_create () throw () { return a_receivers.create (); }
71 void do_release (Receiver* receiver) throw () { a_receivers.release (static_cast <MyReceiver*> (receiver)); }
76 In most of cases, is recommended to use an comm::ReceiverFactoryImpl instance with the receiver type used in our application.
79 \see ReceiverFactoryImpl
81 class ReceiverFactory : public Mutex {
84 Returns the logical name for this receiver factory.
85 @return logical name for this receiver factory.
87 const std::string& getName() const throw() { return a_name; }
90 Creates a receiver instance for this factory. Reuse resources when needed.
92 \return The new receiver instance.
93 \warning All the receivers obtained shall be released by mean #release.
95 Receiver* create() throw(RuntimeException);
98 Release the receiver instance provided.
100 \return The receiver instance to be released.
101 \warning The parameter should have been obtained by mean #create.
103 void release(Receiver* receiver) throw();
106 Returns a string with relevant information for this instance.
107 @return string with relevant information for this instance.
109 std::string asString() const
111 std::string msg("anna::comm::ReceiverFactory { Name: ");
117 Returns a XML document with relevant information for this instance.
118 \param parent XML node from which created data will depend on.
119 @return a XML document with relevant information for this instance.
121 xml::Node* asXML(xml::Node* parent) const throw();
126 \param name Logical name for this receivers factory.
128 ReceiverFactory(const char* name);
131 Creates the receiver instance if no other reusable instance is found. This method is
132 called from a critical section activated for this instance.
134 \return The new receiver instance.
135 \warning All the receivers obtained shall be released by mean #release.
137 virtual Receiver* do_create() throw() = 0;
140 Release the receiver provided. This method is called from a critical section activated
143 \param The receiver instance to be released.
145 virtual void do_release(Receiver* receiver) throw() = 0;
148 const std::string a_name;
150 ReceiverFactory(const ReceiverFactory&);
152 WHEN_SINGLETHREAD(Receiver* a_receiver;)