Het gaat om een applicatie die domotica kan regelen. Kort gezegd handelt deze events (indien 2 poort 2 op module 3 hoog is) af op basis van policies, welke weer acties genereert (poort 1 op module 10 aan). Voordat ik het wil releasen (0.1) zit ik nog met een paar dingen die ik nog niet netjes heb uitgewerkt.
Op dit moment is er 1 shared library (lib) en een executable (app) en een tiental modules die on the fly kunnen worden geladen (libtool). Een voorbeeld van een module is een driver om I/O poorten aan te sturen, er zijn ook webinterfaces e.d..
Nu is het zo dat er binnen de daemon (als proces) een config-object wordt aangemaakt. Hier worden bijvoorbeeld basale zaken als het hoofdpad van de applicatie, lijst met modules e.d. in bijgehouden. Daarnaast zijn er een aantal controllers die de verschillende objecten beheren. Een kort voorbeeldje om een idee te hebben:
Het probleem is dat die lpdConfig eigenlijk een soort van shared memory is. Na wat gekloot met extern heb ik uiteindelijk besloten om gewoon een pointer naar dit object mee te geven als de controllers worden aangemaakt.
Allereerst ben ik eigenlijk niet tevreden met de huidige opzet van het doorgeven van de lpdConfig. In mijn ogen vervuild dit te applicatie met allemaal loze verwijzingen als:
Nu ben ik bezig geweest om met het extern keyword aan de slag te gaan en hiermee bijvoorbeeld een extern lpdConfig *shared_config neer te zetten in de lpdconfig.h. Probleem is echter dat ik dus gebruik maak van libtool en pthreads en voor zover ik het kunnen overzien kan je van libraries die je dynamisch laadt via libtool niet variabelen aan laten spreken gedeclareerd met het extern keyword. Daar heb ik dus een wrapper gemaakt die de pointer naar het configuratieobject doorgeeft (werkt verder perfect).
Wat is dus eigenlijk een nette manier om een gedeeld object te hebben tussen alle modules. Met daarbij niet het risico dat omdat module X bijvoorbeeld een speciale externe library nodig heeft (libxml++ ofzo) dat alle modules daartegen moeten worden gelinked.
Op dit moment is er 1 shared library (lib) en een executable (app) en een tiental modules die on the fly kunnen worden geladen (libtool). Een voorbeeld van een module is een driver om I/O poorten aan te sturen, er zijn ook webinterfaces e.d..
Nu is het zo dat er binnen de daemon (als proces) een config-object wordt aangemaakt. Hier worden bijvoorbeeld basale zaken als het hoofdpad van de applicatie, lijst met modules e.d. in bijgehouden. Daarnaast zijn er een aantal controllers die de verschillende objecten beheren. Een kort voorbeeldje om een idee te hebben:
C++:
Met de modulecontroller is het bijvoorbeeld mogelijk om te zoeken naar nieuwe modules, zo zijn er nog een aantal.1
2
3
4
5
6
7
8
9
10
11
12
13
| class lpdConfig{ public: lpdConfig(); ~lpdConfig(); lpdModuleList modules; lpdDeviceList devices; lpdModuleController *modulecontroller; lpdDeviceController *devicecontroller; std::string approot; }; |
Het probleem is dat die lpdConfig eigenlijk een soort van shared memory is. Na wat gekloot met extern heb ik uiteindelijk besloten om gewoon een pointer naar dit object mee te geven als de controllers worden aangemaakt.
C++:
Kort gezegd is eigenlijk elke class verantwoordelijk voor zijn eigen geheugenmanagement. Ik ben bezig om dit consequent door te voeren.1
2
3
4
5
6
7
8
9
10
11
12
| lpdConfig::lpdConfig() { modulecontroller = new lpdModuleController(this); devicecontroller = new lpdDeviceController(this); } lpdConfig::~lpdConfig() { for(lpdModuleList::iterator iter = modules.begin(); iter != modules.end(); iter++) { delete *iter; } for(lpdDeviceList::iterator iter = devices.begin(); iter != devices.end(); iter++) { delete *iter; } delete modulecontroller; delete devicecontroller; } |
Allereerst ben ik eigenlijk niet tevreden met de huidige opzet van het doorgeven van de lpdConfig. In mijn ogen vervuild dit te applicatie met allemaal loze verwijzingen als:
C++:
Eigenlijk elk object moet die lpdConfig (pointer) lokaal 'cachen'.1
2
3
4
5
| lpdModuleController::lpdModuleController(lpdConfig *config) : lpdSuperController(config) lpdSuperController::lpdSuperController(lpdConfig *oConfig) { this->oCfg = oConfig; } |
Nu ben ik bezig geweest om met het extern keyword aan de slag te gaan en hiermee bijvoorbeeld een extern lpdConfig *shared_config neer te zetten in de lpdconfig.h. Probleem is echter dat ik dus gebruik maak van libtool en pthreads en voor zover ik het kunnen overzien kan je van libraries die je dynamisch laadt via libtool niet variabelen aan laten spreken gedeclareerd met het extern keyword. Daar heb ik dus een wrapper gemaakt die de pointer naar het configuratieobject doorgeeft (werkt verder perfect).
Wat is dus eigenlijk een nette manier om een gedeeld object te hebben tussen alle modules. Met daarbij niet het risico dat omdat module X bijvoorbeeld een speciale externe library nodig heeft (libxml++ ofzo) dat alle modules daartegen moeten worden gelinked.
Inkoopacties - HENK terug! - Megabit
It is a war here, so be a general!