#ifndef DatenModul_hpp
#define DatenModul_hpp
#include <string>
#include <map>
#include <boost/thread.hpp>
#include "Modul.hpp"
class DatenModul
{
public:
DatenModul(int);
void anmeldenModul(Modul*);
void eintragenDaten(std::string);
Modul* abfragenDaten(std::string);
std::string abfragenModul(boost::thread::id);
bool bereit();
protected:
std::map< boost::thread::id, Modul* > ModuleListe;
std::map< std::string, boost::thread::id > DatenZuModulListe;
int AnzahlModule;
int bereiteModule;
boost::mutex DatenZuModulListeMutex;
boost::mutex ModulListeMutex;
boost::condition_variable_any DatenZuModulListeEintrag;
boost::condition_variable_any DatenModulBereit;
};
#endif
#include "DatenModul.hpp"
#include "GlobaleFunktionen.cpp"
DatenModul::DatenModul(int i) : AnzahlModule(i) {};
void DatenModul::anmeldenModul(Modul* M)
{
std::cout << "A" << std::endl;
boost::lock_guard<boost::mutex> lock(ModulListeMutex);
std::cout << "B" << std::endl;
boost::thread::id ID = boost::this_thread::get_id();
std::cout << "C " << ID << std::endl;
ModuleListe.insert( std::make_pair( ID, M ) );
//ModuleListe[ID]=M;
#ifdef DEBUG
std::stringstream ausgabe;
ausgabe << "Datenmodul: " << abfragenModul(ID) << " hat sich angemeldet";
debugging(ausgabe.str());
#endif
};
std::string DatenModul::abfragenModul(boost::thread::id ID)
{
boost::lock_guard<boost::mutex> lock(ModulListeMutex);
std::map< boost::thread::id, Modul* >::iterator i;
i = ModuleListe.find(ID);
if( i==ModuleListe.end() ) return "NICHT GEFUNDEN!";
else return i->second->Modulname;
};
void DatenModul::eintragenDaten(std::string D)
{
boost::lock_guard<boost::mutex> lock(DatenZuModulListeMutex);
boost::thread::id ID = boost::this_thread::get_id();
DatenZuModulListe[D]=ID;
DatenZuModulListeEintrag.notify_all();
#ifdef DEBUG
std::stringstream ausgabe;
ausgabe << "Datenmodul: " << abfragenModul(ID) << " hat sich für " << D << " eingetragen.";
debugging(ausgabe.str());
#endif
};
Modul* DatenModul::abfragenDaten(std::string D)
{
boost::lock_guard<boost::mutex> lock(DatenZuModulListeMutex);
std::map< std::string, boost::thread::id >::iterator i;
i = DatenZuModulListe.find(D);
while( i==DatenZuModulListe.end() )
{
#ifdef DEBUG
std::stringstream ausgabe;
ausgabe << "Datenmodul: " << abfragenModul(boost::this_thread::get_id()) << " hat ERFOLGLOS das Erstellermodul von " << D << " abgefragt. Warte auf Eintrag!";
debugging(ausgabe.str());
#endif
DatenZuModulListeEintrag.wait(DatenZuModulListeMutex);
i = DatenZuModulListe.find(D);
}
{
boost::lock_guard<boost::mutex> lock(ModulListeMutex);
std::map< boost::thread::id, Modul* >::iterator i2;
i2 = ModuleListe.find(i->second);
if( i2==ModuleListe.end() )
{
#ifdef DEBUG
std::stringstream ausgabe;
ausgabe << "Datenmodul: FEHLER i2==ModuleListe.end()";
debugging(ausgabe.str());
#endif
}
else
{
#ifdef DEBUG
std::stringstream ausgabe;
ausgabe << "Datenmodul: " << abfragenModul(boost::this_thread::get_id()) << " hat das Erstellermodul von " << D << " abgefragt.";
debugging(ausgabe.str());
#endif
return i2->second;
}
}
};
bool DatenModul::bereit()
{
boost::lock_guard<boost::mutex> lock(ModulListeMutex);
++bereiteModule;
#ifdef DEBUG
std::stringstream ausgabe;
ausgabe << "Datenmodul: " << abfragenModul(boost::this_thread::get_id()) << " ist bereit. " << bereiteModule << " von "<< AnzahlModule << " Modulen sind bereit.";
debugging(ausgabe.str());
#endif
if( bereiteModule==AnzahlModule)
{
DatenModulBereit.notify_all();
}
while( bereiteModule!=AnzahlModule ) DatenModulBereit.wait(ModulListeMutex);
return true;
}