I3MUP1+-+Exercise+7.2

= Exercise 7.2 - The abstract OS API =

Exercise 1
- De data som ønskes sendt pakkes ind i en klasse. - Mellem input og storage thread anvendes en besked kø. - Jeg får info tråden til at vente ved hjælp at en sleep timer, - Ved brug af mutexes sikre jeg at kun en har adgang til data'en ad gangen.

Exercise 3
Først laver vi nogle beskeder som skal kunde sendes. De arver fra osapi::Message code format="cpp" class Person : public osapi::Message { public: string name_; string cpr_; }; code Input er en tråd og arver derfor fra osapi::Thread. Den blev implementeret ved at sætte pointeren til Storages msgQueue i constructoren. code format="cpp" Input::Input(osapi::MsgQueue* mq) : mq_(mq) {} code Derefter bruges køen med send. Da input er en tråd, skal run implementeres, og i det her tilfælde bruges den til at få input og kalder nedenstående funktion code format="cpp" void Input::sendMsg(string name, string cpr) {   if(validateCPR(cpr) && validateName(name)) {       Person *msg_to_send = new Person; msg_to_send->name_ = name; msg_to_send->cpr_ = cpr; mq_->send(PERSON,msg_to_send); } } code Storage run funktion bruges på at modtage beskeder og gemme dem. Der anvendes Mutexes i både set og get funktionerne. code format="cpp" void Storage::run {   unsigned long id; while(1) {       osapi::Message* msg = mq_.receive(id); handleMsg(msg, id); delete msg; } }

void Storage::setPerson(Person *data) {   dataMut_.lock;

person_.name_ = data->name_; person_.cpr_ = data->cpr_;

dataMut_.unlock; } code Info tråden venter 3 sekunder ved hjælp af osapi sleep funktion i . læser og tester derefter om data'en er ny. code format="cpp" void Info::run {	while(1) {		osapi::sleep(3000);

Person person = storage_->getPerson; if(latestPerson_.cpr_ != person.cpr_ || latestPerson_.name_ != person.name_) {			latestPerson_ = person; cout << "Name: " << latestPerson_.name_ << "\tcpr: " << latestPerson_.cpr_ << endl; }	} } code Med en overloaded != operator eller vores message værende en struct i stedet vil sammenligning være nemmere. Alle trådene skal startes og det gøres i vores main. En sleep indsættes, så programmet ikke ryger ud af scope. code format="cpp" int main {	Storage storage; Input input(storage.getMsgQueue); Info info(storage.getStorage);

storage.start; input.start; info.start;

while(1) osapi::sleep(100);

return 0; } code

Exercise 4
For at ændre systemet skal der implementeres en ny message Car. samt passende set og get funktioner som beskytter dataen. info tråden skal derudover have en anden print besked.