summaryrefslogtreecommitdiff
path: root/TAO/tao/GUIResource_Factory.cpp
blob: ae586a57a99b8fad7f818864d77f4823d8d3cb02 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
//$Id$
#include "tao/GUIResource_Factory.h"
#include "ace/Reactor.h"
#include "tao/debug.h"

namespace TAO
{
  GUIResource_Factory::GUIResource_Factory ():
    dynamically_allocated_reactor_ (0)
  {
  }

  GUIResource_Factory::~GUIResource_Factory ()
  {
  }

  ACE_Reactor *
  GUIResource_Factory::get_reactor (void)
  {
    // @@Marek, do we need a lock here??
    // @Bala, I suppose we don't need locking for any
    //   reasonable use case as this
    //   factory is intended to be a variable in TSS.
    //   I can imagine that    someone may try to use it in distinct
    //   threads, though I do not know
    //   what for. Nevertheless, just for a case  I sync the creation of reactor.
    //   I think, that double checked locking is
    //   not necessary, because the performance is not an issue here.
    ACE_GUARD_RETURN (TAO_SYNCH_MUTEX, ace_mon, this->lock_, 0);

    ACE_Reactor *reactor = 0;
    ACE_NEW_RETURN (reactor,
                    ACE_Reactor (this->reactor_impl (), 1),
                    0);

    if (reactor->initialized () == 0)
    {
      delete reactor;
      reactor = 0;
    }
    else
      this->dynamically_allocated_reactor_ = 1;

    return reactor;
  }

  void
  GUIResource_Factory::reclaim_reactor (ACE_Reactor *reactor)
  {
    ACE_GUARD ( TAO_SYNCH_MUTEX, ace_mon, this->lock_ );

    if (this->dynamically_allocated_reactor_ == 1)
      delete reactor;
  }
}