Salome HOME
Issue #273: Add copyright string
[modules/shaper.git] / src / Events / Events_LongOp.cpp
1 // Copyright (C) 2014-20xx CEA/DEN, EDF R&D
2
3 // File:        Events_LongOp.cpp
4 // Created:     29 Jul 2014
5 // Author:      Mikhail PONIKAROV
6
7 #include <Events_LongOp.h>
8 #include <Events_Loop.h>
9
10 /// senders of the long operation collected, ends the long operation event only
11 /// if all senders are stopped
12 std::map<void*, int> MY_SENDERS;
13
14 Events_LongOp::Events_LongOp(void* theSender)
15     : Events_Message(Events_LongOp::eventID(), theSender)
16 {
17 }
18
19 Events_LongOp::~Events_LongOp()
20 {
21 }
22
23 Events_ID Events_LongOp::eventID()
24 {
25   Events_Loop* aLoop = Events_Loop::loop();
26   return aLoop->eventByName("LongOperation");
27 }
28
29 void Events_LongOp::start(void* theSender)
30 {
31   bool toSend = MY_SENDERS.empty();
32   if (MY_SENDERS.find(theSender) == MY_SENDERS.end())
33     MY_SENDERS[theSender] = 1;
34   else
35     MY_SENDERS[theSender]++;
36
37   if (toSend) {
38     std::shared_ptr<Events_Message> aNewOne = 
39       std::shared_ptr<Events_Message>(new Events_LongOp(theSender));
40     Events_Loop::loop()->send(aNewOne);
41   }
42 }
43
44 void Events_LongOp::end(void* theSender)
45 {
46   if (MY_SENDERS.find(theSender) != MY_SENDERS.end()) {
47     int aCount = MY_SENDERS[theSender];
48     if (aCount <= 1)
49       MY_SENDERS.erase(theSender);
50     else
51       MY_SENDERS[theSender] = aCount - 1;
52   }
53   if (MY_SENDERS.empty()) {
54     std::shared_ptr<Events_Message> aNewOne = 
55       std::shared_ptr<Events_Message>(new Events_LongOp(theSender));
56     Events_Loop::loop()->send(aNewOne);
57   }
58 }
59
60 bool Events_LongOp::isPerformed()
61 {
62   return !MY_SENDERS.empty();
63 }