blob: c68adee2421c8f20d4c3b46fad3931cd959f87cd (
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
|
/* -*- C++ -*- */
// ============================================================================
//
// = LIBRARY
// ace
//
// = FILENAME
// Free_List.h
//
// = AUTHOR
// Darrell Brunsch (brunsch@cs.wustl.edu)
//
// ============================================================================
#if !defined(ACE_FREE_LIST_H)
#define ACE_FREE_LIST_H
#include "ace/OS.h"
#include "ace/Synch_T.h"
template <class T>
class ACE_Free_List
// = TITLE
// Implements a free list
//
// = DESCRIPTION
// This class maintains a free list of nodes of type T.
{
public:
virtual ~ACE_Free_List (void);
// Destructor - removes all the elements from the free_list
virtual void add (T *element) = 0;
// Inserts an element onto the free list (if it isn't past the high water mark)
virtual T *remove (void) = 0;
// Takes a element off the freelist and returns it. It creates <inc> new elements
// if the size is at or below the low water mark.
virtual size_t size () = 0;
// Returns the current size of the free list
virtual void resize (size_t newsize) = 0;
// Resizes the free list to <newsize>
};
template <class T, class LOCK>
class ACE_Locked_Free_List : public ACE_Free_List<T>
// = TITLE
// Implements a free list
//
// = DESCRIPTION
// This class maintains a free list of nodes of type T. It depends on
// the type T having a get_next () and set_next () method. It maintains
// a mutex so the freelist can be used in a multithreaded program .
{
public:
ACE_Locked_Free_List (size_t prealloc = ACE_DEFAULT_FREE_LIST_PREALLOC,
size_t lwm = ACE_DEFAULT_FREE_LIST_LWM,
size_t hwm = ACE_DEFAULT_FREE_LIST_HWM,
size_t inc = ACE_DEFAULT_FREE_LIST_INC,
LOCK *mutex = 0);
// Default constructor that takes in a preallocation number (<prealloc>), a
// low and high water mark (<lwm> and <hwm>) and an increment value (<inc>)
virtual ~ACE_Locked_Free_List (void);
// Destructor - removes all the elements from the free_list
virtual void add (T *element);
// Inserts an element onto the free list (if it isn't past the high water mark)
virtual T *remove (void);
// Takes a element off the freelist and returns it. It creates <inc> new elements
// if the size is at or below the low water mark.
virtual size_t size ();
// Returns the current size of the free list
virtual void resize (size_t newsize);
// Resizes the free list to <newsize>
LOCK &get_mutex (void);
// Returns a reference to the mutex
void set_mutex (LOCK &mutex);
// Sets the mutex to <mutex>
protected:
virtual void alloc (size_t n);
// Allocates <n> extra nodes for the freelist
virtual void dealloc (size_t n);
// Removes and frees <n> nodes from the freelist
T *free_list_;
// Pointer to the first node in the freelist
size_t lwm_;
// Low water mark
size_t hwm_;
// High water mark
size_t inc_;
// Increment value
size_t size_;
// Keeps track of the size of the list
LOCK *mutex_;
// Synchronization variable for <ACE_Timer_Queue>.
int delete_mutex_;
// flag to remember ownership of the mutex
private:
// = Don't allow these operations for now.
ACE_Locked_Free_List (const ACE_Locked_Free_List<T, LOCK> &);
void operator= (const ACE_Locked_Free_List<T, LOCK> &);
};
#if defined (__ACE_INLINE__)
#include "ace/Free_List.i"
#endif /* __ACE_INLINE__ */
#if defined (ACE_TEMPLATES_REQUIRE_SOURCE)
#include "ace/Free_List.cpp"
#endif /* ACE_TEMPLATES_REQUIRE_SOURCE */
#if defined (ACE_TEMPLATES_REQUIRE_PRAGMA)
#pragma implementation ("Free_List.cpp")
#endif /* ACE_TEMPLATES_REQUIRE_PRAGMA */
#endif /* ACE_FREE_LIST_H */
|