summaryrefslogtreecommitdiff
path: root/examples/APG/ThreadSafety/RW_Lock.cpp
blob: 83f1287bbdb8d1271cc1561d6d6cf84d6effbc62 (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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
// $Id$

#include "ace/config-lite.h"
#if defined (ACE_HAS_THREADS)

#include "ace/Synch.h"
#include "ace/Containers.h"
#include "ace/Task.h"

class Device
{
public:
  Device (int id) : id_(id)
  { }

  int id_;
};

typedef ACE_DLList<Device> DeviceList;
typedef ACE_DLList_Iterator<Device> DeviceListIterator;

// Listing 1 code/ch14
class HA_DiscoveryAgent
{
public:
  void add_device (Device *device)
  {
    ACE_WRITE_GUARD (ACE_RW_Thread_Mutex, mon, rwmutex_);
    list_add_item_i (device);
  }

  void remove_device (Device *device)
  {
    ACE_READ_GUARD (ACE_RW_Thread_Mutex, mon, rwmutex_);
    list_remove_item_i(device);
  }

  int contains_device (Device *device)
  {
    ACE_READ_GUARD_RETURN
      (ACE_RW_Thread_Mutex, mon, rwmutex_, -1);
    return list_contains_item_i (device);
  }

private:
  void list_add_item_i (Device * device);
  int list_contains_item_i (Device * device);
  void list_remove_item_i (Device* device);

private:
  DeviceList deviceList_;
  ACE_RW_Thread_Mutex rwmutex_;
};
// Listing 1

void
HA_DiscoveryAgent::list_add_item_i (Device *device)
{
  deviceList_.insert_tail (device);
}

int
HA_DiscoveryAgent::list_contains_item_i (Device *device)
{
  DeviceListIterator iter (deviceList_);
  while (!iter.done ())
    {
      if (iter.next () == device)
        return 1;
      iter++;
    }

  return 0;
}

void
HA_DiscoveryAgent::list_remove_item_i (Device *device)
{
  DeviceListIterator iter (deviceList_);
  while (!iter.done ())
    {
      if (iter.next () == device)
        {
          iter.remove ();
          break;
        }
      iter++;
    }
}

static Device *devices[100];

class Runner : public ACE_Task_Base
{
public:
  Runner(HA_DiscoveryAgent &agent) : agent_(agent)
  { }

  virtual int svc (void)
  {
    ACE_ASSERT(agent_.contains_device(devices[9]) == 1);
    agent_.remove_device (devices[9]);
    ACE_ASSERT(agent_.contains_device(devices[9]) == 0);
    return 0;
  }

private:
  HA_DiscoveryAgent &agent_;
};

int ACE_TMAIN (int, ACE_TCHAR *[])
{
  HA_DiscoveryAgent agent;

  for (int i = 0; i < 100; i++)
    {
      devices[i]  = new Device (i);
      agent.add_device (devices[i]);
    }

  Runner runner (agent);
  runner.activate ();

  runner.wait ();

  return 0;
}

#else
#include "ace/OS_main.h"
#include "ace/OS_NS_stdio.h"

int ACE_TMAIN (int, ACE_TCHAR *[])
{
  ACE_OS::puts (ACE_TEXT ("This example requires threads."));
  return 0;
}

#endif /* ACE_HAS_THREADS */