(file) Return to AsyncOpNode.h CVS log (file) (dir) Up to [Pegasus] / pegasus / src / Pegasus / Common

  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

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2