1 karl 1.47 //%2006////////////////////////////////////////////////////////////////////////
|
2 mike 1.2 //
|
3 karl 1.42 // Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
4 // Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
5 // Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;
|
6 karl 1.39 // IBM Corp.; EMC Corporation, The Open Group.
|
7 karl 1.42 // Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
8 // IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
|
9 karl 1.44 // Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
10 // EMC Corporation; VERITAS Software Corporation; The Open Group.
|
11 karl 1.47 // Copyright (c) 2006 Hewlett-Packard Development Company, L.P.; IBM Corp.;
12 // EMC Corporation; Symantec Corporation; The Open Group.
|
13 mike 1.2 //
|
14 mike 1.5 // Permission is hereby granted, free of charge, to any person obtaining a copy
|
15 chip 1.30 // of this software and associated documentation files (the "Software"), to
16 // deal in the Software without restriction, including without limitation the
17 // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
18 mike 1.2 // sell copies of the Software, and to permit persons to whom the Software is
19 // furnished to do so, subject to the following conditions:
|
20 karl 1.47 //
|
21 chip 1.30 // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
|
22 mike 1.2 // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
23 // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
|
24 chip 1.30 // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
25 // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
26 // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
27 mike 1.2 // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
28 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29 //
30 //==============================================================================
31 //
32 // Author: Mike Day (mdday@us.ibm.com)
33 //
|
34 a.arora 1.40 // Modified By: Amit K Arora, IBM (amita@in.ibm.com) for Bug#1188
|
35 a.arora 1.41 // Alagaraja Ramasubramanian (alags_raj@in.ibm.com) for Bug#1090
|
36 david.dillard 1.45 // David Dillard, VERITAS Software Corp.
37 // (david.dillard@veritas.com)
|
38 mike 1.2 //
39 //%/////////////////////////////////////////////////////////////////////////////
40
41
42 #ifndef Pegasus_AsyncOpNode_h
43 #define Pegasus_AsyncOpNode_h
44
45 #include <Pegasus/Common/Config.h>
46 #include <Pegasus/Common/Message.h>
47 #include <Pegasus/Common/IPC.h>
|
48 kumpf 1.35 #include <Pegasus/Common/Linkage.h>
|
49 mike 1.48 #include <Pegasus/Common/Linkable.h>
50 #include <Pegasus/Common/List.h>
|
51 mike 1.2
52 PEGASUS_NAMESPACE_BEGIN
|
53 mike 1.5
|
54 mike 1.2 #define ASYNC_OPFLAGS_UNKNOWN 0x00000000
55 #define ASYNC_OPFLAGS_INTERVAL_REPEAT 0x00000010
56 #define ASYNC_OPFLAGS_INDICATION 0x00000020
57 #define ASYNC_OPFLAGS_REMOTE 0x00000040
58 #define ASYNC_OPFLAGS_LOCAL_OUT_OF_PROC 0x00000080
59 #define ASYNC_OPFLAGS_PHASED 0x00000001
60 #define ASYNC_OPFLAGS_PARTIAL 0x00000002
61 #define ASYNC_OPFLAGS_NORMAL 0x00000000
62 #define ASYNC_OPFLAGS_SINGLE 0x00000008
63 #define ASYNC_OPFLAGS_MULTIPLE 0x00000010
64 #define ASYNC_OPFLAGS_TOTAL 0x00000020
|
65 mday 1.13 #define ASYNC_OPFLAGS_META_DISPATCHER 0x00000040
|
66 mday 1.17 #define ASYNC_OPFLAGS_FIRE_AND_FORGET 0x00000080
67 #define ASYNC_OPFLAGS_SIMPLE_STATUS 0x00000100
68 #define ASYNC_OPFLAGS_CALLBACK 0x00000200
|
69 mday 1.20 #define ASYNC_OPFLAGS_FORWARD 0x00000400
|
70 mday 1.24 #define ASYNC_OPFLAGS_PSEUDO_CALLBACK 0x00000800
|
71 mday 1.26 #define ASYNC_OPFLAGS_SAFE_CALLBACK 0x00001000
|
72 mike 1.2
73 #define ASYNC_OPSTATE_UNKNOWN 0x00000000
74 #define ASYNC_OPSTATE_OFFERED 0x00000001
75 #define ASYNC_OPSTATE_DECLINED 0x00000002
76 #define ASYNC_OPSTATE_STARTED 0x00000004
77 #define ASYNC_OPSTATE_PROCESSING 0x00000008
|
78 chip 1.30 #define ASYNC_OPSTATE_DELIVER 0x00000010
|
79 mike 1.2 #define ASYNC_OPSTATE_RESERVE 0x00000020
80 #define ASYNC_OPSTATE_COMPLETE 0x00000040
81 #define ASYNC_OPSTATE_TIMEOUT 0x00000080
82 #define ASYNC_OPSTATE_CANCELLED 0x00000100
83 #define ASYNC_OPSTATE_PAUSED 0x00000200
|
84 mday 1.12 #define ASYNC_OPSTATE_SUSPENDED 0x00000400
|
85 mday 1.3 #define ASYNC_OPSTATE_RESUMED 0x00000800
|
86 mday 1.8 #define ASYNC_OPSTATE_ORPHANED 0x00001000
|
87 mday 1.12 #define ASYNC_OPSTATE_RELEASED 0x00002000
|
88 mike 1.2
|
89 mday 1.8 class Cimom;
|
90 mday 1.23 class Thread;
|
91 mday 1.13
|
92 mike 1.48 class PEGASUS_COMMON_LINKAGE AsyncOpNode : public Linkable
|
93 mike 1.2 {
|
94 mday 1.26
|
95 mday 1.38 // public:
96 // static void * operator new(size_t );
97 // static void operator delete( void *, size_t);
98 // private:
99 // static AsyncOpNode * _headOfFreeList;
100 // static const int BLOCK_SIZE;
101 // static Mutex _alloc_mut;
|
102 mike 1.2 public:
103
104 AsyncOpNode(void);
105 ~AsyncOpNode(void);
|
106 chip 1.30
|
107 david.dillard 1.45 void get_timeout_interval(struct timeval *buffer);
|
108 mday 1.9 void set_timeout_interval(const struct timeval *interval);
|
109 chip 1.30
|
110 david.dillard 1.45 Boolean timeout(void);
|
111 mike 1.2
|
112 david.dillard 1.45 void put_request(const Message *request);
|
113 mday 1.13 Message *get_request(void) ;
|
114 chip 1.30
|
115 david.dillard 1.45 void put_response(const Message *response);
|
116 mday 1.13 Message *get_response(void) ;
|
117 chip 1.30
|
118 david.dillard 1.45 Uint32 read_state(void);
119 void write_state(Uint32);
|
120 chip 1.30
|
121 mike 1.2 Uint32 read_flags(void);
122 void write_flags(Uint32);
|
123 chip 1.30
|
124 david.dillard 1.45 /**
125 @exception IPCException Indicates an IPC error occurred.
126 */
127 void lock(void);
128
129 /**
130 @exception IPCException Indicates an IPC error occurred.
131 */
132 void unlock(void);
133
134 /**
135 @exception IPCException Indicates an IPC error occurred.
136 */
137 void udpate(void);
138
139 /**
140 @exception IPCException Indicates an IPC error occurred.
141 */
142 void deliver(const Uint32 count);
143
144 /**
145 david.dillard 1.45 @exception IPCException Indicates an IPC error occurred.
146 */
147 void reserve(const Uint32 size);
148
149 /**
150 @exception IPCException Indicates an IPC error occurred.
151 */
152 void processing(void);
153
154 /**
155 @exception IPCException Indicates an IPC error occurred.
156 */
157 void complete(void);
158
|
159 mday 1.12 void release(void);
|
160 mday 1.10 void wait(void);
|
161 chip 1.30
162
|
163 mike 1.2 private:
164 Semaphore _client_sem;
165 Mutex _mut;
|
166 mike 1.48 List<Message,NullLock> _request;
167 List<Message,NullLock> _response;
|
168 chip 1.30
|
169 mike 1.2 Uint32 _state;
170 Uint32 _flags;
171 Uint32 _offered_count;
172 Uint32 _total_ops;
173 Uint32 _completed_ops;
|
174 mday 1.15 Uint32 _user_data;
|
175 mday 1.17 Uint32 _completion_code;
|
176 mday 1.19 MessageQueue *_op_dest;
|
177 chip 1.30
|
178 mike 1.2 struct timeval _start;
179 struct timeval _lifetime;
180 struct timeval _updated;
181 struct timeval _timeout_interval;
182
183 AsyncOpNode *_parent;
|
184 mike 1.48 List<AsyncOpNode,NullLock> _children;
|
185 mike 1.2
|
186 mike 1.48 void _reset(List<AsyncOpNode,NullLock> *dst_q);
|
187 mike 1.2
|
188 mday 1.9 // the lifetime member is for cache management by the cimom
|
189 mike 1.2 void _set_lifetime(struct timeval *lifetime) ;
|
190 mday 1.12 Boolean _check_lifetime(void) ;
|
191 mike 1.2
192 Boolean _is_child(void) ;
193 Uint32 _is_parent(void) ;
194 Boolean _is_my_child(const AsyncOpNode & caller) const;
195 void _make_orphan( AsyncOpNode & parent) ;
196 void _adopt_child(AsyncOpNode *child) ;
197 void _disown_child(AsyncOpNode *child) ;
|
198 chip 1.30 void (*_async_callback)(AsyncOpNode *,
|
199 david.dillard 1.45 MessageQueue *,
200 void *);
|
201 mday 1.26 void (*__async_callback)(Message *, void *, void *);
|
202 mday 1.23 // << Tue Mar 12 14:44:51 2002 mdd >>
|
203 chip 1.30 // pointers for async callbacks - don't use
|
204 mday 1.19 AsyncOpNode *_callback_node;
|
205 mday 1.21 MessageQueue *_callback_response_q;
|
206 mday 1.19 void *_callback_ptr;
|
207 mday 1.26 void *_callback_parameter;
208 void *_callback_handle;
|
209 mday 1.28 Condition *_callback_notify;
|
210 chip 1.30
|
211 mday 1.22 MessageQueue *_callback_request_q;
|
212 mday 1.23 // << Tue Mar 12 14:44:53 2002 mdd >>
|
213 chip 1.30 // pointers to help static class message handlers - don't use
|
214 mday 1.23 MessageQueue *_service_ptr;
215 Thread *_thread_ptr;
|
216 chip 1.30
|
217 mday 1.8 friend class cimom;
|
218 mday 1.10 friend class MessageQueueService;
|
219 mday 1.29 friend class ProviderManagerService;
|
220 mday 1.37 friend class BinaryMessageHandler;
|
221 mday 1.32 public:
222 // << Tue Jun 4 16:44:09 2002 mdd >>
|
223 david.dillard 1.45 // debug artifact
|
224 mday 1.32 Uint32 _source_queue;
|
225 mday 1.34 // << Fri Jul 19 08:41:45 2002 mdd >>
226 // debugging utility
227 // careful - wipes out current value of *buf
|
228 david.dillard 1.43 void print_to_buffer(char **buf);
|
229 a.arora 1.40 String print_to_string(void);
|
230 mike 1.2 };
231
232
|
233 chip 1.30 inline void AsyncOpNode::get_timeout_interval(struct timeval *buffer)
|
234 mday 1.9 {
235 if(buffer != 0)
236 {
|
237 a.arora 1.41 AutoMutex autoMut(_mut);
|
238 mday 1.9 buffer->tv_sec = _timeout_interval.tv_sec;
239 buffer->tv_usec = _timeout_interval.tv_usec;
|
240 a.arora 1.41 } // mutex unlocks here
|
241 mday 1.9 }
242
243 inline void AsyncOpNode::set_timeout_interval(const struct timeval *interval)
244 {
245 if(interval != 0)
246 {
|
247 a.arora 1.41 AutoMutex autoMut(_mut);
|
248 mday 1.9 _timeout_interval.tv_sec = interval->tv_sec;
249 _timeout_interval.tv_usec = interval->tv_usec;
|
250 mday 1.12 gettimeofday(&_updated, NULL);
|
251 a.arora 1.41 } // mutex unlocks here
|
252 mday 1.9 }
253
254
|
255 chip 1.30 inline Boolean AsyncOpNode::timeout(void)
|
256 mike 1.2 {
257 struct timeval now;
258 gettimeofday(&now, NULL);
|
259 mday 1.12 Boolean ret = false;
|
260 david.dillard 1.45
|
261 a.arora 1.41 AutoMutex autoMut(_mut);
|
262 mday 1.15 if((_updated.tv_sec + _timeout_interval.tv_sec ) < now.tv_sec)
|
263 a.arora 1.41 if((_updated.tv_usec + _timeout_interval.tv_usec ) < now.tv_usec)
264 ret = true;
|
265 david.dillard 1.45
|
266 mday 1.12 return ret;
|
267 mike 1.2 }
268
|
269 mday 1.16
|
270 chip 1.30 inline void AsyncOpNode::put_request(const Message *request)
|
271 mike 1.2 {
|
272 a.arora 1.41 AutoMutex autoMut(_mut);
|
273 mday 1.9 gettimeofday(&_updated, NULL);
|
274 mday 1.15
|
275 mike 1.48 if (!_request.contains(request))
276 _request.insert_back((Message*)request);
|
277 mike 1.2 }
278
|
279 chip 1.30 inline Message * AsyncOpNode::get_request(void)
|
280 mike 1.2 {
|
281 mday 1.12 Message *ret;
|
282 a.arora 1.41 AutoMutex autoMut(_mut);
|
283 mday 1.9 gettimeofday(&_updated, NULL);
|
284 mike 1.48 ret = _request.remove_front() ;
|
285 a.arora 1.41
|
286 mday 1.12 return ret;
|
287 mike 1.2 }
288
|
289 chip 1.30 inline void AsyncOpNode::put_response(const Message *response)
|
290 mike 1.2 {
|
291 a.arora 1.41 AutoMutex autoMut(_mut);
|
292 mday 1.9 gettimeofday(&_updated, NULL);
|
293 mike 1.48
294 if (!_response.contains(response))
295 _response.insert_back((Message*)response);
|
296 mike 1.2 }
297
|
298 chip 1.30 inline Message * AsyncOpNode::get_response(void)
|
299 mike 1.2 {
|
300 mday 1.12 Message *ret;
301
|
302 a.arora 1.41 AutoMutex autoMut(_mut);
|
303 mday 1.15 // gettimeofday(&_updated, NULL);
|
304 mike 1.48 ret = _response.remove_front();
|
305 mday 1.16 // ret = _response;
|
306 chip 1.30
|
307 mday 1.12 return ret;
|
308 mike 1.2 }
309
310 inline Uint32 AsyncOpNode::read_state(void)
311 {
|
312 a.arora 1.41 AutoMutex autoMut(_mut);
|
313 mday 1.9 gettimeofday(&_updated, NULL);
|
314 mday 1.12 Uint32 ret = _state;
|
315 david.dillard 1.45
|
316 mday 1.12 return ret;
|
317 chip 1.30
|
318 mike 1.2 }
319
320 inline void AsyncOpNode::write_state(Uint32 state)
321 {
|
322 a.arora 1.41 AutoMutex autoMut(_mut);
|
323 mday 1.9 gettimeofday(&_updated, NULL);
|
324 mike 1.2 _state = state;
325 }
326
327 inline Uint32 AsyncOpNode::read_flags(void)
328 {
|
329 a.arora 1.41 AutoMutex autoMut(_mut);
|
330 mday 1.9 gettimeofday(&_updated, NULL);
|
331 mday 1.12 Uint32 ret = _flags;
|
332 david.dillard 1.45
|
333 mday 1.12 return ret;
|
334 mike 1.2 }
335
336 inline void AsyncOpNode::write_flags(Uint32 flags)
|
337 chip 1.30 {
|
338 a.arora 1.41 AutoMutex autoMut(_mut);
|
339 mday 1.9 gettimeofday(&_updated, NULL);
|
340 mike 1.2 _flags = flags;
341 }
342
343
|
344 chip 1.30 inline void AsyncOpNode::lock(void)
|
345 mike 1.2 {
346 _mut.lock(pegasus_thread_self());
347 }
348
|
349 chip 1.30 inline void AsyncOpNode::unlock(void)
|
350 mike 1.2 {
351 _mut.unlock();
352 }
353
354 inline void AsyncOpNode::udpate(void)
355 {
|
356 a.arora 1.41 AutoMutex autoMut(_mut);
|
357 mike 1.2 gettimeofday(&_updated, NULL);
358 }
359
|
360 chip 1.30 inline void AsyncOpNode::deliver(const Uint32 count)
|
361 mike 1.2 {
|
362 a.arora 1.41 AutoMutex autoMut(_mut);
|
363 mike 1.2 _completed_ops = count;
|
364 mday 1.15 _state |= ASYNC_OPSTATE_DELIVER;
|
365 mike 1.2 gettimeofday(&_updated, NULL);
366 }
367
368 inline void AsyncOpNode::reserve(const Uint32 size)
369 {
|
370 a.arora 1.41 AutoMutex autoMut(_mut);
|
371 mike 1.2 _total_ops = size;
|
372 mday 1.15 _state |= ASYNC_OPSTATE_RESERVE;
|
373 mike 1.2 gettimeofday(&_updated, NULL);
374 }
375
|
376 chip 1.30 inline void AsyncOpNode::processing(void)
|
377 mike 1.2 {
|
378 a.arora 1.41 AutoMutex autoMut(_mut);
|
379 mday 1.15 _state |= ASYNC_OPSTATE_PROCESSING;
|
380 mike 1.2 gettimeofday(&_updated, NULL);
381 }
382
|
383 chip 1.30 inline void AsyncOpNode::complete(void)
|
384 mike 1.2 {
|
385 a.arora 1.41 AutoMutex autoMut(_mut);
|
386 mday 1.15 _state |= ASYNC_OPSTATE_COMPLETE;
|
387 mike 1.2 gettimeofday(&_updated, NULL);
388 }
389
|
390 mday 1.10 inline void AsyncOpNode::wait(void)
391 {
392 _client_sem.wait();
|
393 mike 1.2 }
394
|
395 mday 1.12 inline void AsyncOpNode::release(void)
396 {
|
397 a.arora 1.41 AutoMutex autoMut(_mut);
|
398 mday 1.12 _state |= ASYNC_OPSTATE_RELEASED;
399 }
400
|
401 chip 1.30 inline void AsyncOpNode::_set_lifetime(struct timeval *lifetime)
|
402 mike 1.2 {
|
403 a.arora 1.41 AutoMutex autoMut(_mut);
|
404 mike 1.2 _lifetime.tv_sec = lifetime->tv_sec;
405 _lifetime.tv_usec = lifetime->tv_usec;
|
406 a.arora 1.41
|
407 mike 1.2 }
408
|
409 chip 1.30 inline Boolean AsyncOpNode::_check_lifetime(void)
|
410 mike 1.2 {
411 struct timeval now;
|
412 chip 1.30
|
413 mike 1.2 gettimeofday(&now, NULL);
414 if((_start.tv_sec + _lifetime.tv_sec ) >= now.tv_sec)
415 if((_start.tv_usec + _lifetime.tv_usec ) >= now.tv_usec)
|
416 david.dillard 1.45 return true;
|
417 mike 1.2 return false;
418 }
419
420 inline Boolean AsyncOpNode::_is_child(void)
421 {
422 if (_parent != 0)
423 return true;
424 return false;
425 }
426
427 inline Uint32 AsyncOpNode::_is_parent(void)
428 {
|
429 mike 1.48 return _children.size();
|
430 mike 1.2 }
431
432 inline Boolean AsyncOpNode::_is_my_child(const AsyncOpNode & caller) const
|
433 chip 1.30 {
|
434 mike 1.2 if ( _parent == &caller )
435 return true;
436 return false;
437 }
438
|
439 chip 1.30 inline void AsyncOpNode::_make_orphan( AsyncOpNode & parent)
|
440 mike 1.2 {
441 if( _parent == &parent )
442 {
443 _parent = NULL;
444 parent._children.remove(this);
445 }
446 else
447 throw Permission(pegasus_thread_self());
448 }
449
|
450 chip 1.30 inline void AsyncOpNode::_adopt_child(AsyncOpNode *child)
|
451 mike 1.2 {
452 if(child == NULL)
453 throw NullPointer();
454 if(true == child->_is_child())
455 throw Permission(pegasus_thread_self());
456 child->_parent = this;
|
457 mike 1.48 _children.insert_back(child);
|
458 mike 1.2 }
|
459 chip 1.30
|
460 mike 1.2 inline void AsyncOpNode::_disown_child(AsyncOpNode *child)
461 {
462 if(child == NULL)
463 throw NullPointer();
464 if( false == child->_is_child() || false == child->_is_my_child( *this ))
465 throw Permission(pegasus_thread_self());
466 child->_make_orphan( *this );
467 _children.remove(child);
|
468 chip 1.30 }
|
469 mike 1.2
470 PEGASUS_NAMESPACE_END
471
472 #endif //Pegasus_AsyncOpNode_h
|