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: RW_Lock.cpp 80826 2008-03-04 14:51:23Z wotte $
#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 */
|