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

  1 karl  1.44 //%2005////////////////////////////////////////////////////////////////////////
  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 mike  1.2  //
 12 mike  1.5  // Permission is hereby granted, free of charge, to any person obtaining a copy
 13 chip  1.30 // of this software and associated documentation files (the "Software"), to
 14            // deal in the Software without restriction, including without limitation the
 15            // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
 16 mike  1.2  // sell copies of the Software, and to permit persons to whom the Software is
 17            // furnished to do so, subject to the following conditions:
 18 david.dillard 1.45 //
 19 chip          1.30 // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
 20 mike          1.2  // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
 21                    // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
 22 chip          1.30 // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
 23                    // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
 24                    // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
 25 mike          1.2  // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 26                    // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 27                    //
 28                    //==============================================================================
 29                    //
 30                    // Author: Mike Day (mdday@us.ibm.com)
 31                    //
 32 a.arora       1.40 // Modified By: Amit K Arora, IBM (amita@in.ibm.com) for Bug#1188
 33 a.arora       1.41 //              Alagaraja Ramasubramanian (alags_raj@in.ibm.com) for Bug#1090
 34 david.dillard 1.45 //              David Dillard, VERITAS Software Corp.
 35                    //                  (david.dillard@veritas.com)
 36 mike          1.2  //
 37                    //%/////////////////////////////////////////////////////////////////////////////
 38                    
 39                    
 40                    #ifndef Pegasus_AsyncOpNode_h
 41                    #define Pegasus_AsyncOpNode_h
 42                    
 43                    #include <Pegasus/Common/Config.h>
 44                    #include <Pegasus/Common/Message.h>
 45                    #include <Pegasus/Common/internal_dq.h>
 46                    #include <Pegasus/Common/IPC.h>
 47 kumpf         1.35 #include <Pegasus/Common/Linkage.h>
 48 mike          1.2  
 49                    PEGASUS_NAMESPACE_BEGIN
 50 mike          1.5  
 51 mike          1.2  #define ASYNC_OPFLAGS_UNKNOWN           0x00000000
 52                    #define ASYNC_OPFLAGS_INTERVAL_REPEAT   0x00000010
 53                    #define ASYNC_OPFLAGS_INDICATION        0x00000020
 54                    #define ASYNC_OPFLAGS_REMOTE            0x00000040
 55                    #define ASYNC_OPFLAGS_LOCAL_OUT_OF_PROC 0x00000080
 56                    #define ASYNC_OPFLAGS_PHASED            0x00000001
 57                    #define ASYNC_OPFLAGS_PARTIAL           0x00000002
 58                    #define ASYNC_OPFLAGS_NORMAL            0x00000000
 59                    #define ASYNC_OPFLAGS_SINGLE            0x00000008
 60                    #define ASYNC_OPFLAGS_MULTIPLE          0x00000010
 61                    #define ASYNC_OPFLAGS_TOTAL             0x00000020
 62 mday          1.13 #define ASYNC_OPFLAGS_META_DISPATCHER   0x00000040
 63 mday          1.17 #define ASYNC_OPFLAGS_FIRE_AND_FORGET   0x00000080
 64                    #define ASYNC_OPFLAGS_SIMPLE_STATUS     0x00000100
 65                    #define ASYNC_OPFLAGS_CALLBACK          0x00000200
 66 mday          1.20 #define ASYNC_OPFLAGS_FORWARD           0x00000400
 67 mday          1.24 #define ASYNC_OPFLAGS_PSEUDO_CALLBACK   0x00000800
 68 mday          1.26 #define ASYNC_OPFLAGS_SAFE_CALLBACK     0x00001000
 69 mike          1.2  
 70                    #define ASYNC_OPSTATE_UNKNOWN           0x00000000
 71                    #define ASYNC_OPSTATE_OFFERED           0x00000001
 72                    #define ASYNC_OPSTATE_DECLINED          0x00000002
 73                    #define ASYNC_OPSTATE_STARTED           0x00000004
 74                    #define ASYNC_OPSTATE_PROCESSING        0x00000008
 75 chip          1.30 #define ASYNC_OPSTATE_DELIVER           0x00000010
 76 mike          1.2  #define ASYNC_OPSTATE_RESERVE           0x00000020
 77                    #define ASYNC_OPSTATE_COMPLETE          0x00000040
 78                    #define ASYNC_OPSTATE_TIMEOUT           0x00000080
 79                    #define ASYNC_OPSTATE_CANCELLED         0x00000100
 80                    #define ASYNC_OPSTATE_PAUSED            0x00000200
 81 mday          1.12 #define ASYNC_OPSTATE_SUSPENDED         0x00000400
 82 mday          1.3  #define ASYNC_OPSTATE_RESUMED           0x00000800
 83 mday          1.8  #define ASYNC_OPSTATE_ORPHANED          0x00001000
 84 mday          1.12 #define ASYNC_OPSTATE_RELEASED          0x00002000
 85 mike          1.2  
 86 mday          1.8  class Cimom;
 87 mday          1.23 class Thread;
 88 mday          1.13 
 89 mike          1.2  class PEGASUS_COMMON_LINKAGE AsyncOpNode
 90                    {
 91 mday          1.26 
 92 mday          1.38 //     public:
 93                    //       static void * operator new(size_t );
 94                    //       static void operator delete( void *, size_t);
 95                    //    private:
 96                    //       static AsyncOpNode * _headOfFreeList;
 97                    //       static const int BLOCK_SIZE;
 98                    //       static Mutex _alloc_mut;
 99 mike          1.2     public:
100                    
101                          AsyncOpNode(void);
102                          ~AsyncOpNode(void);
103 chip          1.30 
104 mike          1.2        Boolean  operator == (const void *key) const;
105                          Boolean operator == (const AsyncOpNode & node) const;
106 mday          1.9  
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 mday          1.16       unlocked_dq<Message> _request;
167 chip          1.30       unlocked_dq<Message> _response;
168                    
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                          unlocked_dq<AsyncOpNode> _children;
185                    
186                          void _reset(unlocked_dq<AsyncOpNode> *dst_q);
187                    
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                    inline Boolean AsyncOpNode::operator == (const void *key) const
234                    {
235                       if (key == (void *)this)
236                          return true;
237                       return false;
238                    }
239                    
240                    inline Boolean AsyncOpNode::operator == (const AsyncOpNode & node) const
241                    {
242                       return AsyncOpNode::operator==((const void *)&node);
243                    }
244                    
245 mday          1.9  
246 chip          1.30 inline void AsyncOpNode::get_timeout_interval(struct timeval *buffer)
247 mday          1.9  {
248                       if(buffer != 0)
249                       {
250 a.arora       1.41       AutoMutex autoMut(_mut);
251 mday          1.9        buffer->tv_sec = _timeout_interval.tv_sec;
252                          buffer->tv_usec = _timeout_interval.tv_usec;
253 a.arora       1.41    } // mutex unlocks here
254 mday          1.9  }
255                    
256                    inline void AsyncOpNode::set_timeout_interval(const struct timeval *interval)
257                    {
258                       if(interval != 0)
259                       {
260 a.arora       1.41       AutoMutex autoMut(_mut);
261 mday          1.9        _timeout_interval.tv_sec = interval->tv_sec;
262                          _timeout_interval.tv_usec = interval->tv_usec;
263 mday          1.12       gettimeofday(&_updated, NULL);
264 a.arora       1.41    } // mutex unlocks here
265 mday          1.9  }
266                    
267                    
268 chip          1.30 inline Boolean AsyncOpNode::timeout(void)
269 mike          1.2  {
270                       struct timeval now;
271                       gettimeofday(&now, NULL);
272 mday          1.12    Boolean ret = false;
273 david.dillard 1.45 
274 a.arora       1.41    AutoMutex autoMut(_mut);
275 mday          1.15    if((_updated.tv_sec + _timeout_interval.tv_sec ) < now.tv_sec)
276 a.arora       1.41        if((_updated.tv_usec + _timeout_interval.tv_usec ) < now.tv_usec)
277                        ret =  true;
278 david.dillard 1.45 
279 mday          1.12    return ret;
280 mike          1.2  }
281                    
282 mday          1.16 
283 chip          1.30 inline  void AsyncOpNode::put_request(const Message *request)
284 mike          1.2  {
285 a.arora       1.41    AutoMutex autoMut(_mut);
286 mday          1.9     gettimeofday(&_updated, NULL);
287 mday          1.21    if( false == _request.exists(reinterpret_cast<void *>(const_cast<Message *>(request))) )
288 mday          1.16    _request.insert_last( const_cast<Message *>(request) ) ;
289 mday          1.15 
290 mday          1.16 //   _request = const_cast<Message *>(request);
291 mike          1.2  }
292                    
293 chip          1.30 inline Message * AsyncOpNode::get_request(void)
294 mike          1.2  {
295 mday          1.12    Message *ret;
296 a.arora       1.41    AutoMutex autoMut(_mut);
297 mday          1.9     gettimeofday(&_updated, NULL);
298 mday          1.16    ret = _request.remove_first() ;
299 a.arora       1.41 
300 mday          1.12    return ret;
301 mike          1.2  }
302                    
303 chip          1.30 inline void AsyncOpNode::put_response(const Message *response)
304 mike          1.2  {
305 a.arora       1.41    AutoMutex autoMut(_mut);
306 mday          1.9     gettimeofday(&_updated, NULL);
307 mday          1.21    if (false == _response.exists(reinterpret_cast<void *>(const_cast<Message *>(response))))
308 mday          1.16    _response.insert_last( const_cast<Message *>(response) );
309 mike          1.2  }
310                    
311 chip          1.30 inline Message * AsyncOpNode::get_response(void)
312 mike          1.2  {
313 mday          1.12    Message *ret;
314                    
315 a.arora       1.41    AutoMutex autoMut(_mut);
316 mday          1.15 //   gettimeofday(&_updated, NULL);
317 mday          1.16    ret = _response.remove_first();
318                    //   ret = _response;
319 chip          1.30 
320 mday          1.12    return ret;
321 mike          1.2  }
322                    
323                    inline Uint32 AsyncOpNode::read_state(void)
324                    {
325 a.arora       1.41    AutoMutex autoMut(_mut);
326 mday          1.9     gettimeofday(&_updated, NULL);
327 mday          1.12    Uint32 ret = _state;
328 david.dillard 1.45 
329 mday          1.12    return ret;
330 chip          1.30 
331 mike          1.2  }
332                    
333                    inline void AsyncOpNode::write_state(Uint32 state)
334                    {
335 a.arora       1.41    AutoMutex autoMut(_mut);
336 mday          1.9     gettimeofday(&_updated, NULL);
337 mike          1.2     _state = state;
338                    }
339                    
340                    inline Uint32 AsyncOpNode::read_flags(void)
341                    {
342 a.arora       1.41    AutoMutex autoMut(_mut);
343 mday          1.9     gettimeofday(&_updated, NULL);
344 mday          1.12    Uint32 ret = _flags;
345 david.dillard 1.45 
346 mday          1.12    return ret;
347 mike          1.2  }
348                    
349                    inline void AsyncOpNode::write_flags(Uint32 flags)
350 chip          1.30 {
351 a.arora       1.41    AutoMutex autoMut(_mut);
352 mday          1.9     gettimeofday(&_updated, NULL);
353 mike          1.2     _flags = flags;
354                    }
355                    
356                    
357 chip          1.30 inline  void AsyncOpNode::lock(void)
358 mike          1.2  {
359                       _mut.lock(pegasus_thread_self());
360                    }
361                    
362 chip          1.30 inline void AsyncOpNode::unlock(void)
363 mike          1.2  {
364                       _mut.unlock();
365                    }
366                    
367                    inline void AsyncOpNode::udpate(void)
368                    {
369 a.arora       1.41    AutoMutex autoMut(_mut);
370 mike          1.2     gettimeofday(&_updated, NULL);
371                    }
372                    
373 chip          1.30 inline void AsyncOpNode::deliver(const Uint32 count)
374 mike          1.2  {
375 a.arora       1.41    AutoMutex autoMut(_mut);
376 mike          1.2     _completed_ops = count;
377 mday          1.15    _state |= ASYNC_OPSTATE_DELIVER;
378 mike          1.2     gettimeofday(&_updated, NULL);
379                    }
380                    
381                    inline void AsyncOpNode::reserve(const Uint32 size)
382                    {
383 a.arora       1.41    AutoMutex autoMut(_mut);
384 mike          1.2     _total_ops = size;
385 mday          1.15    _state |= ASYNC_OPSTATE_RESERVE;
386 mike          1.2     gettimeofday(&_updated, NULL);
387                    }
388                    
389 chip          1.30 inline void AsyncOpNode::processing(void)
390 mike          1.2  {
391 a.arora       1.41    AutoMutex autoMut(_mut);
392 mday          1.15    _state |= ASYNC_OPSTATE_PROCESSING;
393 mike          1.2     gettimeofday(&_updated, NULL);
394                    }
395                    
396 chip          1.30 inline void AsyncOpNode::complete(void)
397 mike          1.2  {
398 a.arora       1.41    AutoMutex autoMut(_mut);
399 mday          1.15    _state |= ASYNC_OPSTATE_COMPLETE;
400 mike          1.2     gettimeofday(&_updated, NULL);
401                    }
402                    
403 mday          1.10 inline void AsyncOpNode::wait(void)
404                    {
405                       _client_sem.wait();
406 mike          1.2  }
407                    
408 mday          1.12 inline void AsyncOpNode::release(void)
409                    {
410 a.arora       1.41    AutoMutex autoMut(_mut);
411 mday          1.12    _state |= ASYNC_OPSTATE_RELEASED;
412                    }
413                    
414 chip          1.30 inline  void AsyncOpNode::_set_lifetime(struct timeval *lifetime)
415 mike          1.2  {
416 a.arora       1.41    AutoMutex autoMut(_mut);
417 mike          1.2     _lifetime.tv_sec = lifetime->tv_sec;
418                       _lifetime.tv_usec = lifetime->tv_usec;
419 a.arora       1.41 
420 mike          1.2  }
421                    
422 chip          1.30 inline Boolean AsyncOpNode::_check_lifetime(void)
423 mike          1.2  {
424                       struct timeval now;
425 chip          1.30 
426 mike          1.2     gettimeofday(&now, NULL);
427                       if((_start.tv_sec + _lifetime.tv_sec ) >= now.tv_sec)
428                          if((_start.tv_usec + _lifetime.tv_usec ) >= now.tv_usec)
429 david.dillard 1.45             return true;
430 mike          1.2     return false;
431                    }
432                    
433                    inline Boolean AsyncOpNode::_is_child(void)
434                    {
435                       if (_parent != 0)
436                          return true;
437                       return false;
438                    }
439                    
440                    inline Uint32 AsyncOpNode::_is_parent(void)
441                    {
442                       return _children.count();
443                    }
444                    
445                    inline Boolean AsyncOpNode::_is_my_child(const AsyncOpNode & caller) const
446 chip          1.30 {
447 mike          1.2     if ( _parent == &caller )
448                          return true;
449                       return false;
450                    }
451                    
452 chip          1.30 inline void AsyncOpNode::_make_orphan( AsyncOpNode & parent)
453 mike          1.2  {
454                       if( _parent == &parent )
455                       {
456                          _parent = NULL;
457                          parent._children.remove(this);
458                       }
459                       else
460                          throw Permission(pegasus_thread_self());
461                    }
462                    
463 chip          1.30 inline void AsyncOpNode::_adopt_child(AsyncOpNode *child)
464 mike          1.2  {
465                       if(child == NULL)
466                          throw NullPointer();
467                       if(true == child->_is_child())
468                          throw Permission(pegasus_thread_self());
469                       child->_parent = this;
470                       _children.insert_last(child);
471                    }
472 chip          1.30 
473 mike          1.2  inline void AsyncOpNode::_disown_child(AsyncOpNode *child)
474                    {
475                       if(child == NULL)
476                          throw NullPointer();
477                       if( false == child->_is_child() || false == child->_is_my_child( *this ))
478                          throw Permission(pegasus_thread_self());
479                       child->_make_orphan( *this );
480                       _children.remove(child);
481 chip          1.30 }
482 mike          1.2  
483                    PEGASUS_NAMESPACE_END
484                    
485                    #endif //Pegasus_AsyncOpNode_h

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2