app component inherits from core component. OamModule uses name instead of class...
[anna.git] / include / anna / core / mt / ThreadData.hpp
1 // ANNA - Anna is Not Nothingness Anymore                                                         //
2 //                                                                                                //
3 // (c) Copyright 2005-2015 Eduardo Ramos Testillano & Francisco Ruiz Rayo                         //
4 //                                                                                                //
5 // See project site at http://redmine.teslayout.com/projects/anna-suite                           //
6 // See accompanying file LICENSE or copy at http://www.teslayout.com/projects/public/anna.LICENSE //
7
8
9 #ifndef anna_core_mt_ThreadData_hpp
10 #define anna_core_mt_ThreadData_hpp
11
12 #ifdef _MT
13 #include <map>
14 #include <anna/core/mt/NRMutex.hpp>
15 #include <anna/core/functions.hpp>
16 #include <anna/core/tracing/Logger.hpp>
17 #endif
18
19 namespace anna {
20
21 /**
22    Template que facilita la creacion de datos dependientes del Thread.
23    \see anna::Thread
24
25    \param T Clase asociada a este repositorio, debe tener un constructor vacio.
26 */
27 template <typename T> class ThreadData {
28 public:
29   /**
30      Contructor.
31      \param name Nombre logico de esta template.
32   */
33   ThreadData(const char* name) : a_name(name) {;}
34
35   /**
36      Devuelve los datos asociados al thread desde el que se invoca  a este metodo.
37       Si no existen se crean mediante el contructor vacio.
38      \return Los datos asociados al thread desde el que se invoca  a este metodo.
39   */
40   T& get() throw() {
41 #ifndef _MT
42     return a_data;
43 #else
44     Guard guard(a_mutex, "anna::ThreadData");
45     const int index = (int) functions::getCurrentThread();
46     data_iterator ii = a_datas.find(index);
47     T* result = NULL;
48
49     if(ii == a_datas.end()) {
50       result = new T;
51       a_datas.insert(value_type(index, result));
52     } else
53       result = ii->second;
54
55     LOGDEBUG(
56       std::string msg("anna::ThreadData { Name: ");
57       msg += a_name;
58       msg += " | ";
59       msg += functions::asHexString(anna_ptrnumber_cast(result));
60       msg += " }";
61       Logger::debug(msg, ANNA_FILE_LOCATION);
62     );
63     return *result;
64 #endif
65   }
66
67 private:
68 #ifndef _MT
69   T a_data;
70   const char* a_name;
71 #else
72   typedef typename std::map <int, T*> container;
73   typedef typename container::iterator data_iterator;
74   typedef typename container::value_type value_type;
75   NRMutex a_mutex;
76   container a_datas;
77   const char* a_name;
78 #endif
79 };
80 }
81
82 #endif
83