(file) Return to MessageQueueService.html CVS log (file) (dir) Up to [Pegasus] / pegasus / doc

   1 mday  1.3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
   2           <html lang="en"><head>
   3 mday  1.4 <META http-equiv="Content-Type" content="text/html;
   4                 charset=ISO-8859-1"><meta http-equiv="Content-Type"
   5           				content="text/html;
   6           				charset=ISO-8859-1"><title>Pegasus
   7                 Meta Dispatcher </title><style type="text/css">
   8 mday  1.3 
   9           body {
  10             margin: 2em 1em 2em;
  11             font-family: sans-serif;
  12             color: black;
  13             background: white;
  14             background-position: top left;
  15             background-attachment: fixed;
  16             background-repeat: no-repeat;
  17           }
  18           :link { color: #00C; background: transparent }
  19           :visited { color: #609; background: transparent }
  20           :active { color: #C00; background: transparent }
  21           
  22           th, td { /* ns 4 */
  23             font-family: sans-serif;
  24           }
  25           
  26           h1, h2, h3, h4, h5, h6 { text-align: left }
  27           /* background should be transparent, but WebTV has a bug */
  28           h1, h2, h3 { color: #005A9C; background: white }
  29 mday  1.3 h1 { font: 170% sans-serif }
  30           h2 { font: 140% sans-serif }
  31           h3 { font: 120% sans-serif }
  32           h4 { font: bold 100% sans-serif }
  33           h5 { font: italic 100% sans-serif }
  34           h6 { font: small-caps 100% sans-serif }
  35           
  36           .hide { display: none }
  37           
  38           div.head { margin-bottom: 1em }
  39           div.head h1 { margin-top: 2em; clear: both }
  40           div.head table { margin-left: 2em; margin-top: 2em }
  41           div.head img { color: white; border: none } /* remove border from top image */
  42           
  43           p.copyright { font-size: small }
  44           p.copyright small { font-size: small }
  45           
  46           pre { margin-left: 2em }
  47 mday  1.4 
  48 mday  1.3 p {
  49             margin-top: 0.6em;
  50             margin-bottom: 0.6em;
  51           }
  52 mday  1.4 
  53 mday  1.3 dt, dd { margin-top: 0; margin-bottom: 0 } /* opera 3.50 */
  54           dt { font-weight: bold }
  55           
  56           pre, code { font-family: monospace } /* navigator 4 requires this */
  57           
  58           ul.toc {
  59             list-style: disc;		/* Mac NS has problem with 'none' */
  60             list-style: none;
  61           }
  62           
  63 mday  1.4 code        { font-family: monospace; }
  64           var {font-family: monospace; font-style: normal; font-weight: bold;}
  65 mday  1.3 div.constraint,
  66           div.issue,
  67           div.note,
  68           div.notice     { margin-left: 2em; }
  69           
  70 mday  1.4 li p           { margin-top: 0.8em;
  71                            margin-bottom: 0.8em; }
  72 mday  1.3       
  73 mday  1.4 li {margin-top: 0.4em; margin-bottom: 0.4em;}
  74           
  75 mday  1.3 div.exampleInner pre { margin-left: 1em;
  76                                  margin-top: 0em; margin-bottom: 0em}
  77           div.exampleOuter {border: 4px double gray;
  78                             margin: 0em; padding: 0em}
  79           div.exampleInner { background-color: #d5dee3;
  80                              border-top-width: 4px;
  81                              border-top-style: double;
  82                              border-top-color: #d3d3d3;
  83                              border-bottom-width: 4px;
  84                              border-bottom-style: double;
  85                              border-bottom-color: #d3d3d3;
  86                              padding: 4px; margin: 0em }
  87           div.exampleWrapper { margin: 4px }
  88           div.exampleHeader { font-weight: bold;
  89                               margin: 4px}
  90           
  91           table { background-color: #d5dee3;
  92                   width: 85% ;
  93                   border-style: double;
  94                   border-width: 4px;
  95                   border-color: #d3d3d3;
  96 mday  1.3 }
  97                   </style>
  98             
  99 mday  1.1 <html>
 100             <head>
 101               <title>Pegasus Meta Dispatcher</title>
 102             </head>
 103           
 104             <body>
 105 mday  1.3 
 106 mday  1.1     <h1>Pegasus Meta Dispatcher</h1>
 107               <p>
 108                 The Pegasus Meta Dispatcher is a set of classes that extend the
 109                 existing MessageQueue messaging system to be dynamic,
 110                 asynchronous, and multithreaded. The primary classes consist of the
 111                 folowing:
 112               </p>
 113 mday  1.3 	<table> 
 114           	    <tr align="left"><th>Class</th><th>Derived from</th><th>Source file</th></tr>
 115           	    <tr><td><div class="exampleInner">cimom</div></td><td>MessageQueue</td><td>Pegasus/Common/Cimom.h</td></tr>
 116           	    <tr><td>MessageQueueService</td><td>MessageQueue</td><td>Pegasus/Common/MessageQueueServices.h</td></tr>
 117           	    <tr><td>CimomMessage</td><td>Message</td><td>Pegasus/Common/CimomMessage.h</td></tr>
 118 mday  1.1 	<tr><td>AsyncOpNode</td><td>n/a</td><td>Pegasus/Common/AsyncOpNode.h</td></tr>
 119 mday  1.3 	    <tr><td>AsyncDQueue</td><td>unlocked_dq</td><td>Pegasus/Common/DQueue.h</td></tr>
 120           	    <tr><td>IPC classes</td><td>n/a</td><td>Pegasus/Common/IPC.h</td></tr>
 121           	    <tr><td>Threading classes</td><td>n/a</td><td>Pegasus/Common/Thread.h</td></tr>
 122           
 123           	</table>
 124           	
 125           	<br>
 126           	<br>
 127 mday  1.1 
 128 mday  1.4 	<a href = "#non-blocking">Jump to the non-blocking message interface.</a>
 129           
 130 mday  1.1       <h2>Purposes of Meta Dispatcher</h2>
 131               <p>
 132 mday  1.4       The Meta Dispatcher has three primary goals:
 133 mday  1.1       <ol>
 134                 <li>Provide for orderly asynchronous message-based communication
 135           	among a dynamic set of Pegasus Services.</li>
 136                 <li>Preserve the existing message-passing architecture of
 137           	Pegasus.</li>
 138                 <li>Allow Pluggable Services such as repositories, provider
 139           	managers, and others.</li>
 140               </ol>
 141           <br>
 142           <br>
 143               Most of the purposes listed above revolve around maintaining the
 144               integrity of data and control flow in an asynchronous
 145               multithreaded environment. 
 146               </p>
 147           
 148               <h2>Terms</h2>
 149               <p>
 150               <dl>
 151                 <dt><b>Meta Dispatcher</b></dt><dd>The central message broker, or
 152           	router, that provides the asynchronous communications within
 153           	Pegasus. Derived from the <b>MessageQueue</b> class. <br>
 154 mday  1.1       </dd>
 155                 <dt><b>Service</b></dt><dd>A Pegasus module that sends and
 156           	receives messages to other modules through the meta
 157           	dispatcher; A module that has enhanced privileges within
 158           	Pegasus and which provides one or more functions necessary to
 159           	the operation of Pegasus. Derived from the
 160           	<b>MessageQueue</b>class.<dt>
 161                 <dt><b>Asynchronous Message</b></dt><dd>A <b>pair</b> of
 162           	messages, consisting of a <b>request</b> and a <b>response</b>
 163           	that are treated as a single operation by Services. An
 164           	asynchronous message may be fronted by a synchronous
 165           	programming interface. Derived from the <b>Message</b> class.</dd>
 166                 <dt><b>AsyncOpNode</b></dt><dd>A control object that manages the
 167           	lifetime of an <b>Asynchronous Message</b>.The AsyncOpNode uses
 168           	many of the IPC object classes. A Service manages the lifetime
 169           	of an AsyncOpNode during the processing of the
 170           	message. However, it necessarily cedes control of the
 171           	AsyncOpNode to the <b>Meta Dispatcher</b> while the
 172           	Asynchronous Message is being processed.</dd>
 173               </dl>
 174               
 175 mday  1.1     </p>
 176           
 177               <h2>Meta Dispatcher Design</h2>
 178               <p>
 179                 Three points are necessary to avoid deadlocks and to
 180                 provide pluggable services in Pegaus. The first thing is
 181                 <b>independent execution paths</b> of service modules. i.e.,
 182                 each service must have its own thread(s), which must not intersect
 183                 with the thread(s) of other services. Intersection of execution
 184                 paths can occur indirectly through IPC objects such as mutexes,
 185                 conditions, and semaphores.
 186               </p>
 187               <p>
 188                 The second point that is necessary is <b>interface
 189           	abstraction</b>, which the Meta Dispatcher provides through
 190                 C++ polymorphism. This allows pluggable services. i.e., one
 191                 service can replace another and the system will continue to
 192                 function (hopefully in an improved manner). 
 193               </p>
 194               <p>
 195                 The third point that is neccesary is a <b>central
 196 mday  1.1 	message broker</b> that isolates services from each other,
 197                 thereby preventing deadlocks. The central message broker also
 198                 provides message responses for services that are paused,
 199                 stopped, or not present (plugged in). 
 200               </p>
 201           
 202           
 203               <h3>Central Hub</h3>
 204               <p>
 205                 The Meta Dispatcher therefore acts as a central message
 206                 hub. Services communicate with each other <i>via</i> the Meta
 207                 Dispatcher.
 208 mday  1.3 	<div class="exampleOuter"><div class="exampleInner">
 209 martin 1.5       <pre>      Service A--Message----1----> (block on semaphore)
 210 mday   1.1                                   |
 211                                              |
 212                                              Meta Dispatcher| 
 213                                                             |
 214                                                           Message----2->Service B
 215                                                                             |
 216                                                                             |
 217                                       (Signal Semaphore) <---Response---3-- +
 218                                             |
 219                  Service A <--Response--4---+
 220            
 221                </pre>
 222            
 223 mday   1.3 	  </div></div>
 224 mday   1.1     The numbered steps above are as follows:
 225                <ol>
 226                  <li><b>Service A</b> creates a new <code>AsyncMessage</code> and
 227            	<code>AsyncOpNode</code>and sends that message to <b>Service
 228            	  B</b> by calling
 229            	<code>MessageQueueService::SendWait</code>. The calling thread
 230                  blocks on the <b>client emaphore</b> until the response is ready.</li><br>
 231            
 232                  <li>The Meta Dispatcher's routing thread picks up the message
 233            	and inserts it into <b>Service B's</b> incoming message
 234            	queue. The routing thread returns to the Meta Dispatcher to
 235            	route the next message in the system.</li><br>
 236            
 237                  <li><b>Service B's</b>incoming thread picks up the message and
 238            	calls the its message handler. Message handlers are virtual,
 239            	so a class derived from <b>MessageQueueService</b>can define
 240            	its own message handlers to override the default
 241            	handlers. When the message handler has constructed an
 242            	<b>AsyncReply</b> that reply gets linked to the
 243            	<b>AsyncOpNode</b>. The MessageQueueService then signals the
 244            	<b>client semaphore</b> within the op node.</li><br>
 245 mday   1.1 
 246                  <li><b>Service A</b> awakens when the <b>client semaphore</b> is
 247            	signalled. It pulls the <b>AsyncResponse</b> message from the
 248            	<b>AsyncOpNode</b> and processes the result. Service A is
 249            	responsible for discarding the request, response, and
 250            	AsyncOpNode objects. The existing classes have mechanisms for
 251            	caching these objects to avoid too frequent
 252            	construction/destruction of them. 
 253                </ol>
 254                </p>
 255            
 256            <h2>Test Program</h2>
 257                  <p>
 258            	The concepts explained below are all contained in the test
 259            	program for the Meta Dispatcher, which is located in 
 260            	<code>$PEGASUS_HOME/src/Pegasus/Common/tests/MessageQueueService/</code>
 261            
 262                  </p>
 263            
 264                  <h2>Service Registration and Deregistration</h2>
 265                  <p>
 266 mday   1.1 	Services (classes derived from
 267            	<code>MessageQueueService</code>must register their presence
 268            	with the Meta Dispatcher. This is done as follows (taken from
 269            	the test program):
 270            
 271            	<ol>
 272            	<li><b>Define the Service Class</b></li>
 273 martin 1.5 <pre>// Define our service class 
 274 mday   1.1 
 275            class MessageQueueClient : public MessageQueueService
 276            {
 277                  
 278               public:
 279                  typedef MessageQueueService Base;
 280                  
 281                  MessageQueueClient(char *name)
 282            	 : Base(name, MessageQueue::getNextQueueId(), 0,  
 283            		message_mask::type_cimom | 
 284            		message_mask::type_service | 
 285            		message_mask::ha_request | 
 286            		message_mask::ha_reply | 
 287            		message_mask::ha_async ),
 288            	   client_xid(1)
 289                  {  
 290            	 _client_capabilities = Base::_capabilities;
 291            	 _client_mask = Base::_mask;
 292                  }
 293                        
 294                  virtual ~MessageQueueClient(void) 
 295 mday   1.1       {
 296                  }
 297                  
 298                  // method to indicate acceptance of message to 
 299                  // Meta Dispatcher
 300                  virtual Boolean messageOK(const Message *msg);
 301            
 302                  // function to send a request to another service
 303                  void send_test_request(char *greeting, Uint32 qid);
 304                  Uint32 get_qid(void);
 305                  
 306                  Uint32 _client_capabilities;
 307                  Uint32 _client_mask;
 308                  
 309                  // method to receive messages from the Meta Dispatcher,
 310                  // MUST be defined
 311                  virtual void _handle_async_request(AsyncRequest *req);
 312            
 313                  AtomicInt client_xid;
 314            };
 315            
 316 mday   1.1 </pre>
 317                  <li><b>Construct the Service</b></li>
 318 martin 1.5 <pre>// Create our Service
 319 mday   1.1    MessageQueueClient *q_client = 
 320                      new MessageQueueClient("test client");
 321            
 322            </pre>
 323                  <li><b>Register the Service</b></li>
 324 martin 1.5 <pre>// Register our service with the Meta Dispatcher
 325 mday   1.1    q_client-&gt;register_service("test client", 
 326                                           q_client-&gt;_client_capabilities, 
 327                                           q_client-&gt;_client_mask);
 328               cout &lt;&lt; " client registered " &lt;&lt; endl;
 329            </pre>
 330            
 331            </ol>
 332            
 333                  The example above hides many of the details which are handled by
 334                  the MessageQueueService's constructor, such as creating the
 335                  background thread, finding the Meta Dispatcher, and constructing
 336                  the queues. But a derived class as the example shows does not
 337                  need to worry about those details. 
 338                  </p>
 339            
 340            <h2>Finding Other Services</h2>
 341                  <p>
 342            	The MessageQueueService class has an api for finding other
 343            	services. This api is built using messages that are defined in
 344            	<code>CimomMessage.h</code>. Here is an example from the test
 345            	program:
 346 mday   1.1 
 347            <pre>
 348 mday   1.2    Array&lt;Uint32&gt;; services; 
 349 mday   1.1 
 350               while( services.size() == 0 )
 351               {
 352 mday   1.2       q_client-&gt;find_services(String("test server"), 0, 0, &services); 
 353 mday   1.1       pegasus_yield();  
 354               }
 355               
 356 mday   1.2    cout &lt;&lt; "found server at " &lt;&lt; services[0] &lt;&lt; endl;
 357 mday   1.1 
 358            
 359            </pre>
 360            
 361                  The code sample above shows how to find services by their
 362                  name. The api also allows finding services by their capabilities
 363                  or the messages they support. Note that the return is an array
 364                  of Queue IDs. It is possible, for example, to find multiple
 365                  services. 
 366                  </p>
 367            
 368            <h2>Sending an Asynchronous Message to Another Service</h2>
 369                  <p>
 370            	The "handle" for a services is its Queue ID. Once you have the
 371            	Queue ID you can send a message to that service. The example
 372            	above shows one way to get a service's Queue ID. Here is an
 373            	example that shows how to send that service a message. 
 374            
 375            <ol>
 376            <li><b>Define the Request and Response Message Pair by Inheriting from AsyncMessage.</b></li>
 377            <pre>
 378 mday   1.1 class test_request : public AsyncRequest
 379            {
 380              
 381               public:
 382                  typedef AsyncRequest Base;
 383                  
 384                  test_request(Uint32 routing, 
 385            		   AsyncOpNode *op, 
 386            		   Uint32 destination, 
 387            		   Uint32 response,
 388            		   char *message)
 389            	 : Base(0x04100000,
 390            		Message::getNextKey(), 
 391            		routing,
 392            		0, 
 393            		op, 
 394            		destination, 
 395            		response, 
 396            		true),
 397            	   greeting(message) 
 398                  {   
 399 mday   1.1 	 
 400                  }
 401                  
 402                  virtual ~test_request(void) 
 403                  {
 404            
 405            
 406                  }
 407                  
 408                  String greeting;
 409            };
 410            
 411            
 412            class test_response : public AsyncReply
 413            {
 414               public:
 415                  typedef AsyncReply Base;
 416                  
 417            
 418                  test_response(Uint32 key, 
 419            		    Uint32 routing,
 420 mday   1.1 		    AsyncOpNode *op, 
 421            		    Uint32 result,
 422            		    Uint32 destination, 
 423            		    char *message)
 424            	 : Base(0x04200000,
 425            		key, 
 426            		routing, 
 427            		0, 
 428            		op, 
 429            		result, 
 430            		destination,
 431            		true), 
 432            	   greeting(message) 
 433                  {  
 434            	 
 435                  }
 436                  
 437                  virtual ~test_response(void)
 438                  {
 439            	 
 440                  }
 441 mday   1.1       
 442                  String greeting;
 443            };
 444            
 445            </pre>
 446            
 447                  The function <code>send_test_request</code> shows everything
 448                  that is necessary to send a message to another service and
 449                  process the reply. 
 450            
 451            <pre>
 452            void MessageQueueClient::send_test_request(char *greeting, Uint32 qid)
 453            {
 454            
 455            </pre>
 456            <li><b>Construct the Request</b></li>
 457            
 458 martin 1.5 <pre>   test_request *req = 
 459 mday   1.1       new test_request(Base::get_next_xid(),
 460            		       0,
 461            		       qid,        // destination queue ID
 462            		       _queueId,   // my own queue ID 
 463            		       greeting);  // message parameter
 464            
 465            </pre>
 466            
 467            <li><b>Send the message using <code>MessageQueueService::SendWait</code></b></li>
 468            
 469 martin 1.5 <pre>   AsyncMessage *response = SendWait(req);
 470 mday   1.1 
 471            </pre>
 472            
 473            <li><b>Process the Response.</b></i>
 474 martin 1.5 <pre>   if( response != 0  )
 475 mday   1.1    {
 476                  msg_count++; 
 477                  delete response; 
 478                  cout << " test message " << msg_count.value() << endl;
 479                  
 480               }
 481               delete req;
 482            }
 483            
 484            </pre>
 485            
 486            <li><b>Delete the Request and the Response. The
 487            	    <code>SendWait</code> interface creates and disposes of
 488            	    everything else.</b></li> 
 489            
 490            </ol>
 491                  </p>
 492            
 493            
 494            <h2>Handling an Incoming Message </h2>
 495            
 496 mday   1.1 	<p>
 497            	  To handle messages the service needs to implement the
 498            	  following methods. 
 499            
 500            <ol>
 501            
 502            <li><b><code>virtual Boolean MessageOK(const Message
 503            		*)</code></b></li>
 504            
 505            	  This method allows the Service to accept or reject the
 506            	message. The Meta Dispatcher will always call this method
 507            	before inserting the request on the Service's queue. 
 508            
 509            <pre>
 510            Boolean MessageQueueServer::messageOK(const Message *msg)
 511            {
 512               if(msg->getMask() & message_mask::ha_async)
 513               {
 514                  if( msg->getType() == 0x04100000 ||
 515            	  msg->getType() == async_messages::CIMSERVICE_STOP || 
 516            	  msg->getType() == async_messages::CIMSERVICE_PAUSE || 
 517 mday   1.1 	  msg->getType() == async_messages::CIMSERVICE_RESUME )
 518                  return true;
 519               }
 520               return false;
 521            }
 522            
 523            </pre>
 524            
 525            <li><b><code>virtual Boolean accept_async(AsyncOpNode
 526            	      *operation)</code> (optional) </b></li>
 527            
 528            	This method executes on the Meta Dispatcher's thread and links
 529            	the incoming message to the Service's queue. <br><br>
 530            
 531            
 532            
 533            <li><b><code>virtual void _handle_incoming_operation(AsyncOpNode
 534            	      *)</code></b></li><br>
 535            
 536            
 537            This method is called by the Service's background thread. Here is an
 538 mday   1.1 	example implementation that just does some sanity checking on
 539            	the message.
 540            
 541            <pre>
 542            void MessageQueueServer::_handle_incoming_operation(AsyncOpNode *op)
 543            {
 544               if ( operation != 0 )
 545               {
 546                  Message *rq = operation-&gt;get_request();
 547                  PEGASUS_ASSERT(rq != 0 );
 548                  PEGASUS_ASSERT(rq-&gt;getMask() & message_mask::ha_async );
 549                  PEGASUS_ASSERT(rq-&gt;getMask() & message_mask::ha_request);
 550                  _handle_async_request(static_cast&lt;AsyncRequest *&gt;(rq));
 551               }
 552                 
 553               return;
 554               
 555            }
 556            
 557            
 558            </pre>
 559 mday   1.1 
 560            <li><b><code>virtual void _handle_async_request(AsyncRequest *)</code></b></li><br>
 561            <br>
 562            
 563            	This method handles the request. The Service must implement
 564            	this method. <b>If the Service does not handle the Request it
 565            	  must pass the Request to the Base class by calling <code>Base::_handle_async_request(req)</code></b>
 566            
 567 martin 1.5 <pre>void MessageQueueServer::_handle_async_request(AsyncRequest *req)
 568 mday   1.1 {
 569               if (req->getType() == 0x04100000 )
 570               {
 571                  req->op->processing();
 572                  handle_test_request(req);   // Message Handler 
 573               }
 574               else if ( req->getType() == async_messages::CIMSERVICE_STOP )
 575               {
 576                  req->op->processing();
 577                  handle_CimServiceStop(static_cast<CimServiceStop *>(req));
 578               }
 579               
 580               else
 581                  Base::_handle_async_request(req);  // Give it to the Base !!
 582            }
 583            
 584            </pre>
 585            
 586            <li><b>Specific Message Handlers</b>
 587            
 588            	  Each Message handler will be defined by the format of the
 589 mday   1.1 	  Request/Response pair. Here is an example from the test
 590            	  program. 
 591            
 592 martin 1.5 <pre> 
 593 mday   1.1    if( msg-&gt;getType() == 0x04100000 )
 594               {
 595            
 596            </pre>
 597            	  <ol>
 598            	    <li><b>Construct the Reply</b></li>
 599            <pre>
 600                  test_response *resp = 
 601            	 new test_response(msg-&gt;getKey(),
 602            			   msg-&gt;getRouting(),
 603            			   msg-&gt;op, 
 604            			   async_results::OK,
 605            			   msg-&gt;dest, 
 606            			   "i am a test response");
 607            
 608            
 609            </pre>
 610            	    <li><b>Complete the Reply</b> by calling the following
 611            	    helper routine in the Base class</li>
 612            
 613 martin 1.5 <pre>      _completeAsyncResponse(msg, resp, ASYNC_OPSTATE_COMPLETE, 0);
 614 mday   1.1 
 615               }
 616            </pre>
 617            
 618            </ol>
 619            	</p>
 620            
 621 mday   1.2 <h2>Handling CIMMessage and Other Pre-existing Message Classes</h2>
 622            	  <p>
 623            	    Existing Messages, including all of the <code>CIMMessage</code>
 624            	    derivitives, are not configured to be asynchronous
 625            	    request/reply pairs. They are designed to travel through
 626            	    Pegasus as events that trigger other processing events,
 627            	    which is the end of their lifetime. This is not an optimal
 628            	    use model for asynchronous operation because the
 629            	    originator of the event does not require nor receive any
 630            	    completion notification. Further, there is not a
 631            	    one-to-one correspondence of "event messages" to replies. 
 632            	  </p>
 633            	  
 634            	  <h3>AsyncLegacyOperationStart Message</h3>
 635            	  <p>
 636            	    The AsyncLegacyOperationStart message is an envelope that
 637            	    allows a <code>MessageQueueService</code>-based service to
 638            	    send, receive, and process pre-existing "legacy"
 639            	    messages. 
 640            	  </p>
 641            	  <p>
 642 mday   1.2 	    The <code>AsyncLegacyOperationStart</code> Message allows
 643            	    an asynchronous service to create, package, and send a
 644            	    "legacy" message to another service or, indirectly,
 645            	    enqueue it to a non-asynchronous message queue. The code
 646            	    example below shows how this works:
 647            	  </p>
 648            
 649            <pre>
 650               cout &lt;&lt; " sending LEGACY to test server" &lt;&lt; endl;
 651               
 652               Message *legacy = new Message(0x11100011, 
 653            				 Message::getNextKey());
 654               
 655               AsyncLegacyOperationStart *req = 
 656                  new AsyncLegacyOperationStart(q_client-&gt;get_next_xid(), 
 657            				    0, 
 658            				    services[0],
 659            				    legacy, 
 660            				    q_client-&gt;getQueueId());
 661               reply = q_client-&gt;SendWait(req);
 662               delete req;
 663 mday   1.2    delete reply;
 664               
 665            </pre>
 666            	  <p>
 667            	   The code sample above shows a <code>Message</code> object
 668            	   being embedded inside an
 669            	    <code>AsyncLegacyOperationStart</code> message and sent
 670            	    using the <code>SendWait</code>API. 
 671            	  </p>
 672            
 673            	  <h3>Default Handler for Legacy Messages</h3>
 674            	  <p>
 675            	    The <code>MessageQueueService</code> class has a default
 676            	    handler for legacy messages that extracts the
 677            	    <code>Message</code> out of its asynchronous "envelope"
 678            	    and dispatches it using the pre-existing synchronous
 679            	    interface, as shown below. 
 680            	  </p>
 681            
 682            <pre>
 683            void MessageQueueService::handle_AsyncLegacyOperationStart(
 684 mday   1.2                                                AsyncLegacyOperationStart *req)
 685            {
 686               // remove the legacy message from the request and enqueue it to its destination
 687               Uint32 result = async_results::CIM_NAK;
 688               
 689               Message *legacy = req-&gt;act;
 690               if ( legacy != 0 )
 691               {
 692                  MessageQueue* queue = MessageQueue::lookup(req-&gt;legacy_destination);
 693                  if( queue != 0 )
 694                  {
 695            	// Enqueue the response:
 696            	 queue-&gt;enqueue(legacy);
 697            	 result = async_results::OK;
 698                  }
 699               }
 700               _make_response(req, result);
 701            }
 702            
 703            </pre>
 704            
 705 mday   1.2 	  <p>
 706            	    The default handler shown above extracts the legacy
 707            	    message and attempts to <code>enqueue</code> that message
 708            	    syncrhonously using the pre-existing interface.
 709            	  </p>
 710            
 711            <h3>Example of Custom Handler for Legacy Messages</h3>
 712            	  <p>
 713            	    By implementing the virtual
 714            	    <code>_handle_async_request</code> method, 
 715            	    a service can choose to implement its own handler for
 716            	    Legacy messages, as the code below shows:
 717            	  </p>
 718            
 719            <ol>
 720            
 721            <li><b>Implement the virtual <code>_handle_async_request</code> method.</b></li>
 722            <pre>
 723            void MessageQueueServer::_handle_async_request(AsyncRequest *req)
 724            {
 725               if (req->getType() == 0x04100000 )
 726 mday   1.2    {
 727                  req->op->processing();
 728                  handle_test_request(req);
 729               }
 730               else if ( req->getType() == async_messages::CIMSERVICE_STOP )
 731               {
 732                  req->op->processing();
 733                  handle_CimServiceStop(static_cast<CimServiceStop *>(req));
 734               }
 735            </pre>
 736            <li><b>Implement a dispatcher for <code>ASYNC_LEGACY_OP_START</code></b></li>
 737 martin 1.5 <pre>   else if ( req->getType() == async_messages::ASYNC_LEGACY_OP_START )
 738 mday   1.2    {
 739                  req->op->processing();
 740                  handle_LegacyOpStart(static_cast<AsyncLegacyOperationStart *>(req));
 741               }
 742               
 743               else
 744                  Base::_handle_async_request(req);
 745            }
 746            
 747            </pre>
 748            <li><b>Implement a dispatcher for <code>ASYNC_LEGACY_OP_START</code></b></li>
 749            <pre>
 750            void MessageQueueServer::handle_LegacyOpStart(AsyncLegacyOperationStart *req)
 751            {
 752            
 753               Message *legacy = req-&gt;act;
 754               cout &lt;&lt; " ### handling legacy messages " &lt;&lt; endl;
 755               
 756            
 757                  AsyncReply *resp =  
 758            	 new AsyncReply(async_messages::REPLY, 
 759 mday   1.2 			req-&gt;getKey(), 
 760            			req-&gt;getRouting(), 
 761            			0, 
 762            			req-&gt;op, 
 763            			async_results::OK, 
 764            			req-&gt;resp, 
 765            			req-&gt;block);
 766                  _completeAsyncResponse(req, resp, ASYNC_OPSTATE_COMPLETE, 0 );
 767            
 768                  if (legacy != 0 )
 769            	 cout &lt;&lt; " legacy msg type: " &lt;&lt; legacy-&gt;getType() &lt;&lt; endl;
 770                  
 771            }
 772            
 773            </pre>
 774            
 775            
 776            </ol>
 777 mday   1.1 
 778                <hr>
 779 mday   1.3 
 780            
 781 mday   1.4 <a name="non-blocking"><h2>Sending Messages without Blocking (Async with Callback)</h2></a>
 782 mday   1.3 
 783            	      <p>
 784            		Whenever there is a possibility that the processing of
 785            		one message may generate a nested message (message
 786            		generated within the handler of a message) it is
 787            		necessary to send messages without blocking, and to
 788            		receive responses via callback routines. The diagram
 789            		below shows the (more complicated) flow of
 790            		non-blocking messages. 
 791            	      </p>
 792            <br>
 793            	      <div class="exampleOuter"><div class="exampleInner">
 794 martin 1.5       <pre>      Service A--Message----1----> 
 795 mday   1.3                                |
 796                    . <-----------(return)-+----->-(loop)--->-+
 797                    .                      |  Meta Dispatcher | 
 798                    .                      +----<-----<---<---+
 799                    .                                      Message---2-->Service B
 800                    .                                                            |
 801                    .                                        <--Response--3------+
 802                    .                                        | 
 803                    .                        +--<--<-----<-----+--(return)---->
 804                    .                        | Meta Dispatcher |  
 805                  Service A <--Callback--4---+--->-(loop)-->---+
 806                               |       ^
 807                               +-------+
 808                </pre>
 809            		</div></div>
 810            
 811            	      <h3>Test Program</h3>
 812            	      
 813            	      <p>
 814            		There is a test program that sends and receives
 815            		non-blocking messages in 
 816 mday   1.3 		<code>$(PEGASUS_ROOT)/src/Pegasus/Common/tests/async_callback/</code>
 817            	      </p>
 818            
 819            	      <h3>SendAsync method</h3>
 820            
 821            	      <p>
 822            		The <code>MessageQueueService</code> class sends
 823            		non-blocking messages using the <code>SendAsync</code>
 824            		method from <code>MessageQueueService.h</code>.
 825 mday   1.4 	      </p><br>
 826 mday   1.3 
 827 mday   1.1 
 828 mday   1.4 	      <div class="exampleOuter"><div class="exampleInner">
 829 mday   1.1 <pre>
 830 mday   1.4 Boolean <b><font color=#000000>SendAsync</font></b><font color=#990000>(</font>AsyncOpNode <font color=#990000>*</font>op<font color=#990000>,</font> 
 831             		  Uint32 destination<font color=#990000>,</font>
 832             		  <font color=#009900>void</font> <font color=#990000>(</font><font color=#990000>*</font>callback<font color=#990000>)</font><font color=#990000>(</font>AsyncOpNode <font color=#990000>*</font><font color=#990000>,</font> MessageQueue <font color=#990000>*</font><font color=#990000>,</font> <font color=#009900>void</font> <font color=#990000>*</font><font color=#990000>)</font><font color=#990000>,</font>
 833            		  MessageQueue <font color=#990000>*</font>callback_q<font color=#990000>,</font>
 834            		  <font color=#009900>void</font> <font
 835            						      color=#990000>*</font>callback_ptr<font color=#990000>)</font><font color=#990000>;</font>
 836            		</pre>
 837            		<br>
 838            		<div class="note">
 839            		  <var>AsyncOpNode *op (In)</var> is the shared data
 840            		  structure that controls the message flow and
 841            		  consolidates the response data. This data structure is
 842            		  also passed to the callback function as the first
 843            		  parameter. The caller must
 844            		  allocate and free this data structure. <br>
 845            		  <br>
 846            		  <var>Uint32 destination (In)</var> is the queue ID of
 847            		  the service which will receive the asynchronous
 848            		  request message.</var><br>
 849            		  <br>
 850            		  <var>void (*callback)(AsyncOpNode *, MessageQueue *,
 851 mday   1.4 		    void *) (In)</var> is the static class method that
 852            		  will be called when the request/response pair is complete.<br>
 853            		  <br>
 854            		  The callback is always passed <var>op</var> as the
 855            		  first parameter. The second parameter is the
 856            		  <var>MessageQueue *</var> object instance that is
 857            		  executing the callback function. Because callback
 858            		  functions must be static class methods, the callback
 859            		  can use the <var>MessageQueue *</var> parameter as a
 860            		  pseudo <var>this</var> pointer. <br>
 861            		  <br>
 862            		  <var>MessageQueue *callback_q (In)</var> is the
 863            		  queue pointer that will be passed to the callback
 864            		  routine as the second parameter. It also controls
 865            		  which queue instance receives the callback.
 866            		  <br>
 867            		  <br>
 868            		  <var>void *callback_ptr (In)</var> is a pointer that will
 869            		  be passed to the callback function. 
 870            
 871            		</div>
 872 mday   1.4 	      </div></div>
 873 mday   1.1 
 874 mday   1.4 	      <br>
 875 mday   1.1 
 876 mday   1.4 	      <h3>How the Meta Dispatcher Processes Non-Blocking Messages</h3>
 877            	      <p>
 878            		The focus of processing non-blocking messages is to
 879            		remove the possibility of deadlock. Therefore, all
 880            		message processing is performed by background
 881            		threads. All access by services to shared data
 882            		structures is discrete in the sense that one service
 883            		never calls into another service. For example,
 884            		callback routines are executed by the background
 885            		thread of the receiving service. (As opposed to the
 886            		sending service making a callback <i>into</i> the
 887            		receiving service.) 
 888            	      </p>
 889 mday   1.1 
 890 mday   1.4 		  <ol>
 891            		    <li>The requesting service creates a request, an
 892            		    <code>AsyncOpNode</code> and calls
 893            		    <code>MessageQueueService::SendAsync(...)</code>.</li>
 894            		    <li><code>SendAsync</code> marks the
 895            		    <code>AsyncOpNode</code> as
 896            		    <code>ASYNC_OPFLAGS_CALLBACK</code> with the
 897            		    <code>ASYNC_OPSTATE_COMPLETE</code> bit
 898            		    <i>clear</i>.</li> <li>The Meta Dispatcher routes
 899            		    the <code>AsyncOpNode</code> to the responding
 900            		    service.</li> <li>The responding service's
 901            		    background thread pulls the message off its
 902            		    internal queue and processes the request. This
 903            		    will frequently entail creating and inserting a
 904            		    response message into the <code>AsyncOpNode</code>
 905            		    by calling
 906            		    <code>AsyncOpNode::put_response(AsyncMessage
 907            		    *)</code>.</li> <li>The responding service
 908            		    completes the response by calling
 909            		    <code>MessageQueueService::_complete_op_node(AsyncOpNode
 910            		    *, Uint32, Uint32, Uint32)</code>.</li>
 911 mday   1.4 		    <li><code>_complete_op_node</code> passes the
 912            		    operation back to the Meta Dispatcher, which
 913            		    routes it <i>back</i> to the requesting
 914            		    service.</li> <li>The requesting service's
 915            		    background thread pulls the
 916            		    <code>AsyncOpNode</code> off its internal queue
 917            		    and calls
 918            		    <code>AsyncOpNode::_async_callback</code>, which
 919            		  is a function pointer that holds the address of the
 920            		  requesting service's static callback method..</li>
 921            		    <li>The requesting service deallocates the op
 922            		      node, the request message, and the response message.</li>
 923            		  </ol>
 924 mday   1.1 
 925 mday   1.4 	      <h3>Virtual Methods for Non-Blocking Messages</h3>
 926            	      <p>
 927            		To use non-blocking messages, a service should
 928            		implement the following virtual method from
 929            		<code>MessageQueueService</code>, plus a static class
 930            		callback function.
 931            	      </p>
 932            	      <div class="exampleOuter"><div class="exampleInner">
 933 martin 1.5 		  <pre><b><font color=#0000FF>virtual</font></b> <font color=#009900>void</font> <b><font color=#000000>_handle_async_request</font></b><font color=#990000>(</font>AsyncRequest <font color=#990000>*</font>req<font color=#990000>)</font><font color=#990000>;</font>
 934 mday   1.4 		  </pre>
 935            		  <div class="note">
 936            		    <var>AsyncRequest *req (In)</var> is the incoming
 937            		    request. <code>req->op</code> is the
 938            		    <code>AsyncOpNode</code> that is controlling this
 939            		    operation. 
 940            		    <br><br>
 941            		    This method is called by the service's background
 942            		    thread whenever an <code>AsyncRequest</code>
 943            		    message is sent to the service. <i>This includes
 944            		      both blocking and non-blocking request messages.</i><p>
 945            		    <p>
 946            		      Within <code>_handle_async_request</code> you
 947            		      can determine whether the message is blocking or
 948            		      non-blocking by using the following code
 949            		      segment: 
 950            <pre><code>
 951            
 952            if(req->op->read_flags() & ASYNC_OPFLAGS_CALLBACK )
 953            {
 954            
 955 mday   1.4    // let everyone know you are working on the request
 956               req->op->processing();
 957            
 958               // this request is part of a callback (non-blocking) operation 
 959               AsyncResponse *response = new AsyncResponse(...);
 960            
 961               // initialize the response message however is appropriate
 962 mday   1.1 
 963 mday   1.4   // put the response to the op node
 964              req->op->put_response(response);
 965 mday   1.1 
 966 mday   1.4   // complete the operation 
 967              _complete_op_node(req->op, 0, 0, async_results::OK);
 968 mday   1.1 
 969 mday   1.4   return;
 970            }
 971            </code></pre>
 972            		  </div>		
 973            		</div>
 974            	      </div>
 975            	      <br>
 976            
 977            
 978            <div class="exampleOuter"><div class = "exampleInner">
 979            
 980            		  <pre>
 981            <b><font color=#0000FF>static</font></b> <font color=#009900>void</font> <b><font color=#000000>async_callback_function</font></b><font color=#990000>(</font>AsyncOpNode <font color=#990000>*</font>op<font color=#990000>,</font> MessageQueue <font color=#990000>*</font><font color=#990000>,</font> <font color=#009900>void</font> <font color=#990000>*</font><font color=#990000>)</font><font color=#990000>;</font>
 982            
 983            		  </pre>
 984            		  <div class="note">
 985            		    <var>AsyncOpNode *op (In)</var> is the
 986            		    incoming shared object that is controlling this
 987            		    completing operation.<br>
 988            		    <br>
 989            		    <var>MessageQueue *q (In)</var> is a pointer to
 990 mday   1.4 		    the class that has received the complete
 991            		    <var>op</var>. This parameter is meant to be used
 992            		    as a <code>this</code> pointer because the
 993            		    callback is a static class method. 
 994            		    <br>
 995            		    <br>
 996            		    <var>void *parm (In)</var> is a pointer that the
 997            		    class passed to <code>SendAsync</code>. It can be
 998            		    used as a convenience for the class.<br>
 999            		    <br>
1000            
1001            		    This method is <i>only</i> called when a
1002            		    non-blocking operation is complete, meaning that
1003            		    the responding service has added a response
1004            		    message to the <var>op</var> and set the
1005            		    <code>ASYNC_OPSTATE_COMPLETE</code> bit. <br><br>
1006            		    <pre>
1007            void my_class::async_callback_function(AsyncOpNode *op,
1008                                                   MessageQueue *q,
1009                                                   void *parm)
1010            {
1011 mday   1.4 
1012               my_class *myself = static_cast&lt;my_class *&gt;(q);
1013               AsyncRequest *request = op-&gt;get_request();
1014               AsyncResponse *response = op-&gt;get_response();
1015            
1016               // process response
1017            
1018               delete request;
1019               delete response;
1020               myself-&gt;put_op(op);
1021               return;
1022            }                                       
1023 mday   1.1 
1024 mday   1.4 		  </div>
1025            		</div>
1026            	      </div>
1027 mday   1.1 
1028 mday   1.4 	      <h3>Strategies for Handling Non-Blocking Responses</h3>
1029            	      <p>
1030 martin 1.5 		All of the legacy message handling code in Pegasus is syncrhonous, meaning that a service can send a request
1031 mday   1.4 		and receive the response in two adjacent lines of
1032            		code. Non-blocking messages are different because the
1033            		timing and existence of a response message is
1034 martin 1.5 		undetermined. </p>
1035 mday   1.4 	      <p>
1036            		There are couple of possible strategies for handing
1037 martin 1.5 		non-blocking response messages. <ol>
1038 mday   1.4 		  <li>Seperate the request creation and sending code
1039            		  from the response handling code into distinct methods.</li>
1040            		<li>Handle request creation and sending and response
1041            		  handling in the same method using different code blocks.
1042            		</ol>
1043            	      </p>
1044 mday   1.1 
1045 mday   1.4 	      <h4>Separate Request and Response Handling Methods</h4>
1046            	      <div class="exampleOuter">
1047            		<div class="exampleInner">
1048            		  <ol>
1049            		    <li>Write the request generation method.
1050            		  <pre>
1051             void my_class::generate_request(Uint32 destination)
1052            {
1053               AsyncOpNode *op = get_op();
1054               my_request *req = new my_request(...);
1055               op-&gt;put_request(req);
1056               
1057               SendAsync(op, destination, my_callback, this, (void *)0);
1058               return;
1059            }
1060            		      </pre>
1061            		      </li>
1062            		    <li> Write the request handling method.
1063            		      <pre>
1064            void my_class::handle_response(AsyncOpNode *op)
1065 mday   1.1 {
1066 mday   1.4    my_response *res = op-&gt;get_response();
1067               if(res != 0 )
1068               {
1069                  // handle response
1070                  delete response;
1071               }
1072               put_op(op);
1073               return;
1074            }
1075            		      </pre>
1076            		    </li>
1077            		    <li> Have your callback method call your response
1078            		      method.
1079            		      <pre>
1080            void my_class:my_callback(AsyncOpNode *op, MessageQueue *queue, void *parm) 
1081            {
1082               my_class *myself = static_cast&lt;queue&gt;
1083 mday   1.1 
1084 mday   1.4    myself-&gt;handle_response(op);
1085               return;
1086            }
1087            		      </pre>
1088            		    </li>
1089            		  </ol>
1090            		</div>
1091            	      </div>
1092 mday   1.1 
1093 mday   1.4 	      
1094            	      <h4>Singe Request and Response Handling Method</h4>
1095            	      <p>
1096            		This strategy requires two separate code blocks within
1097            		the request/response method, and conditional execution
1098 martin 1.5 		depending on the status of the operation. </p>
1099 mday   1.4 	      <p>
1100            		I think the advantage of this strategy is that it
1101            		matches more closely the current<br>
1102            		<code>handleEnqueue(Message *msg)</code> code
1103 martin 1.5 		convention that is in Pegasus. </p>
1104 mday   1.1 
1105 mday   1.4 	      <div class="exampleOuter">
1106            		<div class="exampleInner">
1107            		  <ol>
1108            		    <li>Write the request generation block.
1109            		  <pre>
1110             void my_class::handle_operation(AsyncOpNode *op)
1111 mday   1.1 {
1112 mday   1.4    if(op == NULL)
1113               {
1114                  AsyncOpNode *op = get_op();
1115                  my_request *req = new my_request(...);
1116                  op-&gt;put_request(req);
1117               
1118                  SendAsync(op, destination, my_callback, this, (void *)0);
1119 mday   1.1       
1120 mday   1.4    }
1121               else 
1122               {
1123 mday   1.1 
1124 mday   1.4    }
1125               return;
1126            }
1127            		      </pre>
1128            		      </li>
1129            		    <li> Write the request handling block.
1130            		      <pre>
1131             void my_class::handle_operation(AsyncOpNode *op)
1132 mday   1.1 {
1133 mday   1.4    if(op == NULL)
1134               {
1135                  AsyncOpNode *op = get_op();
1136                  my_request *req = new my_request(...);
1137                  op-&gt;put_request(req);
1138               
1139                  SendAsync(op, destination, my_callback, this, (void *)0);
1140                  
1141               }
1142               else 
1143               {
1144                  my_response *res = op-&gt;get_response();
1145                  if(res != 0 )
1146 mday   1.1       {
1147 mday   1.4          // handle response
1148                     delete response;
1149 mday   1.1       }
1150 mday   1.4       put_op(op);
1151               }
1152               return;
1153            }
1154 mday   1.1 
1155 mday   1.4 		      </pre>
1156            		    </li>
1157            		    <li> Have your callback method call your handler
1158            		      method.
1159            		      <pre>
1160            void my_class:my_callback(AsyncOpNode *op, MessageQueue *queue, void *parm) 
1161 mday   1.1 {
1162 mday   1.4    my_class *myself = static_cast&lt;queue&gt;
1163 mday   1.1 
1164 mday   1.4    myself-&gt;handle_operation(op);
1165               return;
1166 mday   1.1 }
1167 mday   1.4 		      </pre>
1168            		    </li>
1169            		  </ol>
1170            		</div>
1171            	      </div>
1172 mday   1.1 
1173 mday   1.4 <hr><hr>
1174 mday   1.1 
1175 mday   1.4 <h2>Class Definitions</h2>
1176 mday   1.1 
1177 mday   1.4 <h3>cimom (Meta Dispatcher)</h3>
1178 mday   1.1 
1179 martin 1.5 <pre><tt>
1180 martin 1.6 <i><font color=#9A1900>//%LICENSE////////////////////////////////////////////////////////////////</font></i>
1181 mday   1.4 <i><font color=#9A1900>//</font></i>
1182 martin 1.6 <i><font color=#9A1900>// Licensed to The Open Group (TOG) under one or more contributor license</font></i>
1183            <i><font color=#9A1900>// agreements.  Refer to the OpenPegasusNOTICE.txt file distributed with</font></i>
1184            <i><font color=#9A1900>// this work for additional information regarding copyright ownership.</font></i>
1185            <i><font color=#9A1900>// Each contributor licenses this file to you under the OpenPegasus Open</font></i>
1186            <i><font color=#9A1900>// Source License; you may not use this file except in compliance with the</font></i>
1187            <i><font color=#9A1900>// License.</font></i>
1188            <i><font color=#9A1900>//</font></i>
1189            <i><font color=#9A1900>// Permission is hereby granted, free of charge, to any person obtaining a</font></i>
1190            <i><font color=#9A1900>// copy of this software and associated documentation files (the "Software"),</font></i>
1191            <i><font color=#9A1900>// to deal in the Software without restriction, including without limitation</font></i>
1192            <i><font color=#9A1900>// the rights to use, copy, modify, merge, publish, distribute, sublicense,</font></i>
1193            <i><font color=#9A1900>// and/or sell copies of the Software, and to permit persons to whom the</font></i>
1194            <i><font color=#9A1900>// Software is furnished to do so, subject to the following conditions:</font></i>
1195            <i><font color=#9A1900>//</font></i>
1196            <i><font color=#9A1900>// The above copyright notice and this permission notice shall be included</font></i>
1197            <i><font color=#9A1900>// in all copies or substantial portions of the Software.</font></i>
1198            <i><font color=#9A1900>//</font></i>
1199            <i><font color=#9A1900>// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS</font></i>
1200            <i><font color=#9A1900>// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF</font></i>
1201            <i><font color=#9A1900>// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.</font></i>
1202            <i><font color=#9A1900>// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY</font></i>
1203 martin 1.6 <i><font color=#9A1900>// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,</font></i>
1204            <i><font color=#9A1900>// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE</font></i>
1205            <i><font color=#9A1900>// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</font></i>
1206 mday   1.4 <i><font color=#9A1900>//</font></i>
1207 martin 1.6 <i><font color=#9A1900>//////////////////////////////////////////////////////////////////////////</font></i>
1208 mday   1.4 <i><font color=#9A1900>//</font></i>
1209            <i><font color=#9A1900>// Author: Mike Day (mdday@us.ibm.com</font></i>
1210            <i><font color=#9A1900>//</font></i>
1211            <i><font color=#9A1900>// Modified By: </font></i>
1212            <i><font color=#9A1900>//</font></i>
1213 martin 1.6 <i><font color=#9A1900>//////////////////////////////////////////////////////////////////////////</font></i>
1214 mday   1.4 
1215            <b><font color=#000080>#ifndef</font></b> CIMOM_include
1216            <b><font color=#000080>#define</font></b> CIMOM_include
1217            
1218            <b><font color=#000080>#include</font></b> <font color=#FF0000>&lt;Pegasus/Common/Config.h&gt;</font>
1219            <b><font color=#000080>#include</font></b> <font color=#FF0000>&lt;Pegasus/Common/Exception.h&gt;</font>
1220            <b><font color=#000080>#include</font></b> <font color=#FF0000>&lt;Pegasus/Common/MessageQueue.h&gt;</font>
1221            <b><font color=#000080>#include</font></b> <font color=#FF0000>&lt;Pegasus/Common/DQueue.h&gt;</font>
1222            <b><font color=#000080>#include</font></b> <font color=#FF0000>&lt;Pegasus/Common/Thread.h&gt;</font>
1223            <b><font color=#000080>#include</font></b> <font color=#FF0000>&lt;Pegasus/Common/Array.h&gt;</font>
1224            <b><font color=#000080>#include</font></b> <font color=#FF0000>&lt;Pegasus/Common/AsyncOpNode.h&gt;</font>
1225            <b><font color=#000080>#include</font></b> <font color=#FF0000>&lt;Pegasus/Common/CimomMessage.h&gt;</font>
1226            <b><font color=#000080>#include</font></b> <font color=#FF0000>&lt;Pegasus/Common/MessageQueueService.h&gt;</font>
1227            
1228            PEGASUS_NAMESPACE_BEGIN
1229            
1230            <b><font color=#0000FF>extern</font></b> <b><font color=#0000FF>const</font></b> Uint32 CIMOM_Q_ID<font color=#990000>;</font>
1231            
1232            <b><font color=#0000FF>class</font></b> PEGASUS_COMMON_LINKAGE module_capabilities 
1233            <font color=#FF0000>{</font>
1234               <b><font color=#0000FF>public</font></b><font color=#990000>:</font>
1235 mday   1.4       <b><font color=#0000FF>static</font></b> Uint32 async<font color=#990000>;</font>
1236                  <b><font color=#0000FF>static</font></b> Uint32 remote<font color=#990000>;</font>
1237                  <b><font color=#0000FF>static</font></b> Uint32 trusted<font color=#990000>;</font>
1238                  <b><font color=#0000FF>static</font></b> Uint32 paused<font color=#990000>;</font>
1239                  <b><font color=#0000FF>static</font></b> Uint32 stopped<font color=#990000>;</font>
1240            <font color=#FF0000>}</font> <font color=#990000>;</font>
1241            
1242            <b><font color=#0000FF>class</font></b> PEGASUS_COMMON_LINKAGE cimom<font color=#990000>;</font>
1243            
1244            <b><font color=#0000FF>class</font></b> PEGASUS_COMMON_LINKAGE message_module
1245            <font color=#FF0000>{</font>
1246               <b><font color=#0000FF>public</font></b><font color=#990000>:</font>
1247                  <b><font color=#000000>message_module</font></b><font color=#990000>(</font><font color=#009900>void</font><font color=#990000>)</font> 
1248            	 <font color=#990000>:</font> <b><font color=#000000>_name</font></b><font color=#990000>(</font><font color=#990000>)</font><font color=#990000>,</font> <b><font color=#000000>_capabilities</font></b><font color=#990000>(</font><font color=#993399>0</font><font color=#990000>)</font><font color=#990000>,</font> 
1249            	   <b><font color=#000000>_mask</font></b><font color=#990000>(</font><font color=#993399>0</font><font color=#990000>)</font><font color=#990000>,</font> <b><font color=#000000>_q_id</font></b><font color=#990000>(</font><font color=#993399>0</font><font color=#990000>)</font> <font color=#FF0000>{</font> <font color=#FF0000>}</font>
1250                  
1251                  <b><font color=#000000>message_module</font></b><font color=#990000>(</font><b><font color=#0000FF>const</font></b> String <font color=#990000>&amp;</font> name<font color=#990000>,</font>
1252            		     Uint32 capabilities<font color=#990000>,</font>
1253            		     Uint32 mask<font color=#990000>,</font>
1254            		     Uint32 queue<font color=#990000>)</font>
1255                  	 <font color=#990000>:</font> <b><font color=#000000>_name</font></b><font color=#990000>(</font>name<font color=#990000>)</font><font color=#990000>,</font> <b><font color=#000000>_capabilities</font></b><font color=#990000>(</font>capabilities<font color=#990000>)</font><font color=#990000>,</font>
1256 mday   1.4 	   <b><font color=#000000>_mask</font></b><font color=#990000>(</font>mask<font color=#990000>)</font><font color=#990000>,</font> <b><font color=#000000>_q_id</font></b><font color=#990000>(</font>queue<font color=#990000>)</font>  <font color=#FF0000>{</font> <font color=#FF0000>}</font>
1257                  
1258                  Boolean <b><font color=#0000FF>operator</font></b> <font color=#990000>=</font><font color=#990000>=</font> <font color=#990000>(</font><b><font color=#0000FF>const</font></b> message_module <font color=#990000>*</font>mm<font color=#990000>)</font> <b><font color=#0000FF>const</font></b><font color=#990000>;</font>
1259                  Boolean <b><font color=#0000FF>operator</font></b> <font color=#990000>=</font><font color=#990000>=</font> <font color=#990000>(</font><b><font color=#0000FF>const</font></b> String <font color=#990000>&amp;</font> name <font color=#990000>)</font> <b><font color=#0000FF>const</font></b> <font color=#990000>;</font>
1260                  Boolean <b><font color=#0000FF>operator</font></b> <font color=#990000>=</font><font color=#990000>=</font> <font color=#990000>(</font><b><font color=#0000FF>const</font></b> message_module <font color=#990000>&amp;</font> mm <font color=#990000>)</font> <b><font color=#0000FF>const</font></b> <font color=#990000>;</font>
1261                  Boolean <b><font color=#0000FF>operator</font></b> <font color=#990000>=</font><font color=#990000>=</font> <font color=#990000>(</font><b><font color=#0000FF>const</font></b> <font color=#009900>void</font> <font color=#990000>*</font><font color=#990000>)</font> <b><font color=#0000FF>const</font></b><font color=#990000>;</font>
1262                  Boolean <b><font color=#0000FF>operator</font></b> <font color=#990000>=</font><font color=#990000>=</font> <font color=#990000>(</font>Uint32<font color=#990000>)</font> <b><font color=#0000FF>const</font></b><font color=#990000>;</font>
1263                  
1264                  <b><font color=#0000FF>const</font></b> String <font color=#990000>&amp;</font> <b><font color=#000000>get_name</font></b><font color=#990000>(</font><font color=#009900>void</font><font color=#990000>)</font> <b><font color=#0000FF>const</font></b> <font color=#990000>;</font>
1265                  Uint32 <b><font color=#000000>get_capabilities</font></b><font color=#990000>(</font><font color=#009900>void</font><font color=#990000>)</font> <b><font color=#0000FF>const</font></b> <font color=#990000>;</font> 
1266                  Uint32 <b><font color=#000000>get_mask</font></b><font color=#990000>(</font><font color=#009900>void</font><font color=#990000>)</font> <b><font color=#0000FF>const</font></b> <font color=#990000>;</font> 
1267                  Uint32 <b><font color=#000000>get_queue</font></b><font color=#990000>(</font><font color=#009900>void</font><font color=#990000>)</font> <b><font color=#0000FF>const</font></b> <font color=#990000>;</font> 
1268            
1269                  <font color=#009900>void</font> <b><font color=#000000>put_name</font></b><font color=#990000>(</font>String <font color=#990000>&amp;</font> name<font color=#990000>)</font><font color=#990000>;</font>
1270                  <font color=#009900>void</font> <b><font color=#000000>put_capabilities</font></b><font color=#990000>(</font>Uint32 capabilities<font color=#990000>)</font><font color=#990000>;</font>
1271                  <font color=#009900>void</font> <b><font color=#000000>put_mask</font></b><font color=#990000>(</font>Uint32 mask<font color=#990000>)</font><font color=#990000>;</font>
1272                  <font color=#009900>void</font> <b><font color=#000000>put_queue</font></b><font color=#990000>(</font>Uint32 queue<font color=#990000>)</font> <font color=#990000>;</font>
1273            
1274               <b><font color=#0000FF>private</font></b><font color=#990000>:</font>
1275                  String _name<font color=#990000>;</font>
1276                  Uint32 _capabilities<font color=#990000>;</font>
1277 mday   1.4       Uint32 _mask<font color=#990000>;</font>
1278                  <b><font color=#0000FF>struct</font></b> timeval _heartbeat<font color=#990000>;</font>
1279                  
1280            
1281                  Uint32 _q_id<font color=#990000>;</font>
1282                  <b><font color=#0000FF>friend</font></b> <b><font color=#0000FF>class</font></b> cimom<font color=#990000>;</font>
1283            <font color=#FF0000>}</font><font color=#990000>;</font>
1284            
1285            <b><font color=#0000FF>class</font></b> MessageQueueService<font color=#990000>;</font>
1286            
1287            
1288            <b><font color=#0000FF>class</font></b> PEGASUS_COMMON_LINKAGE cimom <font color=#990000>:</font> <b><font color=#0000FF>public</font></b> MessageQueue
1289            <font color=#FF0000>{</font>
1290               <b><font color=#0000FF>public</font></b> <font color=#990000>:</font> 
1291                  <b><font color=#000000>cimom</font></b><font color=#990000>(</font><font color=#009900>void</font><font color=#990000>)</font><font color=#990000>;</font>
1292 mday   1.1       
1293 mday   1.4       <b><font color=#0000FF>virtual</font></b> <font color=#990000>~</font><b><font color=#000000>cimom</font></b><font color=#990000>(</font><font color=#009900>void</font><font color=#990000>)</font> <font color=#990000>;</font>
1294 mday   1.1             
1295 mday   1.4       Boolean <b><font color=#000000>moduleChange</font></b><font color=#990000>(</font><b><font color=#0000FF>struct</font></b> timeval last<font color=#990000>)</font><font color=#990000>;</font>
1296 mday   1.1       
1297 mday   1.4       Uint32 <b><font color=#000000>getModuleCount</font></b><font color=#990000>(</font><font color=#009900>void</font><font color=#990000>)</font><font color=#990000>;</font>
1298                  Uint32 <b><font color=#000000>getModuleIDs</font></b><font color=#990000>(</font>Uint32 <font color=#990000>*</font>ids<font color=#990000>,</font> Uint32 count<font color=#990000>)</font> <b><font color=#0000FF>throw</font></b><font color=#990000>(</font>IPCException<font color=#990000>)</font><font color=#990000>;</font>
1299 mday   1.1 
1300 mday   1.4       AsyncOpNode <font color=#990000>*</font><b><font color=#000000>get_cached_op</font></b><font color=#990000>(</font><font color=#009900>void</font><font color=#990000>)</font> <b><font color=#0000FF>throw</font></b><font color=#990000>(</font>IPCException<font color=#990000>)</font><font color=#990000>;</font>
1301                  <font color=#009900>void</font> <b><font color=#000000>cache_op</font></b><font color=#990000>(</font>AsyncOpNode <font color=#990000>*</font>op<font color=#990000>)</font> <b><font color=#0000FF>throw</font></b><font color=#990000>(</font>IPCException<font color=#990000>)</font><font color=#990000>;</font>
1302                        
1303                  <font color=#009900>void</font> <b><font color=#000000>set_default_op_timeout</font></b><font color=#990000>(</font><b><font color=#0000FF>const</font></b> <b><font color=#0000FF>struct</font></b> timeval <font color=#990000>*</font>buffer<font color=#990000>)</font><font color=#990000>;</font>
1304                  <font color=#009900>void</font> <b><font color=#000000>get_default_op_timeout</font></b><font color=#990000>(</font><b><font color=#0000FF>struct</font></b> timeval <font color=#990000>*</font>timeout<font color=#990000>)</font> <b><font color=#0000FF>const</font></b> <font color=#990000>;</font>
1305 mday   1.1 
1306 mday   1.4       <b><font color=#0000FF>virtual</font></b> <font color=#009900>void</font> <b><font color=#000000>handleEnqueue</font></b><font color=#990000>(</font><font color=#990000>)</font><font color=#990000>;</font>
1307                  <font color=#009900>void</font> <b><font color=#000000>register_module</font></b><font color=#990000>(</font>RegisterCimService <font color=#990000>*</font>msg<font color=#990000>)</font><font color=#990000>;</font>
1308                  <font color=#009900>void</font> <b><font color=#000000>deregister_module</font></b><font color=#990000>(</font>Uint32 quid<font color=#990000>)</font><font color=#990000>;</font>
1309                  <font color=#009900>void</font> <b><font color=#000000>update_module</font></b><font color=#990000>(</font>UpdateCimService <font color=#990000>*</font>msg <font color=#990000>)</font><font color=#990000>;</font>
1310                  <font color=#009900>void</font> <b><font color=#000000>ioctl</font></b><font color=#990000>(</font>AsyncIoctl <font color=#990000>*</font>msg <font color=#990000>)</font><font color=#990000>;</font>
1311            
1312                  <font color=#009900>void</font> <b><font color=#000000>find_service_q</font></b><font color=#990000>(</font>FindServiceQueue <font color=#990000>*</font>msg <font color=#990000>)</font><font color=#990000>;</font>
1313                  <font color=#009900>void</font> <b><font color=#000000>enumerate_service</font></b><font color=#990000>(</font>EnumerateService <font color=#990000>*</font>msg <font color=#990000>)</font><font color=#990000>;</font>
1314                  Boolean <b><font color=#000000>route_async</font></b><font color=#990000>(</font>AsyncOpNode <font color=#990000>*</font>operation<font color=#990000>)</font><font color=#990000>;</font>
1315                  <font color=#009900>void</font> <b><font color=#000000>_shutdown_routed_queue</font></b><font color=#990000>(</font><font color=#009900>void</font><font color=#990000>)</font><font color=#990000>;</font>
1316 mday   1.1       
1317 mday   1.4             
1318               <b><font color=#0000FF>protected</font></b><font color=#990000>:</font>
1319                  Uint32 <b><font color=#000000>get_module_q</font></b><font color=#990000>(</font><b><font color=#0000FF>const</font></b> String <font color=#990000>&amp;</font> name<font color=#990000>)</font><font color=#990000>;</font>
1320                  <b><font color=#0000FF>static</font></b> <font color=#009900>void</font> <b><font color=#000000>_make_response</font></b><font color=#990000>(</font>Message <font color=#990000>*</font>req<font color=#990000>,</font> Uint32 code<font color=#990000>)</font><font color=#990000>;</font>
1321                  <b><font color=#0000FF>static</font></b> <font color=#009900>void</font> <b><font color=#000000>_completeAsyncResponse</font></b><font color=#990000>(</font>AsyncRequest <font color=#990000>*</font>request<font color=#990000>,</font> 
1322            				  AsyncReply <font color=#990000>*</font>reply<font color=#990000>,</font> 
1323            				  Uint32 state<font color=#990000>,</font> 
1324            				  Uint32 flag<font color=#990000>)</font><font color=#990000>;</font>
1325                  <b><font color=#0000FF>static</font></b> <font color=#009900>void</font> <b><font color=#000000>_complete_op_node</font></b><font color=#990000>(</font>AsyncOpNode <font color=#990000>*</font>op<font color=#990000>,</font> Uint32 state<font color=#990000>,</font> Uint32 flag<font color=#990000>,</font> Uint32 code<font color=#990000>)</font><font color=#990000>;</font>
1326                  <b><font color=#0000FF>static</font></b> <font color=#009900>void</font> <b><font color=#000000>_default_callback</font></b><font color=#990000>(</font>AsyncOpNode <font color=#990000>*</font><font color=#990000>,</font> MessageQueue <font color=#990000>*</font><font color=#990000>,</font> <font color=#009900>void</font> <font color=#990000>*</font><font color=#990000>)</font><font color=#990000>;</font>
1327 mday   1.1       
1328 mday   1.4    <b><font color=#0000FF>private</font></b><font color=#990000>:</font>
1329                  <b><font color=#0000FF>struct</font></b> timeval _default_op_timeout<font color=#990000>;</font>
1330                  <b><font color=#0000FF>struct</font></b> timeval _last_module_change<font color=#990000>;</font>
1331                  DQueue<font color=#FF0000>&lt;message_module&gt;</font> _modules<font color=#990000>;</font>
1332 mday   1.1 
1333 mday   1.4       DQueue<font color=#FF0000>&lt;AsyncOpNode&gt;</font> _recycle<font color=#990000>;</font>
1334 mday   1.1       
1335 mday   1.4       AsyncDQueue<font color=#FF0000>&lt;AsyncOpNode&gt;</font> _routed_ops<font color=#990000>;</font>
1336                  DQueue<font color=#FF0000>&lt;AsyncOpNode&gt;</font> _internal_ops<font color=#990000>;</font>
1337 mday   1.1       
1338 mday   1.4       <b><font color=#0000FF>static</font></b> PEGASUS_THREAD_RETURN PEGASUS_THREAD_CDECL <b><font color=#000000>_routing_proc</font></b><font color=#990000>(</font><font color=#009900>void</font> <font color=#990000>*</font><font color=#990000>)</font><font color=#990000>;</font>
1339 mday   1.1 
1340 mday   1.4       Thread _routing_thread<font color=#990000>;</font>
1341 mday   1.1 
1342 mday   1.4       <b><font color=#0000FF>static</font></b> Uint32 <b><font color=#000000>get_xid</font></b><font color=#990000>(</font><font color=#009900>void</font><font color=#990000>)</font><font color=#990000>;</font>
1343                  <font color=#009900>void</font> <b><font color=#000000>_handle_cimom_op</font></b><font color=#990000>(</font>AsyncOpNode <font color=#990000>*</font>op<font color=#990000>,</font> Thread <font color=#990000>*</font>thread<font color=#990000>,</font> MessageQueue <font color=#990000>*</font>queue<font color=#990000>)</font><font color=#990000>;</font>
1344                  Uint32 <b><font color=#000000>_ioctl</font></b><font color=#990000>(</font>Uint32<font color=#990000>,</font> Uint32<font color=#990000>,</font> <font color=#009900>void</font> <font color=#990000>*</font><font color=#990000>)</font><font color=#990000>;</font>
1345 mday   1.1 
1346            
1347 mday   1.4       AtomicInt _die<font color=#990000>;</font>
1348                  AtomicInt _routed_queue_shutdown<font color=#990000>;</font>
1349 mday   1.1       
1350 mday   1.4       <b><font color=#0000FF>static</font></b> AtomicInt _xid<font color=#990000>;</font>
1351                  <b><font color=#0000FF>static</font></b> cimom <font color=#990000>*</font>_global_this<font color=#990000>;</font>
1352 mday   1.1       
1353 mday   1.4       <b><font color=#0000FF>friend</font></b> <b><font color=#0000FF>class</font></b> MessageQueueService<font color=#990000>;</font>
1354 mday   1.1       
1355 mday   1.4 <font color=#FF0000>}</font><font color=#990000>;</font>
1356            
1357            PEGASUS_NAMESPACE_END
1358 mday   1.1 
1359 mday   1.4 <b><font color=#000080>#endif</font></b> <i><font color=#9A1900>// CIMOM_include</font></i>
1360            </tt>
1361            </pre>
1362 mday   1.1 
1363 mday   1.4 <h3>MessageQueueService</h3>
1364 mday   1.1 
1365 martin 1.5 <pre><tt>
1366 martin 1.6 <i><font color=#9A1900>//%LICENSE////////////////////////////////////////////////////////////////</font></i>
1367 mday   1.4 <i><font color=#9A1900>//</font></i>
1368 martin 1.6 <i><font color=#9A1900>// Licensed to The Open Group (TOG) under one or more contributor license</font></i>
1369            <i><font color=#9A1900>// agreements.  Refer to the OpenPegasusNOTICE.txt file distributed with</font></i>
1370            <i><font color=#9A1900>// this work for additional information regarding copyright ownership.</font></i>
1371            <i><font color=#9A1900>// Each contributor licenses this file to you under the OpenPegasus Open</font></i>
1372            <i><font color=#9A1900>// Source License; you may not use this file except in compliance with the</font></i>
1373            <i><font color=#9A1900>// License.</font></i>
1374            <i><font color=#9A1900>//</font></i>
1375            <i><font color=#9A1900>// Permission is hereby granted, free of charge, to any person obtaining a</font></i>
1376            <i><font color=#9A1900>// copy of this software and associated documentation files (the "Software"),</font></i>
1377            <i><font color=#9A1900>// to deal in the Software without restriction, including without limitation</font></i>
1378            <i><font color=#9A1900>// the rights to use, copy, modify, merge, publish, distribute, sublicense,</font></i>
1379            <i><font color=#9A1900>// and/or sell copies of the Software, and to permit persons to whom the</font></i>
1380            <i><font color=#9A1900>// Software is furnished to do so, subject to the following conditions:</font></i>
1381            <i><font color=#9A1900>//</font></i>
1382            <i><font color=#9A1900>// The above copyright notice and this permission notice shall be included</font></i>
1383            <i><font color=#9A1900>// in all copies or substantial portions of the Software.</font></i>
1384            <i><font color=#9A1900>//</font></i>
1385            <i><font color=#9A1900>// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS</font></i>
1386            <i><font color=#9A1900>// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF</font></i>
1387            <i><font color=#9A1900>// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.</font></i>
1388            <i><font color=#9A1900>// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY</font></i>
1389 martin 1.6 <i><font color=#9A1900>// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,</font></i>
1390            <i><font color=#9A1900>// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE</font></i>
1391            <i><font color=#9A1900>// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</font></i>
1392 mday   1.4 <i><font color=#9A1900>//</font></i>
1393 martin 1.6 <i><font color=#9A1900>//////////////////////////////////////////////////////////////////////////</font></i>
1394 mday   1.4 <i><font color=#9A1900>//</font></i>
1395 martin 1.6 <i><font color=#9A1900>// Author: Mike Day (mdday@us.ibm.com</font></i>
1396 mday   1.4 <i><font color=#9A1900>//</font></i>
1397 martin 1.6 <i><font color=#9A1900>// Modified By: </font></i>
1398 mday   1.4 <i><font color=#9A1900>//</font></i>
1399 martin 1.6 <i><font color=#9A1900>//////////////////////////////////////////////////////////////////////////</font></i>
1400 mday   1.4 
1401            <b><font color=#000080>#ifndef</font></b> Pegasus_MessageQueue_Service_h
1402            <b><font color=#000080>#define</font></b> Pegasus_MessageQueue_Service_h
1403            
1404            <b><font color=#000080>#include</font></b> <font color=#FF0000>&lt;Pegasus/Common/Config.h&gt;</font>
1405            <b><font color=#000080>#include</font></b> <font color=#FF0000>&lt;Pegasus/Common/Message.h&gt;</font>
1406            <b><font color=#000080>#include</font></b> <font color=#FF0000>&lt;Pegasus/Common/Exception.h&gt;</font>
1407            <b><font color=#000080>#include</font></b> <font color=#FF0000>&lt;Pegasus/Common/IPC.h&gt;</font>
1408            <b><font color=#000080>#include</font></b> <font color=#FF0000>&lt;Pegasus/Common/Thread.h&gt;</font>
1409            <b><font color=#000080>#include</font></b> <font color=#FF0000>&lt;Pegasus/Common/AsyncOpNode.h&gt;</font>
1410            <b><font color=#000080>#include</font></b> <font color=#FF0000>&lt;Pegasus/Common/Cimom.h&gt;</font>
1411            <b><font color=#000080>#include</font></b> <font color=#FF0000>&lt;Pegasus/Common/CimomMessage.h&gt;</font>
1412            
1413            PEGASUS_NAMESPACE_BEGIN
1414            
1415            <b><font color=#0000FF>extern</font></b> <b><font color=#0000FF>const</font></b> Uint32 CIMOM_Q_ID<font color=#990000>;</font>
1416            
1417            <b><font color=#0000FF>class</font></b> message_module<font color=#990000>;</font>
1418            
1419            <b><font color=#0000FF>class</font></b> PEGASUS_COMMON_LINKAGE MessageQueueService <font color=#990000>:</font> <b><font color=#0000FF>public</font></b> MessageQueue
1420            <font color=#FF0000>{</font>
1421 mday   1.4    <b><font color=#0000FF>public</font></b><font color=#990000>:</font>
1422            
1423                  <b><font color=#0000FF>typedef</font></b> MessageQueue Base<font color=#990000>;</font>
1424                  
1425                  <b><font color=#000000>MessageQueueService</font></b><font color=#990000>(</font><b><font color=#0000FF>const</font></b> <font color=#009900>char</font> <font color=#990000>*</font>name<font color=#990000>,</font> Uint32 queueID<font color=#990000>,</font> 
1426            			  Uint32 capabilities <font color=#990000>=</font> <font color=#993399>0</font><font color=#990000>,</font> 
1427            			  Uint32 mask <font color=#990000>=</font> message_mask<font color=#990000>:</font><font color=#990000>:</font>type_cimom <font color=#990000>|</font> 
1428            			  message_mask<font color=#990000>:</font><font color=#990000>:</font>type_service <font color=#990000>|</font> 
1429            			  message_mask<font color=#990000>:</font><font color=#990000>:</font>ha_request <font color=#990000>|</font> 
1430            			  message_mask<font color=#990000>:</font><font color=#990000>:</font>ha_reply <font color=#990000>|</font> 
1431            			  message_mask<font color=#990000>:</font><font color=#990000>:</font>ha_async <font color=#990000>)</font> <font color=#990000>;</font>
1432                  
1433                  <b><font color=#0000FF>virtual</font></b> <font color=#990000>~</font><b><font color=#000000>MessageQueueService</font></b><font color=#990000>(</font><font color=#009900>void</font><font color=#990000>)</font><font color=#990000>;</font>
1434                        
1435                  <b><font color=#0000FF>virtual</font></b> Boolean <b><font color=#000000>isAsync</font></b><font color=#990000>(</font><font color=#009900>void</font><font color=#990000>)</font> <font color=#FF0000>{</font>  <b><font color=#0000FF>return</font></b> <b><font color=#0000FF>true</font></b><font color=#990000>;</font>  <font color=#FF0000>}</font>
1436                        
1437                  <b><font color=#0000FF>virtual</font></b> <font color=#009900>void</font> <b><font color=#000000>enqueue</font></b><font color=#990000>(</font>Message <font color=#990000>*</font><font color=#990000>)</font> <b><font color=#0000FF>throw</font></b><font color=#990000>(</font>IPCException<font color=#990000>)</font><font color=#990000>;</font>
1438 mday   1.1       
1439 mday   1.4       AsyncReply <font color=#990000>*</font><b><font color=#000000>SendWait</font></b><font color=#990000>(</font>AsyncRequest <font color=#990000>*</font>request<font color=#990000>)</font><font color=#990000>;</font>
1440                  Boolean <b><font color=#000000>SendAsync</font></b><font color=#990000>(</font>AsyncOpNode <font color=#990000>*</font>op<font color=#990000>,</font> 
1441            			Uint32 destination<font color=#990000>,</font>
1442            			<font color=#009900>void</font> <font color=#990000>(</font><font color=#990000>*</font>callback<font color=#990000>)</font><font color=#990000>(</font>AsyncOpNode <font color=#990000>*</font><font color=#990000>,</font> MessageQueue <font color=#990000>*</font><font color=#990000>,</font> <font color=#009900>void</font> <font color=#990000>*</font><font color=#990000>)</font><font color=#990000>,</font>
1443            			MessageQueue <font color=#990000>*</font>callback_q<font color=#990000>,</font>
1444            			<font color=#009900>void</font> <font color=#990000>*</font>callback_ptr<font color=#990000>)</font><font color=#990000>;</font>
1445                  Boolean  <b><font color=#000000>SendForget</font></b><font color=#990000>(</font>Message <font color=#990000>*</font>msg<font color=#990000>)</font><font color=#990000>;</font>
1446                  Boolean <b><font color=#000000>ForwardOp</font></b><font color=#990000>(</font>AsyncOpNode <font color=#990000>*</font><font color=#990000>,</font> Uint32 destination<font color=#990000>)</font><font color=#990000>;</font>
1447                  
1448            
1449                  Boolean <b><font color=#000000>register_service</font></b><font color=#990000>(</font>String name<font color=#990000>,</font> Uint32 capabilities<font color=#990000>,</font> Uint32 mask<font color=#990000>)</font><font color=#990000>;</font>
1450                  Boolean <b><font color=#000000>update_service</font></b><font color=#990000>(</font>Uint32 capabilities<font color=#990000>,</font> Uint32 mask<font color=#990000>)</font><font color=#990000>;</font>
1451                  Boolean <b><font color=#000000>deregister_service</font></b><font color=#990000>(</font><font color=#009900>void</font><font color=#990000>)</font><font color=#990000>;</font>
1452                  <b><font color=#0000FF>virtual</font></b> <font color=#009900>void</font> <b><font color=#000000>_shutdown_incoming_queue</font></b><font color=#990000>(</font><font color=#009900>void</font><font color=#990000>)</font><font color=#990000>;</font>
1453                  
1454                  <font color=#009900>void</font> <b><font color=#000000>find_services</font></b><font color=#990000>(</font>String name<font color=#990000>,</font>
1455            			 Uint32 capabilities<font color=#990000>,</font> 
1456            			 Uint32 mask<font color=#990000>,</font> 
1457            			 Array<font color=#FF0000>&lt;Uint32&gt;</font> <font color=#990000>*</font>results<font color=#990000>)</font><font color=#990000>;</font>
1458                  <font color=#009900>void</font> <b><font color=#000000>enumerate_service</font></b><font color=#990000>(</font>Uint32 queue<font color=#990000>,</font> message_module <font color=#990000>*</font>result<font color=#990000>)</font><font color=#990000>;</font>
1459                  Uint32 <b><font color=#000000>get_next_xid</font></b><font color=#990000>(</font><font color=#009900>void</font><font color=#990000>)</font><font color=#990000>;</font>
1460 mday   1.4       AsyncOpNode <font color=#990000>*</font><b><font color=#000000>get_op</font></b><font color=#990000>(</font><font color=#009900>void</font><font color=#990000>)</font><font color=#990000>;</font>
1461                  <font color=#009900>void</font> <b><font color=#000000>return_op</font></b><font color=#990000>(</font>AsyncOpNode <font color=#990000>*</font>op<font color=#990000>)</font><font color=#990000>;</font>
1462            
1463                  Uint32 _mask<font color=#990000>;</font>
1464                  AtomicInt _die<font color=#990000>;</font>
1465               <b><font color=#0000FF>protected</font></b><font color=#990000>:</font>
1466                  <b><font color=#0000FF>virtual</font></b> Boolean <b><font color=#000000>accept_async</font></b><font color=#990000>(</font>AsyncOpNode <font color=#990000>*</font>op<font color=#990000>)</font><font color=#990000>;</font>
1467                  <b><font color=#0000FF>virtual</font></b> Boolean <b><font color=#000000>messageOK</font></b><font color=#990000>(</font><b><font color=#0000FF>const</font></b> Message <font color=#990000>*</font>msg<font color=#990000>)</font> <font color=#990000>;</font>
1468                  <b><font color=#0000FF>virtual</font></b> <font color=#009900>void</font> <b><font color=#000000>handleEnqueue</font></b><font color=#990000>(</font><font color=#009900>void</font><font color=#990000>)</font> <font color=#990000>=</font> <font color=#993399>0</font><font color=#990000>;</font>
1469                  <b><font color=#0000FF>virtual</font></b> <font color=#009900>void</font> <b><font color=#000000>handleEnqueue</font></b><font color=#990000>(</font>Message <font color=#990000>*</font><font color=#990000>)</font> <font color=#990000>=</font> <font color=#993399>0</font><font color=#990000>;</font>
1470                  Boolean <b><font color=#000000>_enqueueResponse</font></b><font color=#990000>(</font>Message <font color=#990000>*</font><font color=#990000>,</font> Message <font color=#990000>*</font><font color=#990000>)</font><font color=#990000>;</font>
1471                  <b><font color=#0000FF>virtual</font></b> <font color=#009900>void</font> <b><font color=#000000>_handle_incoming_operation</font></b><font color=#990000>(</font>AsyncOpNode <font color=#990000>*</font><font color=#990000>)</font><font color=#990000>;</font>
1472                  
1473                  <b><font color=#0000FF>virtual</font></b> <font color=#009900>void</font> <b><font color=#000000>_handle_async_request</font></b><font color=#990000>(</font>AsyncRequest <font color=#990000>*</font>req<font color=#990000>)</font><font color=#990000>;</font>
1474                  <b><font color=#0000FF>virtual</font></b> <font color=#009900>void</font> <b><font color=#000000>_handle_async_callback</font></b><font color=#990000>(</font>AsyncOpNode <font color=#990000>*</font>operation<font color=#990000>)</font><font color=#990000>;</font>     
1475                  <b><font color=#0000FF>virtual</font></b> <font color=#009900>void</font> <b><font color=#000000>_make_response</font></b><font color=#990000>(</font>Message <font color=#990000>*</font>req<font color=#990000>,</font> Uint32 code<font color=#990000>)</font><font color=#990000>;</font>
1476                  
1477            
1478                  <b><font color=#0000FF>virtual</font></b> <font color=#009900>void</font> <b><font color=#000000>handle_heartbeat_request</font></b><font color=#990000>(</font>AsyncRequest <font color=#990000>*</font>req<font color=#990000>)</font><font color=#990000>;</font>
1479                  <b><font color=#0000FF>virtual</font></b> <font color=#009900>void</font> <b><font color=#000000>handle_heartbeat_reply</font></b><font color=#990000>(</font>AsyncReply <font color=#990000>*</font>rep<font color=#990000>)</font><font color=#990000>;</font>
1480                  
1481 mday   1.4       <b><font color=#0000FF>virtual</font></b> <font color=#009900>void</font> <b><font color=#000000>handle_AsyncIoctl</font></b><font color=#990000>(</font>AsyncIoctl <font color=#990000>*</font>req<font color=#990000>)</font><font color=#990000>;</font>
1482                  <b><font color=#0000FF>virtual</font></b> <font color=#009900>void</font> <b><font color=#000000>handle_CimServiceStart</font></b><font color=#990000>(</font>CimServiceStart <font color=#990000>*</font>req<font color=#990000>)</font><font color=#990000>;</font>
1483                  <b><font color=#0000FF>virtual</font></b> <font color=#009900>void</font> <b><font color=#000000>handle_CimServiceStop</font></b><font color=#990000>(</font>CimServiceStop <font color=#990000>*</font>req<font color=#990000>)</font><font color=#990000>;</font>
1484                  <b><font color=#0000FF>virtual</font></b> <font color=#009900>void</font> <b><font color=#000000>handle_CimServicePause</font></b><font color=#990000>(</font>CimServicePause <font color=#990000>*</font>req<font color=#990000>)</font><font color=#990000>;</font>
1485                  <b><font color=#0000FF>virtual</font></b> <font color=#009900>void</font> <b><font color=#000000>handle_CimServiceResume</font></b><font color=#990000>(</font>CimServiceResume <font color=#990000>*</font>req<font color=#990000>)</font><font color=#990000>;</font>
1486                  
1487                  <b><font color=#0000FF>virtual</font></b> <font color=#009900>void</font> <b><font color=#000000>handle_AsyncOperationStart</font></b><font color=#990000>(</font>AsyncOperationStart <font color=#990000>*</font>req<font color=#990000>)</font><font color=#990000>;</font>
1488                  <b><font color=#0000FF>virtual</font></b> <font color=#009900>void</font> <b><font color=#000000>handle_AsyncOperationResult</font></b><font color=#990000>(</font>AsyncOperationResult <font color=#990000>*</font>rep<font color=#990000>)</font><font color=#990000>;</font>
1489                  <b><font color=#0000FF>virtual</font></b> <font color=#009900>void</font> <b><font color=#000000>handle_AsyncLegacyOperationStart</font></b><font color=#990000>(</font>AsyncLegacyOperationStart <font color=#990000>*</font>req<font color=#990000>)</font><font color=#990000>;</font>
1490                  <b><font color=#0000FF>virtual</font></b> <font color=#009900>void</font> <b><font color=#000000>handle_AsyncLegacyOperationResult</font></b><font color=#990000>(</font>AsyncLegacyOperationResult <font color=#990000>*</font>rep<font color=#990000>)</font><font color=#990000>;</font>
1491            
1492                  <font color=#009900>void</font> <b><font color=#000000>_completeAsyncResponse</font></b><font color=#990000>(</font>AsyncRequest <font color=#990000>*</font>request<font color=#990000>,</font> 
1493            				 AsyncReply <font color=#990000>*</font>reply<font color=#990000>,</font> 
1494            				 Uint32 state<font color=#990000>,</font> 
1495            				 Uint32 flag<font color=#990000>)</font><font color=#990000>;</font>
1496                  <font color=#009900>void</font> <b><font color=#000000>_complete_op_node</font></b><font color=#990000>(</font>AsyncOpNode <font color=#990000>*</font><font color=#990000>,</font> Uint32<font color=#990000>,</font> Uint32<font color=#990000>,</font> Uint32<font color=#990000>)</font><font color=#990000>;</font>
1497                  
1498            
1499                  <b><font color=#0000FF>static</font></b> cimom <font color=#990000>*</font>_meta_dispatcher<font color=#990000>;</font>
1500                  <b><font color=#0000FF>static</font></b> AtomicInt _service_count<font color=#990000>;</font>
1501                  <b><font color=#0000FF>static</font></b> Mutex _meta_dispatcher_mutex<font color=#990000>;</font>
1502 mday   1.4       
1503               <b><font color=#0000FF>private</font></b><font color=#990000>:</font> 
1504                  
1505                  DQueue<font color=#FF0000>&lt;AsyncOpNode&gt;</font> _pending<font color=#990000>;</font>
1506                  AsyncDQueue<font color=#FF0000>&lt;AsyncOpNode&gt;</font> _incoming<font color=#990000>;</font>
1507                  AsyncDQueue<font color=#FF0000>&lt;AsyncOpNode&gt;</font> _callback<font color=#990000>;</font>
1508                  
1509                  <b><font color=#0000FF>static</font></b> PEGASUS_THREAD_RETURN PEGASUS_THREAD_CDECL <b><font color=#000000>_req_proc</font></b><font color=#990000>(</font><font color=#009900>void</font> <font color=#990000>*</font><font color=#990000>)</font><font color=#990000>;</font>
1510                  <b><font color=#0000FF>static</font></b> <font color=#009900>void</font> <b><font color=#000000>_sendwait_callback</font></b><font color=#990000>(</font>AsyncOpNode <font color=#990000>*</font><font color=#990000>,</font> MessageQueue <font color=#990000>*</font><font color=#990000>,</font> <font color=#009900>void</font> <font color=#990000>*</font><font color=#990000>)</font><font color=#990000>;</font>
1511                  AtomicInt _incoming_queue_shutdown<font color=#990000>;</font>
1512                  Thread _req_thread<font color=#990000>;</font>
1513                  <b><font color=#0000FF>struct</font></b> timeval _default_op_timeout<font color=#990000>;</font>
1514                  <b><font color=#0000FF>static</font></b> AtomicInt _xid<font color=#990000>;</font>
1515                  <b><font color=#0000FF>friend</font></b> <b><font color=#0000FF>class</font></b> cimom<font color=#990000>;</font>
1516            <font color=#FF0000>}</font><font color=#990000>;</font>
1517 mday   1.1 
1518 mday   1.4 PEGASUS_NAMESPACE_END
1519 mday   1.1 
1520 mday   1.4 <b><font color=#000080>#endif</font></b> <i><font color=#9A1900>/* Pegasus_MessageQueue_Service_h */</font></i>
1521            </tt>
1522            </pre>
1523 mday   1.1 
1524 mday   1.4 <h3>Asynchronous Messages</h3>
1525 mday   1.1 
1526 martin 1.5 <pre><tt>
1527 martin 1.6 <i><font color=#9A1900>//%LICENSE////////////////////////////////////////////////////////////////</font></i>
1528            <i><font color=#9A1900>//</font></i>
1529            <i><font color=#9A1900>// Licensed to The Open Group (TOG) under one or more contributor license</font></i>
1530            <i><font color=#9A1900>// agreements.  Refer to the OpenPegasusNOTICE.txt file distributed with</font></i>
1531            <i><font color=#9A1900>// this work for additional information regarding copyright ownership.</font></i>
1532            <i><font color=#9A1900>// Each contributor licenses this file to you under the OpenPegasus Open</font></i>
1533            <i><font color=#9A1900>// Source License; you may not use this file except in compliance with the</font></i>
1534            <i><font color=#9A1900>// License.</font></i>
1535            <i><font color=#9A1900>//</font></i>
1536            <i><font color=#9A1900>// Permission is hereby granted, free of charge, to any person obtaining a</font></i>
1537            <i><font color=#9A1900>// copy of this software and associated documentation files (the "Software"),</font></i>
1538            <i><font color=#9A1900>// to deal in the Software without restriction, including without limitation</font></i>
1539            <i><font color=#9A1900>// the rights to use, copy, modify, merge, publish, distribute, sublicense,</font></i>
1540            <i><font color=#9A1900>// and/or sell copies of the Software, and to permit persons to whom the</font></i>
1541            <i><font color=#9A1900>// Software is furnished to do so, subject to the following conditions:</font></i>
1542            <i><font color=#9A1900>//</font></i>
1543            <i><font color=#9A1900>// The above copyright notice and this permission notice shall be included</font></i>
1544            <i><font color=#9A1900>// in all copies or substantial portions of the Software.</font></i>
1545            <i><font color=#9A1900>//</font></i>
1546            <i><font color=#9A1900>// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS</font></i>
1547            <i><font color=#9A1900>// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF</font></i>
1548 martin 1.6 <i><font color=#9A1900>// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.</font></i>
1549            <i><font color=#9A1900>// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY</font></i>
1550            <i><font color=#9A1900>// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,</font></i>
1551            <i><font color=#9A1900>// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE</font></i>
1552            <i><font color=#9A1900>// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</font></i>
1553 mday   1.4 <i><font color=#9A1900>//</font></i>
1554 martin 1.6 <i><font color=#9A1900>//////////////////////////////////////////////////////////////////////////</font></i>
1555 mday   1.4 <i><font color=#9A1900>//</font></i>
1556 martin 1.6 <i><font color=#9A1900>// Author: Mike Day (mdday@us.ibm.com</font></i>
1557            <i><font color=#9A1900>//</font></i>
1558            <i><font color=#9A1900>// Modified By: </font></i>
1559            <i><font color=#9A1900>//</font></i>
1560            <i><font color=#9A1900>//////////////////////////////////////////////////////////////////////////</font></i>
1561 mday   1.4 
1562            <b><font color=#000080>#ifndef</font></b> Pegasus_CimomMessage_h
1563            <b><font color=#000080>#define</font></b> Pegasus_CimomMessage_h
1564            
1565            <b><font color=#000080>#include</font></b> <font color=#FF0000>&lt;Pegasus/Common/Config.h&gt;</font>
1566            <b><font color=#000080>#include</font></b> <font color=#FF0000>&lt;Pegasus/Common/Exception.h&gt;</font>
1567            <b><font color=#000080>#include</font></b> <font color=#FF0000>&lt;Pegasus/Common/MessageQueue.h&gt;</font>
1568            <b><font color=#000080>#include</font></b> <font color=#FF0000>&lt;Pegasus/Common/AsyncOpNode.h&gt;</font>
1569            
1570            PEGASUS_NAMESPACE_BEGIN
1571            <i><font color=#9A1900>//</font></i>
1572            <i><font color=#9A1900>// This identifier is the queue id for CIMOM queue. It is initialized in</font></i>
1573            <i><font color=#9A1900>// CimomMessage.cpp by calling MessageQueue::getNextQueueId(). Note that</font></i>
1574            <i><font color=#9A1900>// this value is passed in the constructor for the CIMOM queue.</font></i>
1575            <i><font color=#9A1900>//</font></i>
1576            <b><font color=#0000FF>extern</font></b> <b><font color=#0000FF>const</font></b> Uint32 CIMOM_Q_ID<font color=#990000>;</font>
1577            
1578            <b><font color=#0000FF>class</font></b> AsyncOpNode<font color=#990000>;</font>
1579            
1580            <b><font color=#0000FF>class</font></b> PEGASUS_COMMON_LINKAGE async_results
1581            <font color=#FF0000>{</font>
1582 mday   1.4    <b><font color=#0000FF>public</font></b><font color=#990000>:</font>
1583                  <b><font color=#0000FF>static</font></b> <b><font color=#0000FF>const</font></b> Uint32 OK<font color=#990000>;</font>
1584                  <b><font color=#0000FF>static</font></b> <b><font color=#0000FF>const</font></b> Uint32 PARAMETER_ERROR<font color=#990000>;</font>
1585                  <b><font color=#0000FF>static</font></b> <b><font color=#0000FF>const</font></b> Uint32 MODULE_ALREADY_REGISTERED<font color=#990000>;</font>
1586                  <b><font color=#0000FF>static</font></b> <b><font color=#0000FF>const</font></b> Uint32 MODULE_NOT_FOUND<font color=#990000>;</font>
1587                  <b><font color=#0000FF>static</font></b> <b><font color=#0000FF>const</font></b> Uint32 INTERNAL_ERROR<font color=#990000>;</font>
1588            
1589                  <b><font color=#0000FF>static</font></b> <b><font color=#0000FF>const</font></b> Uint32 ASYNC_STARTED<font color=#990000>;</font>
1590                  <b><font color=#0000FF>static</font></b> <b><font color=#0000FF>const</font></b> Uint32 ASYNC_PROCESSING<font color=#990000>;</font>
1591                  <b><font color=#0000FF>static</font></b> <b><font color=#0000FF>const</font></b> Uint32 ASYNC_COMPLETE<font color=#990000>;</font>
1592                  <b><font color=#0000FF>static</font></b> <b><font color=#0000FF>const</font></b> Uint32 ASYNC_CANCELLED<font color=#990000>;</font>
1593                  <b><font color=#0000FF>static</font></b> <b><font color=#0000FF>const</font></b> Uint32 ASYNC_PAUSED<font color=#990000>;</font>
1594                  <b><font color=#0000FF>static</font></b> <b><font color=#0000FF>const</font></b> Uint32 ASYNC_RESUMED<font color=#990000>;</font>
1595            
1596                  <b><font color=#0000FF>static</font></b> <b><font color=#0000FF>const</font></b> Uint32 CIM_SERVICE_STARTED<font color=#990000>;</font>
1597                  <b><font color=#0000FF>static</font></b> <b><font color=#0000FF>const</font></b> Uint32 CIM_SERVICE_STOPPED<font color=#990000>;</font>
1598                  <b><font color=#0000FF>static</font></b> <b><font color=#0000FF>const</font></b> Uint32 CIM_SERVICE_PAUSED<font color=#990000>;</font>
1599            
1600                  <b><font color=#0000FF>static</font></b> <b><font color=#0000FF>const</font></b> Uint32 CIM_SERVICE_RESUMED<font color=#990000>;</font>
1601                  <b><font color=#0000FF>static</font></b> <b><font color=#0000FF>const</font></b> Uint32 CIM_NAK<font color=#990000>;</font>
1602            
1603 mday   1.4       <b><font color=#0000FF>static</font></b> <b><font color=#0000FF>const</font></b> Uint32 ASYNC_PHASE_COMPLETE<font color=#990000>;</font>
1604                  <b><font color=#0000FF>static</font></b> <b><font color=#0000FF>const</font></b> Uint32 ASYNC_CHILD_COMPLETE<font color=#990000>;</font>
1605                  <b><font color=#0000FF>static</font></b> <b><font color=#0000FF>const</font></b> Uint32 ASYNC_PHASE_STARTED<font color=#990000>;</font>
1606                  <b><font color=#0000FF>static</font></b> <b><font color=#0000FF>const</font></b> Uint32 ASYNC_CHILD_STARTED<font color=#990000>;</font>
1607                  <b><font color=#0000FF>static</font></b> <b><font color=#0000FF>const</font></b> Uint32 CIM_PAUSED<font color=#990000>;</font>
1608                  <b><font color=#0000FF>static</font></b> <b><font color=#0000FF>const</font></b> Uint32 CIM_STOPPED<font color=#990000>;</font>
1609                  
1610            <font color=#FF0000>}</font><font color=#990000>;</font>
1611            
1612            
1613            <b><font color=#0000FF>class</font></b> PEGASUS_COMMON_LINKAGE async_messages
1614            <font color=#FF0000>{</font>
1615               <b><font color=#0000FF>public</font></b><font color=#990000>:</font>
1616                  <b><font color=#0000FF>static</font></b> <b><font color=#0000FF>const</font></b> Uint32 HEARTBEAT<font color=#990000>;</font>
1617                  <b><font color=#0000FF>static</font></b> <b><font color=#0000FF>const</font></b> Uint32 REPLY<font color=#990000>;</font>
1618                  <b><font color=#0000FF>static</font></b> <b><font color=#0000FF>const</font></b> Uint32 REGISTER_CIM_SERVICE<font color=#990000>;</font>
1619                  <b><font color=#0000FF>static</font></b> <b><font color=#0000FF>const</font></b> Uint32 DEREGISTER_CIM_SERVICE<font color=#990000>;</font>
1620                  <b><font color=#0000FF>static</font></b> <b><font color=#0000FF>const</font></b> Uint32 UPDATE_CIM_SERVICE<font color=#990000>;</font>
1621                  <b><font color=#0000FF>static</font></b> <b><font color=#0000FF>const</font></b> Uint32 IOCTL<font color=#990000>;</font>
1622                  <b><font color=#0000FF>static</font></b> <b><font color=#0000FF>const</font></b> Uint32 CIMSERVICE_START<font color=#990000>;</font>
1623                  <b><font color=#0000FF>static</font></b> <b><font color=#0000FF>const</font></b> Uint32 CIMSERVICE_STOP<font color=#990000>;</font>
1624 mday   1.4       <b><font color=#0000FF>static</font></b> <b><font color=#0000FF>const</font></b> Uint32 CIMSERVICE_PAUSE<font color=#990000>;</font>
1625                  <b><font color=#0000FF>static</font></b> <b><font color=#0000FF>const</font></b> Uint32 CIMSERVICE_RESUME<font color=#990000>;</font>
1626            
1627                  <b><font color=#0000FF>static</font></b> <b><font color=#0000FF>const</font></b> Uint32 ASYNC_OP_START<font color=#990000>;</font>
1628                  <b><font color=#0000FF>static</font></b> <b><font color=#0000FF>const</font></b> Uint32 ASYNC_OP_RESULT<font color=#990000>;</font>
1629                  <b><font color=#0000FF>static</font></b> <b><font color=#0000FF>const</font></b> Uint32 ASYNC_LEGACY_OP_START<font color=#990000>;</font>
1630                  <b><font color=#0000FF>static</font></b> <b><font color=#0000FF>const</font></b> Uint32 ASYNC_LEGACY_OP_RESULT<font color=#990000>;</font>
1631            
1632                  <b><font color=#0000FF>static</font></b> <b><font color=#0000FF>const</font></b> Uint32 FIND_SERVICE_Q<font color=#990000>;</font>
1633                  <b><font color=#0000FF>static</font></b> <b><font color=#0000FF>const</font></b> Uint32 FIND_SERVICE_Q_RESULT<font color=#990000>;</font>
1634                  <b><font color=#0000FF>static</font></b> <b><font color=#0000FF>const</font></b> Uint32 ENUMERATE_SERVICE<font color=#990000>;</font>
1635                  <b><font color=#0000FF>static</font></b> <b><font color=#0000FF>const</font></b> Uint32 ENUMERATE_SERVICE_RESULT<font color=#990000>;</font>
1636            <font color=#FF0000>}</font><font color=#990000>;</font>
1637            
1638            
1639            <b><font color=#0000FF>class</font></b> PEGASUS_COMMON_LINKAGE AsyncMessage <font color=#990000>:</font> <b><font color=#0000FF>public</font></b> Message
1640            <font color=#FF0000>{</font>
1641               <b><font color=#0000FF>public</font></b><font color=#990000>:</font>
1642                  <b><font color=#000000>AsyncMessage</font></b><font color=#990000>(</font>Uint32 type<font color=#990000>,</font> 
1643            		   Uint32 destination<font color=#990000>,</font>
1644            		   Uint32 key<font color=#990000>,</font> 
1645 mday   1.4 		   Uint32 routing<font color=#990000>,</font>
1646            		   Uint32 mask<font color=#990000>,</font>
1647            		   AsyncOpNode <font color=#990000>*</font>operation<font color=#990000>)</font><font color=#990000>;</font>
1648                       
1649                  <b><font color=#0000FF>virtual</font></b> <font color=#990000>~</font><b><font color=#000000>AsyncMessage</font></b><font color=#990000>(</font><font color=#009900>void</font><font color=#990000>)</font> 
1650                  <font color=#FF0000>{</font>
1651            	 
1652                  <font color=#FF0000>}</font>
1653 mday   1.1       
1654 mday   1.4       Boolean <b><font color=#0000FF>operator</font></b> <font color=#990000>=</font><font color=#990000>=</font><font color=#990000>(</font><b><font color=#0000FF>const</font></b> <font color=#009900>void</font> <font color=#990000>*</font>key<font color=#990000>)</font><font color=#990000>;</font>
1655                  Boolean <b><font color=#0000FF>operator</font></b> <font color=#990000>=</font><font color=#990000>=</font><font color=#990000>(</font><b><font color=#0000FF>const</font></b> AsyncMessage<font color=#990000>&amp;</font> msg<font color=#990000>)</font><font color=#990000>;</font>
1656 mday   1.1       
1657 mday   1.4       AsyncOpNode <font color=#990000>*</font>op<font color=#990000>;</font>
1658            <font color=#FF0000>}</font><font color=#990000>;</font>
1659 mday   1.1 
1660            
1661 mday   1.4 <b><font color=#0000FF>inline</font></b> Boolean AsyncMessage<font color=#990000>:</font><font color=#990000>:</font><b><font color=#0000FF>operator</font></b> <font color=#990000>=</font><font color=#990000>=</font><font color=#990000>(</font><b><font color=#0000FF>const</font></b> <font color=#009900>void</font> <font color=#990000>*</font>key<font color=#990000>)</font>
1662            <font color=#FF0000>{</font>
1663               <b><font color=#0000FF>if</font></b><font color=#990000>(</font> key <font color=#990000>=</font><font color=#990000>=</font> <b><font color=#0000FF>reinterpret_cast</font></b><font color=#990000>&lt;</font><font color=#009900>void</font> <font color=#990000>*</font><font color=#990000>&gt;</font><font color=#990000>(</font><b><font color=#0000FF>this</font></b><font color=#990000>)</font><font color=#990000>)</font>
1664                  <b><font color=#0000FF>return</font></b> <b><font color=#0000FF>true</font></b><font color=#990000>;</font>
1665               <b><font color=#0000FF>return</font></b> <b><font color=#0000FF>false</font></b><font color=#990000>;</font>
1666            <font color=#FF0000>}</font>
1667 mday   1.1 
1668 mday   1.4 <b><font color=#0000FF>inline</font></b> Boolean AsyncMessage<font color=#990000>:</font><font color=#990000>:</font><b><font color=#0000FF>operator</font></b> <font color=#990000>=</font><font color=#990000>=</font><font color=#990000>(</font><b><font color=#0000FF>const</font></b> AsyncMessage<font color=#990000>&amp;</font> msg<font color=#990000>)</font>
1669            <font color=#FF0000>{</font>
1670               <b><font color=#0000FF>return</font></b> <b><font color=#0000FF>this</font></b><font color=#990000>-</font><font color=#990000>&gt;</font><b><font color=#0000FF>operator</font></b><font color=#990000>=</font><font color=#990000>=</font><font color=#990000>(</font><b><font color=#0000FF>reinterpret_cast</font></b><font color=#990000>&lt;</font><font color=#009900>void</font> <font color=#990000>*</font><font color=#990000>&gt;</font><font color=#990000>(</font><b><font color=#0000FF>const_cast</font></b><font color=#990000>&lt;</font>AsyncMessage <font color=#990000>*</font><font color=#990000>&gt;</font><font color=#990000>(</font><font color=#990000>&amp;</font>msg<font color=#990000>)</font><font color=#990000>)</font><font color=#990000>)</font><font color=#990000>;</font>
1671            <font color=#FF0000>}</font>
1672 mday   1.1 
1673            
1674 mday   1.4 <b><font color=#0000FF>class</font></b> PEGASUS_COMMON_LINKAGE AsyncRequest <font color=#990000>:</font> <b><font color=#0000FF>public</font></b> AsyncMessage
1675            <font color=#FF0000>{</font>
1676               <b><font color=#0000FF>public</font></b><font color=#990000>:</font>
1677                  <b><font color=#000000>AsyncRequest</font></b><font color=#990000>(</font>Uint32 type<font color=#990000>,</font> 
1678            		   Uint32 key<font color=#990000>,</font> 
1679            		   Uint32 routing<font color=#990000>,</font>
1680            		   Uint32 mask<font color=#990000>,</font>
1681            		   AsyncOpNode <font color=#990000>*</font>operation<font color=#990000>,</font>
1682            		   Uint32 destination<font color=#990000>,</font>
1683            		   Uint32 response<font color=#990000>,</font>
1684            		   Boolean blocking<font color=#990000>)</font><font color=#990000>;</font>
1685 mday   1.1       
1686                  
1687 mday   1.4       <b><font color=#0000FF>virtual</font></b> <font color=#990000>~</font><b><font color=#000000>AsyncRequest</font></b><font color=#990000>(</font><font color=#009900>void</font><font color=#990000>)</font> 
1688                  <font color=#FF0000>{</font>
1689 mday   1.1 
1690 mday   1.4       <font color=#FF0000>}</font>
1691                        
1692                  Uint32 resp<font color=#990000>;</font>
1693                  Boolean block<font color=#990000>;</font>
1694            <font color=#FF0000>}</font><font color=#990000>;</font>
1695            
1696            <b><font color=#0000FF>class</font></b> PEGASUS_COMMON_LINKAGE AsyncReply <font color=#990000>:</font> <b><font color=#0000FF>public</font></b> AsyncMessage
1697            <font color=#FF0000>{</font>
1698               <b><font color=#0000FF>public</font></b><font color=#990000>:</font>
1699                  <b><font color=#000000>AsyncReply</font></b><font color=#990000>(</font>Uint32 type<font color=#990000>,</font> 
1700            		 Uint32 key<font color=#990000>,</font> 
1701            		 Uint32 routing<font color=#990000>,</font> 
1702            		 Uint32 mask<font color=#990000>,</font>
1703            		 AsyncOpNode <font color=#990000>*</font>operation<font color=#990000>,</font>
1704            		 Uint32 result_code<font color=#990000>,</font>
1705            		 Uint32 destination<font color=#990000>,</font>
1706            		 Boolean blocking<font color=#990000>)</font><font color=#990000>;</font>
1707 mday   1.1       
1708                  
1709 mday   1.4       <b><font color=#0000FF>virtual</font></b> <font color=#990000>~</font><b><font color=#000000>AsyncReply</font></b><font color=#990000>(</font><font color=#009900>void</font><font color=#990000>)</font>
1710                  <font color=#FF0000>{</font>
1711            	 
1712                  <font color=#FF0000>}</font>
1713                        
1714                  Uint32 result<font color=#990000>;</font>
1715                  Boolean block<font color=#990000>;</font>
1716            <font color=#FF0000>}</font><font color=#990000>;</font>
1717            
1718            
1719            
1720            <b><font color=#0000FF>class</font></b> PEGASUS_COMMON_LINKAGE RegisterCimService <font color=#990000>:</font> <b><font color=#0000FF>public</font></b> AsyncRequest
1721            <font color=#FF0000>{</font>
1722               <b><font color=#0000FF>public</font></b><font color=#990000>:</font> 
1723                  <b><font color=#000000>RegisterCimService</font></b><font color=#990000>(</font>Uint32 routing<font color=#990000>,</font> 
1724            			 AsyncOpNode <font color=#990000>*</font>operation<font color=#990000>,</font>
1725            			 Boolean blocking<font color=#990000>,</font>
1726            			 String service_name<font color=#990000>,</font>
1727            			 Uint32 service_capabilities<font color=#990000>,</font> 
1728            			 Uint32 service_mask<font color=#990000>,</font>
1729            			 Uint32 service_queue<font color=#990000>)</font><font color=#990000>;</font>
1730 mday   1.4       
1731                  <b><font color=#0000FF>virtual</font></b> <font color=#990000>~</font><b><font color=#000000>RegisterCimService</font></b><font color=#990000>(</font><font color=#009900>void</font><font color=#990000>)</font> 
1732                  <font color=#FF0000>{</font>
1733            
1734                  <font color=#FF0000>}</font>
1735                  
1736                  String name<font color=#990000>;</font>
1737                  Uint32 capabilities<font color=#990000>;</font>
1738                  Uint32 mask<font color=#990000>;</font>
1739                  Uint32 queue<font color=#990000>;</font>
1740            <font color=#FF0000>}</font><font color=#990000>;</font>
1741            
1742            <b><font color=#0000FF>class</font></b> PEGASUS_COMMON_LINKAGE DeRegisterCimService <font color=#990000>:</font> <b><font color=#0000FF>public</font></b> AsyncRequest
1743            <font color=#FF0000>{</font>
1744               <b><font color=#0000FF>public</font></b><font color=#990000>:</font>
1745                  <b><font color=#000000>DeRegisterCimService</font></b><font color=#990000>(</font>Uint32 routing<font color=#990000>,</font> 
1746            			   AsyncOpNode <font color=#990000>*</font>operation<font color=#990000>,</font>
1747            			   Boolean blocking<font color=#990000>,</font> 
1748            			   Uint32 service_queue<font color=#990000>)</font><font color=#990000>;</font>
1749                  
1750                  
1751 mday   1.4       <b><font color=#0000FF>virtual</font></b> <font color=#990000>~</font><b><font color=#000000>DeRegisterCimService</font></b><font color=#990000>(</font><font color=#009900>void</font><font color=#990000>)</font>
1752                  <font color=#FF0000>{</font>
1753            
1754                  <font color=#FF0000>}</font>
1755                  
1756                  Uint32 queue<font color=#990000>;</font>
1757            <font color=#FF0000>}</font> <font color=#990000>;</font>
1758            
1759            <b><font color=#0000FF>class</font></b> PEGASUS_COMMON_LINKAGE UpdateCimService <font color=#990000>:</font> <b><font color=#0000FF>public</font></b> AsyncRequest
1760            <font color=#FF0000>{</font>
1761               <b><font color=#0000FF>public</font></b><font color=#990000>:</font>
1762                  <b><font color=#000000>UpdateCimService</font></b><font color=#990000>(</font>Uint32 routing<font color=#990000>,</font> 
1763            		       AsyncOpNode <font color=#990000>*</font>operation<font color=#990000>,</font>
1764            		       Boolean blocking<font color=#990000>,</font> 
1765            		       Uint32 service_queue<font color=#990000>,</font> 
1766            		       Uint32 service_capabilities<font color=#990000>,</font> 
1767            		       Uint32 service_mask<font color=#990000>)</font><font color=#990000>;</font>
1768            
1769                  <b><font color=#0000FF>virtual</font></b> <font color=#990000>~</font><b><font color=#000000>UpdateCimService</font></b><font color=#990000>(</font><font color=#009900>void</font><font color=#990000>)</font> 
1770                  <font color=#FF0000>{</font>
1771            
1772 mday   1.4       <font color=#FF0000>}</font>
1773                  
1774                  Uint32 queue<font color=#990000>;</font>
1775                  Uint32 capabilities<font color=#990000>;</font>
1776                  Uint32 mask<font color=#990000>;</font>
1777            <font color=#FF0000>}</font><font color=#990000>;</font>
1778            
1779            
1780            <b><font color=#0000FF>class</font></b> PEGASUS_COMMON_LINKAGE AsyncIoctl <font color=#990000>:</font> <b><font color=#0000FF>public</font></b> AsyncRequest
1781            <font color=#FF0000>{</font>
1782               <b><font color=#0000FF>public</font></b><font color=#990000>:</font>
1783                  <b><font color=#000000>AsyncIoctl</font></b><font color=#990000>(</font>Uint32 routing<font color=#990000>,</font> 
1784            		 AsyncOpNode <font color=#990000>*</font>operation<font color=#990000>,</font> 
1785            		 Uint32 destination<font color=#990000>,</font> 
1786            		 Uint32 response<font color=#990000>,</font>
1787            		 Boolean blocking<font color=#990000>,</font>
1788            		 Uint32 code<font color=#990000>,</font> 
1789            		 Uint32 int_param<font color=#990000>,</font>
1790            		 <font color=#009900>void</font> <font color=#990000>*</font>p_param<font color=#990000>)</font><font color=#990000>;</font>
1791            
1792                  <b><font color=#0000FF>virtual</font></b> <font color=#990000>~</font><b><font color=#000000>AsyncIoctl</font></b><font color=#990000>(</font><font color=#009900>void</font><font color=#990000>)</font>
1793 mday   1.4       <font color=#FF0000>{</font>
1794            
1795                  <font color=#FF0000>}</font>
1796                  
1797                  <b><font color=#0000FF>enum</font></b> 
1798                  <font color=#FF0000>{</font>
1799            	 IO_CLOSE<font color=#990000>,</font>
1800            	 IO_OPEN<font color=#990000>,</font>
1801            	 IO_SOURCE_QUENCH<font color=#990000>,</font>
1802            	 IO_SERVICE_DEFINED
1803                  <font color=#FF0000>}</font><font color=#990000>;</font>
1804 mday   1.1       
1805                  
1806            
1807 mday   1.4       Uint32 ctl<font color=#990000>;</font>
1808                  Uint32 intp<font color=#990000>;</font>
1809                  <font color=#009900>void</font> <font color=#990000>*</font>voidp<font color=#990000>;</font>
1810 mday   1.1 
1811 mday   1.4 <font color=#FF0000>}</font><font color=#990000>;</font>
1812 mday   1.1 
1813 mday   1.4 <b><font color=#0000FF>class</font></b> PEGASUS_COMMON_LINKAGE CimServiceStart <font color=#990000>:</font> <b><font color=#0000FF>public</font></b> AsyncRequest
1814            <font color=#FF0000>{</font>
1815               <b><font color=#0000FF>public</font></b><font color=#990000>:</font>
1816                  <b><font color=#000000>CimServiceStart</font></b><font color=#990000>(</font>Uint32 routing<font color=#990000>,</font> 
1817            		      AsyncOpNode <font color=#990000>*</font>operation<font color=#990000>,</font> 
1818            		      Uint32 destination<font color=#990000>,</font> 
1819            		      Uint32 response<font color=#990000>,</font> 
1820            		      Boolean blocking<font color=#990000>)</font><font color=#990000>;</font>
1821                  
1822                  <b><font color=#0000FF>virtual</font></b> <font color=#990000>~</font><b><font color=#000000>CimServiceStart</font></b><font color=#990000>(</font><font color=#009900>void</font><font color=#990000>)</font> 
1823                  <font color=#FF0000>{</font>
1824            	 
1825                  <font color=#FF0000>}</font>
1826            <font color=#FF0000>}</font><font color=#990000>;</font>
1827 mday   1.1 
1828            
1829 mday   1.4 <b><font color=#0000FF>class</font></b> PEGASUS_COMMON_LINKAGE CimServiceStop <font color=#990000>:</font> <b><font color=#0000FF>public</font></b> AsyncRequest
1830            <font color=#FF0000>{</font>
1831               <b><font color=#0000FF>public</font></b><font color=#990000>:</font>
1832                  <b><font color=#000000>CimServiceStop</font></b><font color=#990000>(</font>Uint32 routing<font color=#990000>,</font> 
1833            		     AsyncOpNode <font color=#990000>*</font>operation<font color=#990000>,</font> 
1834            		     Uint32 destination<font color=#990000>,</font> 
1835            		     Uint32 response<font color=#990000>,</font> 
1836            		     Boolean blocking<font color=#990000>)</font><font color=#990000>;</font>
1837                        
1838                  <b><font color=#0000FF>virtual</font></b> <font color=#990000>~</font><b><font color=#000000>CimServiceStop</font></b><font color=#990000>(</font><font color=#009900>void</font><font color=#990000>)</font> 
1839                  <font color=#FF0000>{</font>
1840 mday   1.1 
1841 mday   1.4       <font color=#FF0000>}</font>
1842            <font color=#FF0000>}</font><font color=#990000>;</font>
1843 mday   1.1 
1844 mday   1.4 <b><font color=#0000FF>class</font></b> PEGASUS_COMMON_LINKAGE CimServicePause <font color=#990000>:</font> <b><font color=#0000FF>public</font></b> AsyncRequest
1845            <font color=#FF0000>{</font>
1846               <b><font color=#0000FF>public</font></b><font color=#990000>:</font>
1847                  <b><font color=#000000>CimServicePause</font></b><font color=#990000>(</font>Uint32 routing<font color=#990000>,</font> 
1848            		      AsyncOpNode <font color=#990000>*</font>operation<font color=#990000>,</font> 
1849            		      Uint32 destination<font color=#990000>,</font> 
1850            		      Uint32 response<font color=#990000>,</font> 
1851            		      Boolean blocking<font color=#990000>)</font><font color=#990000>;</font>
1852                  
1853                  
1854                  <b><font color=#0000FF>virtual</font></b> <font color=#990000>~</font><b><font color=#000000>CimServicePause</font></b><font color=#990000>(</font><font color=#009900>void</font><font color=#990000>)</font>
1855                  <font color=#FF0000>{</font>
1856            
1857                  <font color=#FF0000>}</font>
1858            <font color=#FF0000>}</font><font color=#990000>;</font>
1859            
1860            <b><font color=#0000FF>class</font></b> PEGASUS_COMMON_LINKAGE CimServiceResume <font color=#990000>:</font> <b><font color=#0000FF>public</font></b> AsyncRequest
1861            <font color=#FF0000>{</font>
1862               <b><font color=#0000FF>public</font></b><font color=#990000>:</font>
1863                  <b><font color=#000000>CimServiceResume</font></b><font color=#990000>(</font>Uint32 routing<font color=#990000>,</font> 
1864            		       AsyncOpNode <font color=#990000>*</font>operation<font color=#990000>,</font> 
1865 mday   1.4 		       Uint32 destination<font color=#990000>,</font> 
1866            		       Uint32 response<font color=#990000>,</font> 
1867            		       Boolean blocking<font color=#990000>)</font><font color=#990000>;</font>
1868                  
1869                  
1870                  <b><font color=#0000FF>virtual</font></b> <font color=#990000>~</font><b><font color=#000000>CimServiceResume</font></b><font color=#990000>(</font><font color=#009900>void</font><font color=#990000>)</font>
1871                  <font color=#FF0000>{</font>
1872            
1873                  <font color=#FF0000>}</font>
1874            <font color=#FF0000>}</font><font color=#990000>;</font>
1875            
1876            <b><font color=#0000FF>class</font></b> PEGASUS_COMMON_LINKAGE AsyncOperationStart <font color=#990000>:</font> <b><font color=#0000FF>public</font></b> AsyncRequest
1877            <font color=#FF0000>{</font>
1878               <b><font color=#0000FF>public</font></b><font color=#990000>:</font>
1879                  <b><font color=#000000>AsyncOperationStart</font></b><font color=#990000>(</font>Uint32 routing<font color=#990000>,</font> 
1880            			  AsyncOpNode <font color=#990000>*</font>operation<font color=#990000>,</font> 
1881            			  Uint32 destination<font color=#990000>,</font> 
1882            			  Uint32 response<font color=#990000>,</font> 
1883            			  Boolean blocking<font color=#990000>,</font> 
1884            			  Message <font color=#990000>*</font>action<font color=#990000>)</font><font color=#990000>;</font>
1885                  
1886 mday   1.4 
1887                  <b><font color=#0000FF>virtual</font></b> <font color=#990000>~</font><b><font color=#000000>AsyncOperationStart</font></b><font color=#990000>(</font><font color=#009900>void</font><font color=#990000>)</font>
1888                  <font color=#FF0000>{</font>
1889            	 <b><font color=#0000FF>delete</font></b> _act<font color=#990000>;</font>
1890                  <font color=#FF0000>}</font>
1891                  
1892            
1893                  Message <font color=#990000>*</font><b><font color=#000000>get_action</font></b><font color=#990000>(</font><font color=#009900>void</font> <font color=#990000>)</font> <font color=#990000>;</font>
1894                  
1895                  
1896               <b><font color=#0000FF>private</font></b><font color=#990000>:</font>
1897                  <b><font color=#0000FF>friend</font></b> <b><font color=#0000FF>class</font></b> MessageQueueService<font color=#990000>;</font>
1898                  <b><font color=#0000FF>friend</font></b> <b><font color=#0000FF>class</font></b> cimom<font color=#990000>;</font>
1899                  Message <font color=#990000>*</font>_act<font color=#990000>;</font>
1900            <font color=#FF0000>}</font><font color=#990000>;</font>
1901            
1902            <b><font color=#0000FF>class</font></b> PEGASUS_COMMON_LINKAGE AsyncOperationResult <font color=#990000>:</font> <b><font color=#0000FF>public</font></b> AsyncReply
1903            <font color=#FF0000>{</font>
1904               <b><font color=#0000FF>public</font></b><font color=#990000>:</font>
1905                  <b><font color=#000000>AsyncOperationResult</font></b><font color=#990000>(</font>Uint32 key<font color=#990000>,</font> 
1906            			   Uint32 routing<font color=#990000>,</font> 
1907 mday   1.4 			   AsyncOpNode <font color=#990000>*</font>operation<font color=#990000>,</font>
1908            			   Uint32 result_code<font color=#990000>,</font> 
1909            			   Uint32 destination<font color=#990000>,</font>
1910            			   Uint32 blocking<font color=#990000>)</font><font color=#990000>;</font>
1911                  
1912            
1913                  <b><font color=#0000FF>virtual</font></b> <font color=#990000>~</font><b><font color=#000000>AsyncOperationResult</font></b><font color=#990000>(</font><font color=#009900>void</font><font color=#990000>)</font>
1914                  <font color=#FF0000>{</font>
1915            
1916                  <font color=#FF0000>}</font>
1917            <font color=#FF0000>}</font><font color=#990000>;</font>
1918            
1919            
1920            <b><font color=#0000FF>class</font></b> PEGASUS_COMMON_LINKAGE AsyncLegacyOperationStart <font color=#990000>:</font> <b><font color=#0000FF>public</font></b> AsyncRequest
1921            <font color=#FF0000>{</font>
1922               <b><font color=#0000FF>public</font></b><font color=#990000>:</font>
1923                  <b><font color=#000000>AsyncLegacyOperationStart</font></b><font color=#990000>(</font>Uint32 routing<font color=#990000>,</font> 
1924            				AsyncOpNode <font color=#990000>*</font>operation<font color=#990000>,</font> 
1925            				Uint32 destination<font color=#990000>,</font> 
1926            				Message <font color=#990000>*</font>action<font color=#990000>,</font> 
1927            				Uint32 action_destination<font color=#990000>)</font><font color=#990000>;</font>
1928 mday   1.4       
1929                  
1930                  <b><font color=#0000FF>virtual</font></b> <font color=#990000>~</font><b><font color=#000000>AsyncLegacyOperationStart</font></b><font color=#990000>(</font><font color=#009900>void</font><font color=#990000>)</font>
1931                  <font color=#FF0000>{</font>
1932            	 <b><font color=#0000FF>delete</font></b> _act<font color=#990000>;</font>
1933                  <font color=#FF0000>}</font>
1934            
1935                  Message <font color=#990000>*</font><b><font color=#000000>get_action</font></b><font color=#990000>(</font><font color=#009900>void</font><font color=#990000>)</font><font color=#990000>;</font>
1936            
1937               <b><font color=#0000FF>private</font></b><font color=#990000>:</font>
1938                  <b><font color=#0000FF>friend</font></b> <b><font color=#0000FF>class</font></b> MessageQueueService<font color=#990000>;</font>
1939                  <b><font color=#0000FF>friend</font></b> <b><font color=#0000FF>class</font></b> cimom<font color=#990000>;</font>
1940                  Message <font color=#990000>*</font>_act<font color=#990000>;</font>
1941                  Uint32 _legacy_destination<font color=#990000>;</font>
1942                  
1943            <font color=#FF0000>}</font><font color=#990000>;</font>
1944            
1945            <b><font color=#0000FF>class</font></b> PEGASUS_COMMON_LINKAGE AsyncLegacyOperationResult <font color=#990000>:</font> <b><font color=#0000FF>public</font></b> AsyncReply
1946            <font color=#FF0000>{</font>
1947               <b><font color=#0000FF>public</font></b><font color=#990000>:</font>
1948                  <b><font color=#000000>AsyncLegacyOperationResult</font></b><font color=#990000>(</font>Uint32 key<font color=#990000>,</font> 
1949 mday   1.4 				 Uint32 routing<font color=#990000>,</font> 
1950            				 AsyncOpNode <font color=#990000>*</font>operation<font color=#990000>,</font>
1951            				 Message <font color=#990000>*</font>result<font color=#990000>)</font><font color=#990000>;</font>
1952                  
1953                  <b><font color=#0000FF>virtual</font></b> <font color=#990000>~</font><b><font color=#000000>AsyncLegacyOperationResult</font></b><font color=#990000>(</font><font color=#009900>void</font><font color=#990000>)</font>
1954                  <font color=#FF0000>{</font>
1955            	 <b><font color=#0000FF>delete</font></b> _res<font color=#990000>;</font>
1956                  <font color=#FF0000>}</font>
1957            
1958                  Message <font color=#990000>*</font><b><font color=#000000>get_result</font></b><font color=#990000>(</font><font color=#009900>void</font><font color=#990000>)</font><font color=#990000>;</font>
1959                  
1960            
1961               <b><font color=#0000FF>private</font></b><font color=#990000>:</font>
1962                  <b><font color=#0000FF>friend</font></b> <b><font color=#0000FF>class</font></b> MessageQueueService<font color=#990000>;</font>
1963                  <b><font color=#0000FF>friend</font></b> <b><font color=#0000FF>class</font></b> cimom<font color=#990000>;</font>
1964                  Message <font color=#990000>*</font>_res<font color=#990000>;</font>
1965            <font color=#FF0000>}</font><font color=#990000>;</font>
1966            
1967            
1968            <b><font color=#0000FF>class</font></b> PEGASUS_COMMON_LINKAGE FindServiceQueue <font color=#990000>:</font> <b><font color=#0000FF>public</font></b> AsyncRequest
1969            <font color=#FF0000>{</font>
1970 mday   1.4    <b><font color=#0000FF>public</font></b><font color=#990000>:</font>
1971                  <b><font color=#000000>FindServiceQueue</font></b><font color=#990000>(</font>Uint32 routing<font color=#990000>,</font> 
1972            		       AsyncOpNode <font color=#990000>*</font>operation<font color=#990000>,</font> 
1973            		       Uint32 response<font color=#990000>,</font>
1974            		       Boolean blocking<font color=#990000>,</font> 
1975            		       String service_name<font color=#990000>,</font> 
1976            		       Uint32 service_capabilities<font color=#990000>,</font> 
1977            		       Uint32 service_mask<font color=#990000>)</font><font color=#990000>;</font>
1978                  
1979                  <b><font color=#0000FF>virtual</font></b> <font color=#990000>~</font><b><font color=#000000>FindServiceQueue</font></b><font color=#990000>(</font><font color=#009900>void</font><font color=#990000>)</font>
1980                  <font color=#FF0000>{</font>
1981            
1982                  <font color=#FF0000>}</font>
1983                  
1984                  String name<font color=#990000>;</font>
1985                  Uint32 capabilities<font color=#990000>;</font>
1986                  Uint32 mask<font color=#990000>;</font>
1987            <font color=#FF0000>}</font> <font color=#990000>;</font>
1988            
1989            <b><font color=#0000FF>class</font></b> PEGASUS_COMMON_LINKAGE FindServiceQueueResult <font color=#990000>:</font> <b><font color=#0000FF>public</font></b> AsyncReply
1990            <font color=#FF0000>{</font>
1991 mday   1.4    <b><font color=#0000FF>public</font></b><font color=#990000>:</font>
1992                  <b><font color=#000000>FindServiceQueueResult</font></b><font color=#990000>(</font>Uint32 key<font color=#990000>,</font> 
1993            			     Uint32 routing<font color=#990000>,</font> 
1994            			     AsyncOpNode <font color=#990000>*</font>operation<font color=#990000>,</font> 
1995            			     Uint32 result_code<font color=#990000>,</font> 
1996            			     Uint32 destination<font color=#990000>,</font> 
1997            			     Boolean blocking<font color=#990000>,</font> 
1998            			     Array<font color=#FF0000>&lt;Uint32&gt;</font> queue_ids<font color=#990000>)</font><font color=#990000>;</font>
1999                  
2000                  
2001                  <b><font color=#0000FF>virtual</font></b> <font color=#990000>~</font><b><font color=#000000>FindServiceQueueResult</font></b><font color=#990000>(</font><font color=#009900>void</font><font color=#990000>)</font>
2002                  <font color=#FF0000>{</font>
2003            
2004                  <font color=#FF0000>}</font>
2005                  
2006                  Array<font color=#FF0000>&lt;Uint32&gt;</font> qids<font color=#990000>;</font>
2007            <font color=#FF0000>}</font> <font color=#990000>;</font>
2008            
2009            <b><font color=#0000FF>class</font></b> PEGASUS_COMMON_LINKAGE EnumerateService <font color=#990000>:</font> <b><font color=#0000FF>public</font></b> AsyncRequest
2010            <font color=#FF0000>{</font>
2011               <b><font color=#0000FF>public</font></b><font color=#990000>:</font>
2012 mday   1.4       <b><font color=#000000>EnumerateService</font></b><font color=#990000>(</font>Uint32 routing<font color=#990000>,</font> 
2013            		       AsyncOpNode <font color=#990000>*</font>operation<font color=#990000>,</font> 
2014            		       Uint32 response<font color=#990000>,</font> 
2015            		       Boolean blocking<font color=#990000>,</font> 
2016            		       Uint32 queue_id<font color=#990000>)</font><font color=#990000>;</font>
2017                  
2018                  
2019                  <b><font color=#0000FF>virtual</font></b> <font color=#990000>~</font><b><font color=#000000>EnumerateService</font></b><font color=#990000>(</font><font color=#009900>void</font><font color=#990000>)</font>
2020                  <font color=#FF0000>{</font>
2021            
2022                  <font color=#FF0000>}</font>
2023                  
2024                  Uint32 qid<font color=#990000>;</font>
2025            <font color=#FF0000>}</font><font color=#990000>;</font>
2026            
2027            <b><font color=#0000FF>class</font></b> PEGASUS_COMMON_LINKAGE EnumerateServiceResponse <font color=#990000>:</font> <b><font color=#0000FF>public</font></b> AsyncReply
2028            <font color=#FF0000>{</font>
2029               <b><font color=#0000FF>public</font></b><font color=#990000>:</font>
2030                  <b><font color=#000000>EnumerateServiceResponse</font></b><font color=#990000>(</font>Uint32 key<font color=#990000>,</font> 
2031            			       Uint32 routing<font color=#990000>,</font> 
2032            			       AsyncOpNode <font color=#990000>*</font>operation<font color=#990000>,</font> 
2033 mday   1.4 			       Uint32 result_code<font color=#990000>,</font> 
2034            			       Uint32 response<font color=#990000>,</font> 
2035            			       Boolean blocking<font color=#990000>,</font>
2036            			       String service_name<font color=#990000>,</font> 
2037            			       Uint32 service_capabilities<font color=#990000>,</font> 
2038            			       Uint32 service_mask<font color=#990000>,</font> 
2039            			       Uint32 service_qid<font color=#990000>)</font><font color=#990000>;</font>
2040                  
2041                  
2042                  <b><font color=#0000FF>virtual</font></b> <font color=#990000>~</font><b><font color=#000000>EnumerateServiceResponse</font></b><font color=#990000>(</font><font color=#009900>void</font><font color=#990000>)</font>
2043                  <font color=#FF0000>{</font>
2044            
2045                  <font color=#FF0000>}</font>
2046                  
2047                  String name<font color=#990000>;</font>
2048                  Uint32 capabilities<font color=#990000>;</font>
2049                  Uint32 mask<font color=#990000>;</font>
2050                  Uint32 qid<font color=#990000>;</font>
2051            <font color=#FF0000>}</font><font color=#990000>;</font>
2052            
2053            
2054 mday   1.4 PEGASUS_NAMESPACE_END
2055            
2056            <b><font color=#000080>#endif</font></b> <i><font color=#9A1900>// CIMOM_MESSAGE_include</font></i>
2057            </tt>
2058            </pre>
2059            
2060            
2061            <h3>AsyncOpNode</h3>
2062            
2063 martin 1.5 <pre><tt>
2064 martin 1.6 <i><font color=#9A1900>//%LICENSE////////////////////////////////////////////////////////////////</font></i>
2065 mday   1.4 <i><font color=#9A1900>//</font></i>
2066 martin 1.6 <i><font color=#9A1900>// Licensed to The Open Group (TOG) under one or more contributor license</font></i>
2067            <i><font color=#9A1900>// agreements.  Refer to the OpenPegasusNOTICE.txt file distributed with</font></i>
2068            <i><font color=#9A1900>// this work for additional information regarding copyright ownership.</font></i>
2069            <i><font color=#9A1900>// Each contributor licenses this file to you under the OpenPegasus Open</font></i>
2070            <i><font color=#9A1900>// Source License; you may not use this file except in compliance with the</font></i>
2071            <i><font color=#9A1900>// License.</font></i>
2072            <i><font color=#9A1900>//</font></i>
2073            <i><font color=#9A1900>// Permission is hereby granted, free of charge, to any person obtaining a</font></i>
2074            <i><font color=#9A1900>// copy of this software and associated documentation files (the "Software"),</font></i>
2075            <i><font color=#9A1900>// to deal in the Software without restriction, including without limitation</font></i>
2076            <i><font color=#9A1900>// the rights to use, copy, modify, merge, publish, distribute, sublicense,</font></i>
2077            <i><font color=#9A1900>// and/or sell copies of the Software, and to permit persons to whom the</font></i>
2078            <i><font color=#9A1900>// Software is furnished to do so, subject to the following conditions:</font></i>
2079            <i><font color=#9A1900>//</font></i>
2080            <i><font color=#9A1900>// The above copyright notice and this permission notice shall be included</font></i>
2081            <i><font color=#9A1900>// in all copies or substantial portions of the Software.</font></i>
2082            <i><font color=#9A1900>//</font></i>
2083            <i><font color=#9A1900>// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS</font></i>
2084            <i><font color=#9A1900>// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF</font></i>
2085            <i><font color=#9A1900>// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.</font></i>
2086            <i><font color=#9A1900>// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY</font></i>
2087 martin 1.6 <i><font color=#9A1900>// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,</font></i>
2088            <i><font color=#9A1900>// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE</font></i>
2089            <i><font color=#9A1900>// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</font></i>
2090 mday   1.4 <i><font color=#9A1900>//</font></i>
2091 martin 1.6 <i><font color=#9A1900>//////////////////////////////////////////////////////////////////////////</font></i>
2092 mday   1.4 <i><font color=#9A1900>//</font></i>
2093 martin 1.6 <i><font color=#9A1900>// Author: Mike Day (mdday@us.ibm.com</font></i>
2094 mday   1.4 <i><font color=#9A1900>//</font></i>
2095            <i><font color=#9A1900>// Modified By: </font></i>
2096            <i><font color=#9A1900>//</font></i>
2097 martin 1.6 <i><font color=#9A1900>//////////////////////////////////////////////////////////////////////////</font></i>
2098 mday   1.4 
2099            
2100            <b><font color=#000080>#ifndef</font></b> Pegasus_AsyncOpNode_h
2101            <b><font color=#000080>#define</font></b> Pegasus_AsyncOpNode_h
2102            
2103            <b><font color=#000080>#include</font></b> <font color=#FF0000>&lt;Pegasus/Common/Config.h&gt;</font>
2104            <b><font color=#000080>#include</font></b> <font color=#FF0000>&lt;Pegasus/Common/Message.h&gt;</font>
2105            <b><font color=#000080>#include</font></b> <font color=#FF0000>&lt;Pegasus/Common/OperationContext.h&gt;</font>
2106            <b><font color=#000080>#include</font></b> <font color=#FF0000>&lt;Pegasus/Common/internal_dq.h&gt;</font>
2107            <b><font color=#000080>#include</font></b> <font color=#FF0000>&lt;Pegasus/Common/IPC.h&gt;</font>
2108            
2109            PEGASUS_NAMESPACE_BEGIN
2110            
2111            <i><font color=#9A1900>// ATTN usage of flags and state is inconsistent</font></i>
2112            <i><font color=#9A1900>// &lt;&lt; Wed Jan 16 17:41:57 2002 mdd &gt;&gt;</font></i>
2113            <i><font color=#9A1900>// resolved mdd </font></i>
2114            
2115            
2116            <b><font color=#000080>#define</font></b> ASYNC_OPFLAGS_UNKNOWN           <font color=#993399>0x00000000</font>
2117            <b><font color=#000080>#define</font></b> ASYNC_OPFLAGS_INTERVAL_REPEAT   <font color=#993399>0x00000010</font>
2118            <b><font color=#000080>#define</font></b> ASYNC_OPFLAGS_INDICATION        <font color=#993399>0x00000020</font>
2119 mday   1.4 <b><font color=#000080>#define</font></b> ASYNC_OPFLAGS_REMOTE            <font color=#993399>0x00000040</font>
2120            <b><font color=#000080>#define</font></b> ASYNC_OPFLAGS_LOCAL_OUT_OF_PROC <font color=#993399>0x00000080</font>
2121            <b><font color=#000080>#define</font></b> ASYNC_OPFLAGS_PHASED            <font color=#993399>0x00000001</font>
2122            <b><font color=#000080>#define</font></b> ASYNC_OPFLAGS_PARTIAL           <font color=#993399>0x00000002</font>
2123            <b><font color=#000080>#define</font></b> ASYNC_OPFLAGS_NORMAL            <font color=#993399>0x00000000</font>
2124            <b><font color=#000080>#define</font></b> ASYNC_OPFLAGS_SINGLE            <font color=#993399>0x00000008</font>
2125            <b><font color=#000080>#define</font></b> ASYNC_OPFLAGS_MULTIPLE          <font color=#993399>0x00000010</font>
2126            <b><font color=#000080>#define</font></b> ASYNC_OPFLAGS_TOTAL             <font color=#993399>0x00000020</font>
2127            <b><font color=#000080>#define</font></b> ASYNC_OPFLAGS_META_DISPATCHER   <font color=#993399>0x00000040</font>
2128            <b><font color=#000080>#define</font></b> ASYNC_OPFLAGS_FIRE_AND_FORGET   <font color=#993399>0x00000080</font>
2129            <b><font color=#000080>#define</font></b> ASYNC_OPFLAGS_SIMPLE_STATUS     <font color=#993399>0x00000100</font>
2130            <b><font color=#000080>#define</font></b> ASYNC_OPFLAGS_CALLBACK          <font color=#993399>0x00000200</font>
2131            <b><font color=#000080>#define</font></b> ASYNC_OPFLAGS_FORWARD           <font color=#993399>0x00000400</font>
2132            
2133            <b><font color=#000080>#define</font></b> ASYNC_OPSTATE_UNKNOWN           <font color=#993399>0x00000000</font>
2134            <b><font color=#000080>#define</font></b> ASYNC_OPSTATE_OFFERED           <font color=#993399>0x00000001</font>
2135            <b><font color=#000080>#define</font></b> ASYNC_OPSTATE_DECLINED          <font color=#993399>0x00000002</font>
2136            <b><font color=#000080>#define</font></b> ASYNC_OPSTATE_STARTED           <font color=#993399>0x00000004</font>
2137            <b><font color=#000080>#define</font></b> ASYNC_OPSTATE_PROCESSING        <font color=#993399>0x00000008</font>
2138            <b><font color=#000080>#define</font></b> ASYNC_OPSTATE_DELIVER           <font color=#993399>0x00000010</font> 
2139            <b><font color=#000080>#define</font></b> ASYNC_OPSTATE_RESERVE           <font color=#993399>0x00000020</font>
2140 mday   1.4 <b><font color=#000080>#define</font></b> ASYNC_OPSTATE_COMPLETE          <font color=#993399>0x00000040</font>
2141            <b><font color=#000080>#define</font></b> ASYNC_OPSTATE_TIMEOUT           <font color=#993399>0x00000080</font>
2142            <b><font color=#000080>#define</font></b> ASYNC_OPSTATE_CANCELLED         <font color=#993399>0x00000100</font>
2143            <b><font color=#000080>#define</font></b> ASYNC_OPSTATE_PAUSED            <font color=#993399>0x00000200</font>
2144            <b><font color=#000080>#define</font></b> ASYNC_OPSTATE_SUSPENDED         <font color=#993399>0x00000400</font>
2145            <b><font color=#000080>#define</font></b> ASYNC_OPSTATE_RESUMED           <font color=#993399>0x00000800</font>
2146            <b><font color=#000080>#define</font></b> ASYNC_OPSTATE_ORPHANED          <font color=#993399>0x00001000</font>
2147            <b><font color=#000080>#define</font></b> ASYNC_OPSTATE_RELEASED          <font color=#993399>0x00002000</font>
2148            
2149            <b><font color=#0000FF>class</font></b> Cimom<font color=#990000>;</font>
2150            <b><font color=#0000FF>class</font></b> Thread<font color=#990000>;</font>
2151            
2152            <b><font color=#0000FF>class</font></b> PEGASUS_COMMON_LINKAGE AsyncOpNode
2153            <font color=#FF0000>{</font>
2154               <b><font color=#0000FF>public</font></b><font color=#990000>:</font>
2155 mday   1.1 
2156 mday   1.4       <b><font color=#000000>AsyncOpNode</font></b><font color=#990000>(</font><font color=#009900>void</font><font color=#990000>)</font><font color=#990000>;</font>
2157                  <font color=#990000>~</font><b><font color=#000000>AsyncOpNode</font></b><font color=#990000>(</font><font color=#009900>void</font><font color=#990000>)</font><font color=#990000>;</font>
2158                        
2159                  Boolean  <b><font color=#0000FF>operator</font></b> <font color=#990000>=</font><font color=#990000>=</font> <font color=#990000>(</font><b><font color=#0000FF>const</font></b> <font color=#009900>void</font> <font color=#990000>*</font>key<font color=#990000>)</font> <b><font color=#0000FF>const</font></b><font color=#990000>;</font>
2160                  Boolean <b><font color=#0000FF>operator</font></b> <font color=#990000>=</font><font color=#990000>=</font> <font color=#990000>(</font><b><font color=#0000FF>const</font></b> AsyncOpNode <font color=#990000>&amp;</font> node<font color=#990000>)</font> <b><font color=#0000FF>const</font></b><font color=#990000>;</font>
2161 mday   1.1 
2162 mday   1.4       <font color=#009900>void</font> <b><font color=#000000>get_timeout_interval</font></b><font color=#990000>(</font><b><font color=#0000FF>struct</font></b> timeval <font color=#990000>*</font>buffer<font color=#990000>)</font> <font color=#990000>;</font>
2163                  <font color=#009900>void</font> <b><font color=#000000>set_timeout_interval</font></b><font color=#990000>(</font><b><font color=#0000FF>const</font></b> <b><font color=#0000FF>struct</font></b> timeval <font color=#990000>*</font>interval<font color=#990000>)</font><font color=#990000>;</font>
2164 mday   1.1       
2165 mday   1.4       Boolean <b><font color=#000000>timeout</font></b><font color=#990000>(</font><font color=#009900>void</font><font color=#990000>)</font>  <font color=#990000>;</font>
2166 mday   1.1 
2167 mday   1.4       OperationContext <font color=#990000>&amp;</font> <b><font color=#000000>get_context</font></b><font color=#990000>(</font><font color=#009900>void</font><font color=#990000>)</font> <font color=#990000>;</font>
2168            
2169                  <font color=#009900>void</font> <b><font color=#000000>put_request</font></b><font color=#990000>(</font><b><font color=#0000FF>const</font></b> Message <font color=#990000>*</font>request<font color=#990000>)</font> <font color=#990000>;</font>
2170                  Message <font color=#990000>*</font><b><font color=#000000>get_request</font></b><font color=#990000>(</font><font color=#009900>void</font><font color=#990000>)</font> <font color=#990000>;</font>
2171                  
2172                  <font color=#009900>void</font> <b><font color=#000000>put_response</font></b><font color=#990000>(</font><b><font color=#0000FF>const</font></b> Message <font color=#990000>*</font>response<font color=#990000>)</font> <font color=#990000>;</font>
2173                  Message <font color=#990000>*</font><b><font color=#000000>get_response</font></b><font color=#990000>(</font><font color=#009900>void</font><font color=#990000>)</font> <font color=#990000>;</font>
2174                  
2175                  Uint32 <b><font color=#000000>read_state</font></b><font color=#990000>(</font><font color=#009900>void</font><font color=#990000>)</font> <font color=#990000>;</font>
2176                  <font color=#009900>void</font> <b><font color=#000000>write_state</font></b><font color=#990000>(</font>Uint32<font color=#990000>)</font> <font color=#990000>;</font>
2177                  
2178                  Uint32 <b><font color=#000000>read_flags</font></b><font color=#990000>(</font><font color=#009900>void</font><font color=#990000>)</font><font color=#990000>;</font>
2179                  <font color=#009900>void</font> <b><font color=#000000>write_flags</font></b><font color=#990000>(</font>Uint32<font color=#990000>)</font><font color=#990000>;</font>
2180                  
2181                  <font color=#009900>void</font> <b><font color=#000000>lock</font></b><font color=#990000>(</font><font color=#009900>void</font><font color=#990000>)</font>  <b><font color=#0000FF>throw</font></b><font color=#990000>(</font>IPCException<font color=#990000>)</font><font color=#990000>;</font>
2182                  <font color=#009900>void</font> <b><font color=#000000>unlock</font></b><font color=#990000>(</font><font color=#009900>void</font><font color=#990000>)</font> <b><font color=#0000FF>throw</font></b><font color=#990000>(</font>IPCException<font color=#990000>)</font><font color=#990000>;</font>
2183                  <font color=#009900>void</font> <b><font color=#000000>udpate</font></b><font color=#990000>(</font><font color=#009900>void</font><font color=#990000>)</font> <b><font color=#0000FF>throw</font></b><font color=#990000>(</font>IPCException<font color=#990000>)</font><font color=#990000>;</font>
2184                  <font color=#009900>void</font> <b><font color=#000000>deliver</font></b><font color=#990000>(</font><b><font color=#0000FF>const</font></b> Uint32 count<font color=#990000>)</font> <b><font color=#0000FF>throw</font></b><font color=#990000>(</font>IPCException<font color=#990000>)</font><font color=#990000>;</font>
2185                  <font color=#009900>void</font> <b><font color=#000000>reserve</font></b><font color=#990000>(</font><b><font color=#0000FF>const</font></b> Uint32 size<font color=#990000>)</font> <b><font color=#0000FF>throw</font></b><font color=#990000>(</font>IPCException<font color=#990000>)</font><font color=#990000>;</font>
2186                  <font color=#009900>void</font> <b><font color=#000000>processing</font></b><font color=#990000>(</font><font color=#009900>void</font><font color=#990000>)</font> <b><font color=#0000FF>throw</font></b><font color=#990000>(</font>IPCException<font color=#990000>)</font> <font color=#990000>;</font>
2187                  <font color=#009900>void</font> <b><font color=#000000>processing</font></b><font color=#990000>(</font>OperationContext <font color=#990000>*</font>context<font color=#990000>)</font> <b><font color=#0000FF>throw</font></b><font color=#990000>(</font>IPCException<font color=#990000>)</font><font color=#990000>;</font>
2188 mday   1.4       <font color=#009900>void</font> <b><font color=#000000>complete</font></b><font color=#990000>(</font><font color=#009900>void</font><font color=#990000>)</font> <b><font color=#0000FF>throw</font></b><font color=#990000>(</font>IPCException<font color=#990000>)</font> <font color=#990000>;</font>
2189                  <font color=#009900>void</font> <b><font color=#000000>complete</font></b><font color=#990000>(</font>OperationContext <font color=#990000>*</font>context<font color=#990000>)</font> <b><font color=#0000FF>throw</font></b><font color=#990000>(</font>IPCException<font color=#990000>)</font><font color=#990000>;</font>
2190                  <font color=#009900>void</font> <b><font color=#000000>release</font></b><font color=#990000>(</font><font color=#009900>void</font><font color=#990000>)</font><font color=#990000>;</font>
2191                  <font color=#009900>void</font> <b><font color=#000000>wait</font></b><font color=#990000>(</font><font color=#009900>void</font><font color=#990000>)</font><font color=#990000>;</font>
2192                  
2193                  
2194               <b><font color=#0000FF>private</font></b><font color=#990000>:</font>
2195                  Semaphore _client_sem<font color=#990000>;</font>
2196                  Mutex _mut<font color=#990000>;</font>
2197                  unlocked_dq<font color=#FF0000>&lt;Message&gt;</font> _request<font color=#990000>;</font>
2198                  unlocked_dq<font color=#FF0000>&lt;Message&gt;</font> _response<font color=#990000>;</font> 
2199                  
2200                  OperationContext _operation_list<font color=#990000>;</font>
2201                  Uint32 _state<font color=#990000>;</font>
2202                  Uint32 _flags<font color=#990000>;</font>
2203                  Uint32 _offered_count<font color=#990000>;</font>
2204                  Uint32 _total_ops<font color=#990000>;</font>
2205                  Uint32 _completed_ops<font color=#990000>;</font>
2206                  Uint32 _user_data<font color=#990000>;</font>
2207                  Uint32 _completion_code<font color=#990000>;</font>
2208                  MessageQueue <font color=#990000>*</font>_op_dest<font color=#990000>;</font>
2209 mday   1.4             
2210                  <b><font color=#0000FF>struct</font></b> timeval _start<font color=#990000>;</font>
2211                  <b><font color=#0000FF>struct</font></b> timeval _lifetime<font color=#990000>;</font>
2212                  <b><font color=#0000FF>struct</font></b> timeval _updated<font color=#990000>;</font>
2213                  <b><font color=#0000FF>struct</font></b> timeval _timeout_interval<font color=#990000>;</font>
2214            
2215                  AsyncOpNode <font color=#990000>*</font>_parent<font color=#990000>;</font>
2216                  unlocked_dq<font color=#FF0000>&lt;AsyncOpNode&gt;</font> _children<font color=#990000>;</font>
2217            
2218                  <font color=#009900>void</font> <b><font color=#000000>_reset</font></b><font color=#990000>(</font>unlocked_dq<font color=#FF0000>&lt;AsyncOpNode&gt;</font> <font color=#990000>*</font>dst_q<font color=#990000>)</font><font color=#990000>;</font>
2219            
2220                  <i><font color=#9A1900>// the lifetime member is for cache management by the cimom</font></i>
2221                  <font color=#009900>void</font> <b><font color=#000000>_set_lifetime</font></b><font color=#990000>(</font><b><font color=#0000FF>struct</font></b> timeval <font color=#990000>*</font>lifetime<font color=#990000>)</font> <font color=#990000>;</font>
2222                  Boolean <b><font color=#000000>_check_lifetime</font></b><font color=#990000>(</font><font color=#009900>void</font><font color=#990000>)</font> <font color=#990000>;</font>
2223            
2224                  Boolean <b><font color=#000000>_is_child</font></b><font color=#990000>(</font><font color=#009900>void</font><font color=#990000>)</font> <font color=#990000>;</font>
2225                  Uint32 <b><font color=#000000>_is_parent</font></b><font color=#990000>(</font><font color=#009900>void</font><font color=#990000>)</font> <font color=#990000>;</font>
2226                  Boolean <b><font color=#000000>_is_my_child</font></b><font color=#990000>(</font><b><font color=#0000FF>const</font></b> AsyncOpNode <font color=#990000>&amp;</font> caller<font color=#990000>)</font> <b><font color=#0000FF>const</font></b><font color=#990000>;</font>
2227                  <font color=#009900>void</font> <b><font color=#000000>_make_orphan</font></b><font color=#990000>(</font> AsyncOpNode <font color=#990000>&amp;</font> parent<font color=#990000>)</font> <font color=#990000>;</font>
2228                  <font color=#009900>void</font> <b><font color=#000000>_adopt_child</font></b><font color=#990000>(</font>AsyncOpNode <font color=#990000>*</font>child<font color=#990000>)</font> <font color=#990000>;</font>
2229                  <font color=#009900>void</font> <b><font color=#000000>_disown_child</font></b><font color=#990000>(</font>AsyncOpNode <font color=#990000>*</font>child<font color=#990000>)</font> <font color=#990000>;</font>
2230 mday   1.4       <font color=#009900>void</font> <font color=#990000>(</font><font color=#990000>*</font>_async_callback<font color=#990000>)</font><font color=#990000>(</font>AsyncOpNode <font color=#990000>*</font><font color=#990000>,</font> 
2231            			      MessageQueue <font color=#990000>*</font><font color=#990000>,</font> 
2232            			      <font color=#009900>void</font> <font color=#990000>*</font><font color=#990000>)</font><font color=#990000>;</font>
2233                  <i><font color=#9A1900>// &lt;&lt; Tue Mar 12 14:44:51 2002 mdd &gt;&gt;</font></i>
2234                  <i><font color=#9A1900>// pointers for async callbacks  - don't use </font></i>
2235                  AsyncOpNode <font color=#990000>*</font>_callback_node<font color=#990000>;</font>
2236                  MessageQueue <font color=#990000>*</font>_callback_response_q<font color=#990000>;</font>
2237                  <font color=#009900>void</font> <font color=#990000>*</font>_callback_ptr<font color=#990000>;</font>
2238                  MessageQueue <font color=#990000>*</font>_callback_request_q<font color=#990000>;</font>
2239                  <i><font color=#9A1900>//      &lt;&lt; Tue Mar 12 14:44:53 2002 mdd &gt;&gt;</font></i>
2240                  <i><font color=#9A1900>// pointers to help static class message handlers - don't use </font></i>
2241                  MessageQueue <font color=#990000>*</font>_service_ptr<font color=#990000>;</font>
2242                  Thread <font color=#990000>*</font>_thread_ptr<font color=#990000>;</font>
2243                        
2244                  <b><font color=#0000FF>friend</font></b> <b><font color=#0000FF>class</font></b> cimom<font color=#990000>;</font>
2245                  <b><font color=#0000FF>friend</font></b> <b><font color=#0000FF>class</font></b> MessageQueueService<font color=#990000>;</font>
2246 mday   1.1       
2247 mday   1.4 <font color=#FF0000>}</font><font color=#990000>;</font>
2248 mday   1.1 
2249            
2250 mday   1.4 <b><font color=#0000FF>inline</font></b> Boolean AsyncOpNode<font color=#990000>:</font><font color=#990000>:</font><b><font color=#0000FF>operator</font></b> <font color=#990000>=</font><font color=#990000>=</font> <font color=#990000>(</font><b><font color=#0000FF>const</font></b> <font color=#009900>void</font> <font color=#990000>*</font>key<font color=#990000>)</font> <b><font color=#0000FF>const</font></b>
2251            <font color=#FF0000>{</font>
2252               <b><font color=#0000FF>if</font></b> <font color=#990000>(</font>key <font color=#990000>=</font><font color=#990000>=</font> <font color=#990000>(</font><font color=#009900>void</font> <font color=#990000>*</font><font color=#990000>)</font><b><font color=#0000FF>this</font></b><font color=#990000>)</font>
2253                  <b><font color=#0000FF>return</font></b> <b><font color=#0000FF>true</font></b><font color=#990000>;</font>
2254               <b><font color=#0000FF>return</font></b> <b><font color=#0000FF>false</font></b><font color=#990000>;</font>
2255            <font color=#FF0000>}</font>
2256            
2257            <b><font color=#0000FF>inline</font></b> Boolean AsyncOpNode<font color=#990000>:</font><font color=#990000>:</font><b><font color=#0000FF>operator</font></b> <font color=#990000>=</font><font color=#990000>=</font> <font color=#990000>(</font><b><font color=#0000FF>const</font></b> AsyncOpNode <font color=#990000>&amp;</font> node<font color=#990000>)</font> <b><font color=#0000FF>const</font></b>
2258            <font color=#FF0000>{</font>
2259               <b><font color=#0000FF>return</font></b> AsyncOpNode<font color=#990000>:</font><font color=#990000>:</font><b><font color=#0000FF>operator</font></b><font color=#990000>=</font><font color=#990000>=</font><font color=#990000>(</font><font color=#990000>(</font><b><font color=#0000FF>const</font></b> <font color=#009900>void</font> <font color=#990000>*</font><font color=#990000>)</font><font color=#990000>&amp;</font>node<font color=#990000>)</font><font color=#990000>;</font>
2260            <font color=#FF0000>}</font>
2261            
2262            
2263            <b><font color=#0000FF>inline</font></b> <font color=#009900>void</font> AsyncOpNode<font color=#990000>:</font><font color=#990000>:</font><b><font color=#000000>get_timeout_interval</font></b><font color=#990000>(</font><b><font color=#0000FF>struct</font></b> timeval <font color=#990000>*</font>buffer<font color=#990000>)</font> 
2264            <font color=#FF0000>{</font>
2265               <b><font color=#0000FF>if</font></b><font color=#990000>(</font>buffer <font color=#990000>!</font><font color=#990000>=</font> <font color=#993399>0</font><font color=#990000>)</font>
2266               <font color=#FF0000>{</font>
2267                  _mut<font color=#990000>.</font><b><font color=#000000>lock</font></b><font color=#990000>(</font> <b><font color=#000000>pegasus_thread_self</font></b><font color=#990000>(</font><font color=#990000>)</font> <font color=#990000>)</font><font color=#990000>;</font>
2268                  buffer<font color=#990000>-</font><font color=#990000>&gt;</font>tv_sec <font color=#990000>=</font> _timeout_interval<font color=#990000>.</font>tv_sec<font color=#990000>;</font>
2269                  buffer<font color=#990000>-</font><font color=#990000>&gt;</font>tv_usec <font color=#990000>=</font> _timeout_interval<font color=#990000>.</font>tv_usec<font color=#990000>;</font>
2270                  _mut<font color=#990000>.</font><b><font color=#000000>unlock</font></b><font color=#990000>(</font><font color=#990000>)</font><font color=#990000>;</font>
2271 mday   1.4    <font color=#FF0000>}</font>
2272               <b><font color=#0000FF>return</font></b><font color=#990000>;</font>
2273            <font color=#FF0000>}</font>
2274            
2275            <b><font color=#0000FF>inline</font></b> <font color=#009900>void</font> AsyncOpNode<font color=#990000>:</font><font color=#990000>:</font><b><font color=#000000>set_timeout_interval</font></b><font color=#990000>(</font><b><font color=#0000FF>const</font></b> <b><font color=#0000FF>struct</font></b> timeval <font color=#990000>*</font>interval<font color=#990000>)</font>
2276            <font color=#FF0000>{</font>
2277               <b><font color=#0000FF>if</font></b><font color=#990000>(</font>interval <font color=#990000>!</font><font color=#990000>=</font> <font color=#993399>0</font><font color=#990000>)</font>
2278               <font color=#FF0000>{</font>
2279                  _mut<font color=#990000>.</font><b><font color=#000000>lock</font></b><font color=#990000>(</font><b><font color=#000000>pegasus_thread_self</font></b><font color=#990000>(</font><font color=#990000>)</font><font color=#990000>)</font><font color=#990000>;</font>
2280                  _timeout_interval<font color=#990000>.</font>tv_sec <font color=#990000>=</font> interval<font color=#990000>-</font><font color=#990000>&gt;</font>tv_sec<font color=#990000>;</font>
2281                  _timeout_interval<font color=#990000>.</font>tv_usec <font color=#990000>=</font> interval<font color=#990000>-</font><font color=#990000>&gt;</font>tv_usec<font color=#990000>;</font>
2282                  <b><font color=#000000>gettimeofday</font></b><font color=#990000>(</font><font color=#990000>&amp;</font>_updated<font color=#990000>,</font> NULL<font color=#990000>)</font><font color=#990000>;</font>
2283                  _mut<font color=#990000>.</font><b><font color=#000000>unlock</font></b><font color=#990000>(</font><font color=#990000>)</font><font color=#990000>;</font>
2284               <font color=#FF0000>}</font>
2285            <font color=#FF0000>}</font>
2286            
2287            
2288            <b><font color=#0000FF>inline</font></b> Boolean AsyncOpNode<font color=#990000>:</font><font color=#990000>:</font><b><font color=#000000>timeout</font></b><font color=#990000>(</font><font color=#009900>void</font><font color=#990000>)</font> 
2289            <font color=#FF0000>{</font>
2290               <b><font color=#0000FF>struct</font></b> timeval now<font color=#990000>;</font>
2291               <b><font color=#000000>gettimeofday</font></b><font color=#990000>(</font><font color=#990000>&amp;</font>now<font color=#990000>,</font> NULL<font color=#990000>)</font><font color=#990000>;</font>
2292 mday   1.4    Boolean ret <font color=#990000>=</font> <b><font color=#0000FF>false</font></b><font color=#990000>;</font>
2293               _mut<font color=#990000>.</font><b><font color=#000000>lock</font></b><font color=#990000>(</font><b><font color=#000000>pegasus_thread_self</font></b><font color=#990000>(</font><font color=#990000>)</font><font color=#990000>)</font><font color=#990000>;</font>
2294               <b><font color=#0000FF>if</font></b><font color=#990000>(</font><font color=#990000>(</font>_updated<font color=#990000>.</font>tv_sec <font color=#990000>+</font> _timeout_interval<font color=#990000>.</font>tv_sec <font color=#990000>)</font> <font color=#990000>&lt;</font> now<font color=#990000>.</font>tv_sec<font color=#990000>)</font>
2295                  <b><font color=#0000FF>if</font></b><font color=#990000>(</font><font color=#990000>(</font>_updated<font color=#990000>.</font>tv_usec <font color=#990000>+</font> _timeout_interval<font color=#990000>.</font>tv_usec <font color=#990000>)</font> <font color=#990000>&lt;</font> now<font color=#990000>.</font>tv_usec<font color=#990000>)</font>
2296            	 ret <font color=#990000>=</font>  <b><font color=#0000FF>true</font></b><font color=#990000>;</font>
2297               _mut<font color=#990000>.</font><b><font color=#000000>unlock</font></b><font color=#990000>(</font><font color=#990000>)</font><font color=#990000>;</font>
2298               <b><font color=#0000FF>return</font></b> ret<font color=#990000>;</font>
2299            <font color=#FF0000>}</font>
2300            
2301            <i><font color=#9A1900>// context is now a locked list</font></i>
2302            <b><font color=#0000FF>inline</font></b> OperationContext <font color=#990000>&amp;</font> AsyncOpNode<font color=#990000>:</font><font color=#990000>:</font><b><font color=#000000>get_context</font></b><font color=#990000>(</font><font color=#009900>void</font><font color=#990000>)</font>
2303            <font color=#FF0000>{</font>
2304               <b><font color=#000000>gettimeofday</font></b><font color=#990000>(</font><font color=#990000>&amp;</font>_updated<font color=#990000>,</font> NULL<font color=#990000>)</font><font color=#990000>;</font>
2305               <b><font color=#0000FF>return</font></b> _operation_list<font color=#990000>;</font>
2306            <font color=#FF0000>}</font>
2307            
2308            
2309            <b><font color=#0000FF>inline</font></b>  <font color=#009900>void</font> AsyncOpNode<font color=#990000>:</font><font color=#990000>:</font><b><font color=#000000>put_request</font></b><font color=#990000>(</font><b><font color=#0000FF>const</font></b> Message <font color=#990000>*</font>request<font color=#990000>)</font> 
2310            <font color=#FF0000>{</font>
2311               _mut<font color=#990000>.</font><b><font color=#000000>lock</font></b><font color=#990000>(</font><b><font color=#000000>pegasus_thread_self</font></b><font color=#990000>(</font><font color=#990000>)</font><font color=#990000>)</font><font color=#990000>;</font>
2312               <b><font color=#000000>gettimeofday</font></b><font color=#990000>(</font><font color=#990000>&amp;</font>_updated<font color=#990000>,</font> NULL<font color=#990000>)</font><font color=#990000>;</font>
2313 mday   1.4    <b><font color=#0000FF>if</font></b><font color=#990000>(</font> <b><font color=#0000FF>false</font></b> <font color=#990000>=</font><font color=#990000>=</font> _request<font color=#990000>.</font><b><font color=#000000>exists</font></b><font color=#990000>(</font><b><font color=#0000FF>reinterpret_cast</font></b><font color=#990000>&lt;</font><font color=#009900>void</font> <font color=#990000>*</font><font color=#990000>&gt;</font><font color=#990000>(</font><b><font color=#0000FF>const_cast</font></b><font color=#990000>&lt;</font>Message <font color=#990000>*</font><font color=#990000>&gt;</font><font color=#990000>(</font>request<font color=#990000>)</font><font color=#990000>)</font><font color=#990000>)</font> <font color=#990000>)</font>
2314               _request<font color=#990000>.</font><b><font color=#000000>insert_last</font></b><font color=#990000>(</font> <b><font color=#0000FF>const_cast</font></b><font color=#990000>&lt;</font>Message <font color=#990000>*</font><font color=#990000>&gt;</font><font color=#990000>(</font>request<font color=#990000>)</font> <font color=#990000>)</font> <font color=#990000>;</font>
2315 mday   1.1 
2316 mday   1.4 <i><font color=#9A1900>//   _request = const_cast&lt;Message *&gt;(request);</font></i>
2317               
2318               _mut<font color=#990000>.</font><b><font color=#000000>unlock</font></b><font color=#990000>(</font><font color=#990000>)</font><font color=#990000>;</font>
2319            <font color=#FF0000>}</font>
2320 mday   1.1 
2321 mday   1.4 <b><font color=#0000FF>inline</font></b> Message <font color=#990000>*</font> AsyncOpNode<font color=#990000>:</font><font color=#990000>:</font><b><font color=#000000>get_request</font></b><font color=#990000>(</font><font color=#009900>void</font><font color=#990000>)</font> 
2322            <font color=#FF0000>{</font>
2323               Message <font color=#990000>*</font>ret<font color=#990000>;</font>
2324               _mut<font color=#990000>.</font><b><font color=#000000>lock</font></b><font color=#990000>(</font><b><font color=#000000>pegasus_thread_self</font></b><font color=#990000>(</font><font color=#990000>)</font><font color=#990000>)</font><font color=#990000>;</font>
2325               <b><font color=#000000>gettimeofday</font></b><font color=#990000>(</font><font color=#990000>&amp;</font>_updated<font color=#990000>,</font> NULL<font color=#990000>)</font><font color=#990000>;</font>
2326               ret <font color=#990000>=</font> _request<font color=#990000>.</font><b><font color=#000000>remove_first</font></b><font color=#990000>(</font><font color=#990000>)</font> <font color=#990000>;</font>
2327            <i><font color=#9A1900>//   ret = _request;</font></i>
2328               
2329               _mut<font color=#990000>.</font><b><font color=#000000>unlock</font></b><font color=#990000>(</font><font color=#990000>)</font><font color=#990000>;</font>
2330               <b><font color=#0000FF>return</font></b> ret<font color=#990000>;</font>
2331            <font color=#FF0000>}</font>
2332            
2333            <b><font color=#0000FF>inline</font></b> <font color=#009900>void</font> AsyncOpNode<font color=#990000>:</font><font color=#990000>:</font><b><font color=#000000>put_response</font></b><font color=#990000>(</font><b><font color=#0000FF>const</font></b> Message <font color=#990000>*</font>response<font color=#990000>)</font> 
2334            <font color=#FF0000>{</font>
2335               _mut<font color=#990000>.</font><b><font color=#000000>lock</font></b><font color=#990000>(</font><b><font color=#000000>pegasus_thread_self</font></b><font color=#990000>(</font><font color=#990000>)</font><font color=#990000>)</font><font color=#990000>;</font>
2336               <b><font color=#000000>gettimeofday</font></b><font color=#990000>(</font><font color=#990000>&amp;</font>_updated<font color=#990000>,</font> NULL<font color=#990000>)</font><font color=#990000>;</font>
2337               <b><font color=#0000FF>if</font></b> <font color=#990000>(</font><b><font color=#0000FF>false</font></b> <font color=#990000>=</font><font color=#990000>=</font> _response<font color=#990000>.</font><b><font color=#000000>exists</font></b><font color=#990000>(</font><b><font color=#0000FF>reinterpret_cast</font></b><font color=#990000>&lt;</font><font color=#009900>void</font> <font color=#990000>*</font><font color=#990000>&gt;</font><font color=#990000>(</font><b><font color=#0000FF>const_cast</font></b><font color=#990000>&lt;</font>Message <font color=#990000>*</font><font color=#990000>&gt;</font><font color=#990000>(</font>response<font color=#990000>)</font><font color=#990000>)</font><font color=#990000>)</font><font color=#990000>)</font>
2338               _response<font color=#990000>.</font><b><font color=#000000>insert_last</font></b><font color=#990000>(</font> <b><font color=#0000FF>const_cast</font></b><font color=#990000>&lt;</font>Message <font color=#990000>*</font><font color=#990000>&gt;</font><font color=#990000>(</font>response<font color=#990000>)</font> <font color=#990000>)</font><font color=#990000>;</font>
2339 mday   1.1 
2340 mday   1.4 <i><font color=#9A1900>//   _response = const_cast&lt;Message *&gt;(response);</font></i>
2341               
2342               _mut<font color=#990000>.</font><b><font color=#000000>unlock</font></b><font color=#990000>(</font><font color=#990000>)</font><font color=#990000>;</font>
2343            <font color=#FF0000>}</font>
2344 mday   1.1 
2345 mday   1.4 <b><font color=#0000FF>inline</font></b> Message <font color=#990000>*</font> AsyncOpNode<font color=#990000>:</font><font color=#990000>:</font><b><font color=#000000>get_response</font></b><font color=#990000>(</font><font color=#009900>void</font><font color=#990000>)</font> 
2346            <font color=#FF0000>{</font>
2347               Message <font color=#990000>*</font>ret<font color=#990000>;</font>
2348            
2349               _mut<font color=#990000>.</font><b><font color=#000000>lock</font></b><font color=#990000>(</font><b><font color=#000000>pegasus_thread_self</font></b><font color=#990000>(</font><font color=#990000>)</font><font color=#990000>)</font><font color=#990000>;</font>
2350            <i><font color=#9A1900>//   gettimeofday(&amp;_updated, NULL);</font></i>
2351               ret <font color=#990000>=</font> _response<font color=#990000>.</font><b><font color=#000000>remove_first</font></b><font color=#990000>(</font><font color=#990000>)</font><font color=#990000>;</font>
2352            <i><font color=#9A1900>//   ret = _response;</font></i>
2353               
2354               _mut<font color=#990000>.</font><b><font color=#000000>unlock</font></b><font color=#990000>(</font><font color=#990000>)</font><font color=#990000>;</font>
2355               <b><font color=#0000FF>return</font></b> ret<font color=#990000>;</font>
2356            <font color=#FF0000>}</font>
2357            
2358            <b><font color=#0000FF>inline</font></b> Uint32 AsyncOpNode<font color=#990000>:</font><font color=#990000>:</font><b><font color=#000000>read_state</font></b><font color=#990000>(</font><font color=#009900>void</font><font color=#990000>)</font>
2359            <font color=#FF0000>{</font>
2360               _mut<font color=#990000>.</font><b><font color=#000000>lock</font></b><font color=#990000>(</font><b><font color=#000000>pegasus_thread_self</font></b><font color=#990000>(</font><font color=#990000>)</font><font color=#990000>)</font><font color=#990000>;</font>
2361               <b><font color=#000000>gettimeofday</font></b><font color=#990000>(</font><font color=#990000>&amp;</font>_updated<font color=#990000>,</font> NULL<font color=#990000>)</font><font color=#990000>;</font>
2362               Uint32 ret <font color=#990000>=</font> _state<font color=#990000>;</font>
2363               _mut<font color=#990000>.</font><b><font color=#000000>unlock</font></b><font color=#990000>(</font><font color=#990000>)</font><font color=#990000>;</font>
2364               <b><font color=#0000FF>return</font></b> ret<font color=#990000>;</font>
2365               
2366 mday   1.4 <font color=#FF0000>}</font>
2367 mday   1.1 
2368 mday   1.4 <b><font color=#0000FF>inline</font></b> <font color=#009900>void</font> AsyncOpNode<font color=#990000>:</font><font color=#990000>:</font><b><font color=#000000>write_state</font></b><font color=#990000>(</font>Uint32 state<font color=#990000>)</font>
2369            <font color=#FF0000>{</font>
2370               _mut<font color=#990000>.</font><b><font color=#000000>lock</font></b><font color=#990000>(</font><b><font color=#000000>pegasus_thread_self</font></b><font color=#990000>(</font><font color=#990000>)</font><font color=#990000>)</font><font color=#990000>;</font>
2371               <b><font color=#000000>gettimeofday</font></b><font color=#990000>(</font><font color=#990000>&amp;</font>_updated<font color=#990000>,</font> NULL<font color=#990000>)</font><font color=#990000>;</font>
2372               _state <font color=#990000>=</font> state<font color=#990000>;</font>
2373               _mut<font color=#990000>.</font><b><font color=#000000>unlock</font></b><font color=#990000>(</font><font color=#990000>)</font><font color=#990000>;</font>
2374            <font color=#FF0000>}</font>
2375            
2376            <b><font color=#0000FF>inline</font></b> Uint32 AsyncOpNode<font color=#990000>:</font><font color=#990000>:</font><b><font color=#000000>read_flags</font></b><font color=#990000>(</font><font color=#009900>void</font><font color=#990000>)</font>
2377            <font color=#FF0000>{</font>
2378               _mut<font color=#990000>.</font><b><font color=#000000>lock</font></b><font color=#990000>(</font><b><font color=#000000>pegasus_thread_self</font></b><font color=#990000>(</font><font color=#990000>)</font><font color=#990000>)</font><font color=#990000>;</font>
2379               <b><font color=#000000>gettimeofday</font></b><font color=#990000>(</font><font color=#990000>&amp;</font>_updated<font color=#990000>,</font> NULL<font color=#990000>)</font><font color=#990000>;</font>
2380               Uint32 ret <font color=#990000>=</font> _flags<font color=#990000>;</font>
2381               _mut<font color=#990000>.</font><b><font color=#000000>unlock</font></b><font color=#990000>(</font><font color=#990000>)</font><font color=#990000>;</font>
2382               <b><font color=#0000FF>return</font></b> ret<font color=#990000>;</font>
2383            <font color=#FF0000>}</font>
2384            
2385            <b><font color=#0000FF>inline</font></b> <font color=#009900>void</font> AsyncOpNode<font color=#990000>:</font><font color=#990000>:</font><b><font color=#000000>write_flags</font></b><font color=#990000>(</font>Uint32 flags<font color=#990000>)</font>
2386            <font color=#FF0000>{</font>   
2387               _mut<font color=#990000>.</font><b><font color=#000000>lock</font></b><font color=#990000>(</font><b><font color=#000000>pegasus_thread_self</font></b><font color=#990000>(</font><font color=#990000>)</font><font color=#990000>)</font><font color=#990000>;</font>
2388               <b><font color=#000000>gettimeofday</font></b><font color=#990000>(</font><font color=#990000>&amp;</font>_updated<font color=#990000>,</font> NULL<font color=#990000>)</font><font color=#990000>;</font>
2389 mday   1.4    _flags <font color=#990000>=</font> flags<font color=#990000>;</font>
2390               _mut<font color=#990000>.</font><b><font color=#000000>unlock</font></b><font color=#990000>(</font><font color=#990000>)</font><font color=#990000>;</font>
2391            <font color=#FF0000>}</font>
2392            
2393            
2394            <b><font color=#0000FF>inline</font></b>  <font color=#009900>void</font> AsyncOpNode<font color=#990000>:</font><font color=#990000>:</font><b><font color=#000000>lock</font></b><font color=#990000>(</font><font color=#009900>void</font><font color=#990000>)</font>  
2395               <b><font color=#0000FF>throw</font></b><font color=#990000>(</font>IPCException<font color=#990000>)</font> 
2396            <font color=#FF0000>{</font>
2397               _mut<font color=#990000>.</font><b><font color=#000000>lock</font></b><font color=#990000>(</font><b><font color=#000000>pegasus_thread_self</font></b><font color=#990000>(</font><font color=#990000>)</font><font color=#990000>)</font><font color=#990000>;</font>
2398            <font color=#FF0000>}</font>
2399            
2400            <b><font color=#0000FF>inline</font></b> <font color=#009900>void</font> AsyncOpNode<font color=#990000>:</font><font color=#990000>:</font><b><font color=#000000>unlock</font></b><font color=#990000>(</font><font color=#009900>void</font><font color=#990000>)</font> 
2401               <b><font color=#0000FF>throw</font></b><font color=#990000>(</font>IPCException<font color=#990000>)</font> 
2402            <font color=#FF0000>{</font>
2403               _mut<font color=#990000>.</font><b><font color=#000000>unlock</font></b><font color=#990000>(</font><font color=#990000>)</font><font color=#990000>;</font>
2404            <font color=#FF0000>}</font>
2405            
2406            <b><font color=#0000FF>inline</font></b> <font color=#009900>void</font> AsyncOpNode<font color=#990000>:</font><font color=#990000>:</font><b><font color=#000000>udpate</font></b><font color=#990000>(</font><font color=#009900>void</font><font color=#990000>)</font>
2407               <b><font color=#0000FF>throw</font></b><font color=#990000>(</font>IPCException<font color=#990000>)</font>
2408            <font color=#FF0000>{</font>
2409               _mut<font color=#990000>.</font><b><font color=#000000>lock</font></b><font color=#990000>(</font><b><font color=#000000>pegasus_thread_self</font></b><font color=#990000>(</font><font color=#990000>)</font><font color=#990000>)</font><font color=#990000>;</font>
2410 mday   1.4    <b><font color=#000000>gettimeofday</font></b><font color=#990000>(</font><font color=#990000>&amp;</font>_updated<font color=#990000>,</font> NULL<font color=#990000>)</font><font color=#990000>;</font>
2411               _mut<font color=#990000>.</font><b><font color=#000000>unlock</font></b><font color=#990000>(</font><font color=#990000>)</font><font color=#990000>;</font>
2412               <b><font color=#0000FF>return</font></b><font color=#990000>;</font>
2413            <font color=#FF0000>}</font>
2414            
2415            <b><font color=#0000FF>inline</font></b> <font color=#009900>void</font> AsyncOpNode<font color=#990000>:</font><font color=#990000>:</font><b><font color=#000000>deliver</font></b><font color=#990000>(</font><b><font color=#0000FF>const</font></b> Uint32 count<font color=#990000>)</font> 
2416               <b><font color=#0000FF>throw</font></b><font color=#990000>(</font>IPCException<font color=#990000>)</font>
2417            <font color=#FF0000>{</font>
2418               _mut<font color=#990000>.</font><b><font color=#000000>lock</font></b><font color=#990000>(</font><b><font color=#000000>pegasus_thread_self</font></b><font color=#990000>(</font><font color=#990000>)</font><font color=#990000>)</font><font color=#990000>;</font>
2419               _completed_ops <font color=#990000>=</font> count<font color=#990000>;</font>
2420               _state <font color=#990000>|</font><font color=#990000>=</font> ASYNC_OPSTATE_DELIVER<font color=#990000>;</font>
2421               <b><font color=#000000>gettimeofday</font></b><font color=#990000>(</font><font color=#990000>&amp;</font>_updated<font color=#990000>,</font> NULL<font color=#990000>)</font><font color=#990000>;</font>
2422               _mut<font color=#990000>.</font><b><font color=#000000>unlock</font></b><font color=#990000>(</font><font color=#990000>)</font><font color=#990000>;</font>
2423               <b><font color=#0000FF>return</font></b><font color=#990000>;</font>
2424            <font color=#FF0000>}</font>
2425            
2426            <b><font color=#0000FF>inline</font></b> <font color=#009900>void</font> AsyncOpNode<font color=#990000>:</font><font color=#990000>:</font><b><font color=#000000>reserve</font></b><font color=#990000>(</font><b><font color=#0000FF>const</font></b> Uint32 size<font color=#990000>)</font>
2427               <b><font color=#0000FF>throw</font></b><font color=#990000>(</font>IPCException<font color=#990000>)</font>
2428            <font color=#FF0000>{</font>
2429               _mut<font color=#990000>.</font><b><font color=#000000>lock</font></b><font color=#990000>(</font><b><font color=#000000>pegasus_thread_self</font></b><font color=#990000>(</font><font color=#990000>)</font><font color=#990000>)</font><font color=#990000>;</font>
2430               _total_ops <font color=#990000>=</font> size<font color=#990000>;</font>
2431 mday   1.4    _state <font color=#990000>|</font><font color=#990000>=</font> ASYNC_OPSTATE_RESERVE<font color=#990000>;</font>
2432               <b><font color=#000000>gettimeofday</font></b><font color=#990000>(</font><font color=#990000>&amp;</font>_updated<font color=#990000>,</font> NULL<font color=#990000>)</font><font color=#990000>;</font>
2433               _mut<font color=#990000>.</font><b><font color=#000000>unlock</font></b><font color=#990000>(</font><font color=#990000>)</font><font color=#990000>;</font>
2434               <b><font color=#0000FF>return</font></b><font color=#990000>;</font>
2435            <font color=#FF0000>}</font>
2436            
2437            <b><font color=#0000FF>inline</font></b> <font color=#009900>void</font> AsyncOpNode<font color=#990000>:</font><font color=#990000>:</font><b><font color=#000000>processing</font></b><font color=#990000>(</font><font color=#009900>void</font><font color=#990000>)</font> 
2438               <b><font color=#0000FF>throw</font></b><font color=#990000>(</font>IPCException<font color=#990000>)</font>
2439            <font color=#FF0000>{</font>
2440               _mut<font color=#990000>.</font><b><font color=#000000>lock</font></b><font color=#990000>(</font><b><font color=#000000>pegasus_thread_self</font></b><font color=#990000>(</font><font color=#990000>)</font><font color=#990000>)</font><font color=#990000>;</font>
2441               _state <font color=#990000>|</font><font color=#990000>=</font> ASYNC_OPSTATE_PROCESSING<font color=#990000>;</font>
2442               <b><font color=#000000>gettimeofday</font></b><font color=#990000>(</font><font color=#990000>&amp;</font>_updated<font color=#990000>,</font> NULL<font color=#990000>)</font><font color=#990000>;</font>
2443               _mut<font color=#990000>.</font><b><font color=#000000>unlock</font></b><font color=#990000>(</font><font color=#990000>)</font><font color=#990000>;</font>
2444               <b><font color=#0000FF>return</font></b><font color=#990000>;</font>
2445            <font color=#FF0000>}</font>
2446            
2447            <i><font color=#9A1900>// con will be empty upon return of this member function</font></i>
2448            <b><font color=#0000FF>inline</font></b> <font color=#009900>void</font> AsyncOpNode<font color=#990000>:</font><font color=#990000>:</font><b><font color=#000000>processing</font></b><font color=#990000>(</font>OperationContext <font color=#990000>*</font>con<font color=#990000>)</font> 
2449               <b><font color=#0000FF>throw</font></b><font color=#990000>(</font>IPCException<font color=#990000>)</font>
2450            <font color=#FF0000>{</font>
2451               _mut<font color=#990000>.</font><b><font color=#000000>lock</font></b><font color=#990000>(</font><b><font color=#000000>pegasus_thread_self</font></b><font color=#990000>(</font><font color=#990000>)</font><font color=#990000>)</font><font color=#990000>;</font>
2452 mday   1.4    _state <font color=#990000>|</font><font color=#990000>=</font> ASYNC_OPSTATE_PROCESSING<font color=#990000>;</font>
2453               <b><font color=#000000>gettimeofday</font></b><font color=#990000>(</font><font color=#990000>&amp;</font>_updated<font color=#990000>,</font> NULL<font color=#990000>)</font><font color=#990000>;</font>
2454               
2455               context <font color=#990000>*</font>c <font color=#990000>=</font> con<font color=#990000>-</font><font color=#990000>&gt;</font><b><font color=#000000>remove_context</font></b><font color=#990000>(</font><font color=#990000>)</font><font color=#990000>;</font>
2456               <b><font color=#0000FF>while</font></b><font color=#990000>(</font>c <font color=#990000>!</font><font color=#990000>=</font> <font color=#993399>0</font><font color=#990000>)</font>
2457               <font color=#FF0000>{</font>
2458                  _operation_list<font color=#990000>.</font><b><font color=#000000>add_context</font></b><font color=#990000>(</font>c<font color=#990000>)</font><font color=#990000>;</font>
2459                  c <font color=#990000>=</font> con<font color=#990000>-</font><font color=#990000>&gt;</font><b><font color=#000000>remove_context</font></b><font color=#990000>(</font><font color=#990000>)</font><font color=#990000>;</font>
2460               <font color=#FF0000>}</font>
2461               _mut<font color=#990000>.</font><b><font color=#000000>unlock</font></b><font color=#990000>(</font><font color=#990000>)</font><font color=#990000>;</font>
2462               <b><font color=#0000FF>return</font></b><font color=#990000>;</font>
2463            <font color=#FF0000>}</font>
2464            
2465            <b><font color=#0000FF>inline</font></b> <font color=#009900>void</font> AsyncOpNode<font color=#990000>:</font><font color=#990000>:</font><b><font color=#000000>complete</font></b><font color=#990000>(</font><font color=#009900>void</font><font color=#990000>)</font> 
2466               <b><font color=#0000FF>throw</font></b><font color=#990000>(</font>IPCException<font color=#990000>)</font>
2467            <font color=#FF0000>{</font>
2468               _mut<font color=#990000>.</font><b><font color=#000000>lock</font></b><font color=#990000>(</font><b><font color=#000000>pegasus_thread_self</font></b><font color=#990000>(</font><font color=#990000>)</font><font color=#990000>)</font><font color=#990000>;</font>
2469               _state <font color=#990000>|</font><font color=#990000>=</font> ASYNC_OPSTATE_COMPLETE<font color=#990000>;</font>
2470               <b><font color=#000000>gettimeofday</font></b><font color=#990000>(</font><font color=#990000>&amp;</font>_updated<font color=#990000>,</font> NULL<font color=#990000>)</font><font color=#990000>;</font>
2471               _mut<font color=#990000>.</font><b><font color=#000000>unlock</font></b><font color=#990000>(</font><font color=#990000>)</font><font color=#990000>;</font>
2472            
2473 mday   1.4    <b><font color=#0000FF>return</font></b><font color=#990000>;</font>
2474            <font color=#FF0000>}</font>
2475            
2476            <b><font color=#0000FF>inline</font></b> <font color=#009900>void</font> AsyncOpNode<font color=#990000>:</font><font color=#990000>:</font><b><font color=#000000>complete</font></b><font color=#990000>(</font>OperationContext <font color=#990000>*</font>con<font color=#990000>)</font>
2477               <b><font color=#0000FF>throw</font></b><font color=#990000>(</font>IPCException<font color=#990000>)</font>
2478            <font color=#FF0000>{</font>
2479               _mut<font color=#990000>.</font><b><font color=#000000>lock</font></b><font color=#990000>(</font><b><font color=#000000>pegasus_thread_self</font></b><font color=#990000>(</font><font color=#990000>)</font><font color=#990000>)</font><font color=#990000>;</font>
2480               _state <font color=#990000>|</font><font color=#990000>=</font> ASYNC_OPSTATE_COMPLETE<font color=#990000>;</font>
2481               <b><font color=#000000>gettimeofday</font></b><font color=#990000>(</font><font color=#990000>&amp;</font>_updated<font color=#990000>,</font> NULL<font color=#990000>)</font><font color=#990000>;</font>
2482               context <font color=#990000>*</font>c <font color=#990000>=</font> con<font color=#990000>-</font><font color=#990000>&gt;</font><b><font color=#000000>remove_context</font></b><font color=#990000>(</font><font color=#990000>)</font><font color=#990000>;</font>
2483               <b><font color=#0000FF>while</font></b><font color=#990000>(</font>c <font color=#990000>!</font><font color=#990000>=</font> <font color=#993399>0</font><font color=#990000>)</font>
2484               <font color=#FF0000>{</font>
2485                  _operation_list<font color=#990000>.</font><b><font color=#000000>add_context</font></b><font color=#990000>(</font>c<font color=#990000>)</font><font color=#990000>;</font>
2486                  c <font color=#990000>=</font> con<font color=#990000>-</font><font color=#990000>&gt;</font><b><font color=#000000>remove_context</font></b><font color=#990000>(</font><font color=#990000>)</font><font color=#990000>;</font>
2487               <font color=#FF0000>}</font>
2488               _mut<font color=#990000>.</font><b><font color=#000000>unlock</font></b><font color=#990000>(</font><font color=#990000>)</font><font color=#990000>;</font>
2489            <font color=#FF0000>}</font>
2490            
2491            <b><font color=#0000FF>inline</font></b> <font color=#009900>void</font> AsyncOpNode<font color=#990000>:</font><font color=#990000>:</font><b><font color=#000000>wait</font></b><font color=#990000>(</font><font color=#009900>void</font><font color=#990000>)</font>
2492            <font color=#FF0000>{</font>
2493               _client_sem<font color=#990000>.</font><b><font color=#000000>wait</font></b><font color=#990000>(</font><font color=#990000>)</font><font color=#990000>;</font>
2494 mday   1.4 <font color=#FF0000>}</font>
2495            
2496            <b><font color=#0000FF>inline</font></b> <font color=#009900>void</font> AsyncOpNode<font color=#990000>:</font><font color=#990000>:</font><b><font color=#000000>release</font></b><font color=#990000>(</font><font color=#009900>void</font><font color=#990000>)</font>
2497            <font color=#FF0000>{</font>
2498               _mut<font color=#990000>.</font><b><font color=#000000>lock</font></b><font color=#990000>(</font><b><font color=#000000>pegasus_thread_self</font></b><font color=#990000>(</font><font color=#990000>)</font><font color=#990000>)</font><font color=#990000>;</font>
2499               _state <font color=#990000>|</font><font color=#990000>=</font> ASYNC_OPSTATE_RELEASED<font color=#990000>;</font>
2500               _mut<font color=#990000>.</font><b><font color=#000000>unlock</font></b><font color=#990000>(</font><font color=#990000>)</font><font color=#990000>;</font>
2501            <font color=#FF0000>}</font>
2502            
2503            <b><font color=#0000FF>inline</font></b>  <font color=#009900>void</font> AsyncOpNode<font color=#990000>:</font><font color=#990000>:</font><b><font color=#000000>_set_lifetime</font></b><font color=#990000>(</font><b><font color=#0000FF>struct</font></b> timeval <font color=#990000>*</font>lifetime<font color=#990000>)</font> 
2504            <font color=#FF0000>{</font>
2505               _mut<font color=#990000>.</font><b><font color=#000000>lock</font></b><font color=#990000>(</font><b><font color=#000000>pegasus_thread_self</font></b><font color=#990000>(</font><font color=#990000>)</font><font color=#990000>)</font><font color=#990000>;</font>
2506               _lifetime<font color=#990000>.</font>tv_sec <font color=#990000>=</font> lifetime<font color=#990000>-</font><font color=#990000>&gt;</font>tv_sec<font color=#990000>;</font>
2507               _lifetime<font color=#990000>.</font>tv_usec <font color=#990000>=</font> lifetime<font color=#990000>-</font><font color=#990000>&gt;</font>tv_usec<font color=#990000>;</font>
2508               _mut<font color=#990000>.</font><b><font color=#000000>unlock</font></b><font color=#990000>(</font><font color=#990000>)</font><font color=#990000>;</font>
2509            <font color=#FF0000>}</font>
2510            
2511            <b><font color=#0000FF>inline</font></b> Boolean AsyncOpNode<font color=#990000>:</font><font color=#990000>:</font><b><font color=#000000>_check_lifetime</font></b><font color=#990000>(</font><font color=#009900>void</font><font color=#990000>)</font> 
2512            <font color=#FF0000>{</font>
2513               <b><font color=#0000FF>struct</font></b> timeval now<font color=#990000>;</font>
2514               
2515 mday   1.4    <b><font color=#000000>gettimeofday</font></b><font color=#990000>(</font><font color=#990000>&amp;</font>now<font color=#990000>,</font> NULL<font color=#990000>)</font><font color=#990000>;</font>
2516               <b><font color=#0000FF>if</font></b><font color=#990000>(</font><font color=#990000>(</font>_start<font color=#990000>.</font>tv_sec <font color=#990000>+</font> _lifetime<font color=#990000>.</font>tv_sec <font color=#990000>)</font> <font color=#990000>&gt;</font><font color=#990000>=</font> now<font color=#990000>.</font>tv_sec<font color=#990000>)</font>
2517                  <b><font color=#0000FF>if</font></b><font color=#990000>(</font><font color=#990000>(</font>_start<font color=#990000>.</font>tv_usec <font color=#990000>+</font> _lifetime<font color=#990000>.</font>tv_usec <font color=#990000>)</font> <font color=#990000>&gt;</font><font color=#990000>=</font> now<font color=#990000>.</font>tv_usec<font color=#990000>)</font>
2518            	 <b><font color=#0000FF>return</font></b> <b><font color=#0000FF>true</font></b><font color=#990000>;</font>
2519               <b><font color=#0000FF>return</font></b> <b><font color=#0000FF>false</font></b><font color=#990000>;</font>
2520            <font color=#FF0000>}</font>
2521            
2522            <b><font color=#0000FF>inline</font></b> Boolean AsyncOpNode<font color=#990000>:</font><font color=#990000>:</font><b><font color=#000000>_is_child</font></b><font color=#990000>(</font><font color=#009900>void</font><font color=#990000>)</font>
2523            <font color=#FF0000>{</font>
2524               <b><font color=#0000FF>if</font></b> <font color=#990000>(</font>_parent <font color=#990000>!</font><font color=#990000>=</font> <font color=#993399>0</font><font color=#990000>)</font>
2525                  <b><font color=#0000FF>return</font></b> <b><font color=#0000FF>true</font></b><font color=#990000>;</font>
2526               <b><font color=#0000FF>return</font></b> <b><font color=#0000FF>false</font></b><font color=#990000>;</font>
2527            <font color=#FF0000>}</font>
2528            
2529            <b><font color=#0000FF>inline</font></b> Uint32 AsyncOpNode<font color=#990000>:</font><font color=#990000>:</font><b><font color=#000000>_is_parent</font></b><font color=#990000>(</font><font color=#009900>void</font><font color=#990000>)</font>
2530            <font color=#FF0000>{</font>
2531               <b><font color=#0000FF>return</font></b> _children<font color=#990000>.</font><b><font color=#000000>count</font></b><font color=#990000>(</font><font color=#990000>)</font><font color=#990000>;</font>
2532            <font color=#FF0000>}</font>
2533            
2534            <b><font color=#0000FF>inline</font></b> Boolean AsyncOpNode<font color=#990000>:</font><font color=#990000>:</font><b><font color=#000000>_is_my_child</font></b><font color=#990000>(</font><b><font color=#0000FF>const</font></b> AsyncOpNode <font color=#990000>&amp;</font> caller<font color=#990000>)</font> <b><font color=#0000FF>const</font></b>
2535            <font color=#FF0000>{</font> 
2536 mday   1.4    <b><font color=#0000FF>if</font></b> <font color=#990000>(</font> _parent <font color=#990000>=</font><font color=#990000>=</font> <font color=#990000>&amp;</font>caller <font color=#990000>)</font>
2537                  <b><font color=#0000FF>return</font></b> <b><font color=#0000FF>true</font></b><font color=#990000>;</font>
2538               <b><font color=#0000FF>return</font></b> <b><font color=#0000FF>false</font></b><font color=#990000>;</font>
2539            <font color=#FF0000>}</font>
2540            
2541            <b><font color=#0000FF>inline</font></b> <font color=#009900>void</font> AsyncOpNode<font color=#990000>:</font><font color=#990000>:</font><b><font color=#000000>_make_orphan</font></b><font color=#990000>(</font> AsyncOpNode <font color=#990000>&amp;</font> parent<font color=#990000>)</font> 
2542            <font color=#FF0000>{</font>
2543               <b><font color=#0000FF>if</font></b><font color=#990000>(</font> _parent <font color=#990000>=</font><font color=#990000>=</font> <font color=#990000>&amp;</font>parent <font color=#990000>)</font>
2544               <font color=#FF0000>{</font>
2545                  _parent <font color=#990000>=</font> NULL<font color=#990000>;</font>
2546                  parent<font color=#990000>.</font>_children<font color=#990000>.</font><b><font color=#000000>remove</font></b><font color=#990000>(</font><b><font color=#0000FF>this</font></b><font color=#990000>)</font><font color=#990000>;</font>
2547               <font color=#FF0000>}</font>
2548               <b><font color=#0000FF>else</font></b>
2549                  <b><font color=#0000FF>throw</font></b> <b><font color=#000000>Permission</font></b><font color=#990000>(</font><b><font color=#000000>pegasus_thread_self</font></b><font color=#990000>(</font><font color=#990000>)</font><font color=#990000>)</font><font color=#990000>;</font>
2550            <font color=#FF0000>}</font>
2551            
2552            <b><font color=#0000FF>inline</font></b> <font color=#009900>void</font> AsyncOpNode<font color=#990000>:</font><font color=#990000>:</font><b><font color=#000000>_adopt_child</font></b><font color=#990000>(</font>AsyncOpNode <font color=#990000>*</font>child<font color=#990000>)</font> 
2553            <font color=#FF0000>{</font>
2554               <b><font color=#0000FF>if</font></b><font color=#990000>(</font>child <font color=#990000>=</font><font color=#990000>=</font> NULL<font color=#990000>)</font>
2555                  <b><font color=#0000FF>throw</font></b> <b><font color=#000000>NullPointer</font></b><font color=#990000>(</font><font color=#990000>)</font><font color=#990000>;</font>
2556               <b><font color=#0000FF>if</font></b><font color=#990000>(</font><b><font color=#0000FF>true</font></b> <font color=#990000>=</font><font color=#990000>=</font> child<font color=#990000>-</font><font color=#990000>&gt;</font><b><font color=#000000>_is_child</font></b><font color=#990000>(</font><font color=#990000>)</font><font color=#990000>)</font>
2557 mday   1.4       <b><font color=#0000FF>throw</font></b> <b><font color=#000000>Permission</font></b><font color=#990000>(</font><b><font color=#000000>pegasus_thread_self</font></b><font color=#990000>(</font><font color=#990000>)</font><font color=#990000>)</font><font color=#990000>;</font>
2558               child<font color=#990000>-</font><font color=#990000>&gt;</font>_parent <font color=#990000>=</font> <b><font color=#0000FF>this</font></b><font color=#990000>;</font>
2559               _children<font color=#990000>.</font><b><font color=#000000>insert_last</font></b><font color=#990000>(</font>child<font color=#990000>)</font><font color=#990000>;</font>
2560            <font color=#FF0000>}</font>
2561                  
2562            <b><font color=#0000FF>inline</font></b> <font color=#009900>void</font> AsyncOpNode<font color=#990000>:</font><font color=#990000>:</font><b><font color=#000000>_disown_child</font></b><font color=#990000>(</font>AsyncOpNode <font color=#990000>*</font>child<font color=#990000>)</font>
2563            <font color=#FF0000>{</font>
2564               <b><font color=#0000FF>if</font></b><font color=#990000>(</font>child <font color=#990000>=</font><font color=#990000>=</font> NULL<font color=#990000>)</font>
2565                  <b><font color=#0000FF>throw</font></b> <b><font color=#000000>NullPointer</font></b><font color=#990000>(</font><font color=#990000>)</font><font color=#990000>;</font>
2566               <b><font color=#0000FF>if</font></b><font color=#990000>(</font> <b><font color=#0000FF>false</font></b> <font color=#990000>=</font><font color=#990000>=</font> child<font color=#990000>-</font><font color=#990000>&gt;</font><b><font color=#000000>_is_child</font></b><font color=#990000>(</font><font color=#990000>)</font> <font color=#990000>|</font><font color=#990000>|</font> <b><font color=#0000FF>false</font></b> <font color=#990000>=</font><font color=#990000>=</font> child<font color=#990000>-</font><font color=#990000>&gt;</font><b><font color=#000000>_is_my_child</font></b><font color=#990000>(</font> <font color=#990000>*</font><b><font color=#0000FF>this</font></b> <font color=#990000>)</font><font color=#990000>)</font>
2567                  <b><font color=#0000FF>throw</font></b> <b><font color=#000000>Permission</font></b><font color=#990000>(</font><b><font color=#000000>pegasus_thread_self</font></b><font color=#990000>(</font><font color=#990000>)</font><font color=#990000>)</font><font color=#990000>;</font>
2568               child<font color=#990000>-</font><font color=#990000>&gt;</font><b><font color=#000000>_make_orphan</font></b><font color=#990000>(</font> <font color=#990000>*</font><b><font color=#0000FF>this</font></b> <font color=#990000>)</font><font color=#990000>;</font>
2569               _children<font color=#990000>.</font><b><font color=#000000>remove</font></b><font color=#990000>(</font>child<font color=#990000>)</font><font color=#990000>;</font>
2570            <font color=#FF0000>}</font> 
2571 mday   1.1 
2572 mday   1.4 PEGASUS_NAMESPACE_END
2573 mday   1.1 
2574 mday   1.4 <b><font color=#000080>#endif</font></b> <i><font color=#9A1900>//Pegasus_AsyncOpNode_h</font></i>
2575            </tt>
2576 mday   1.1 </pre>
2577            
2578 mday   1.4 
2579 mday   1.1 <hr>
2580                <address><a href="mailto:mdday@us.ibm.com">Michael Day</a></address>
2581            <!-- Created: Tue Feb  5 13:21:55 EST 2002 -->
2582            <!-- hhmts start -->
2583 mday   1.4 Last modified: Wed Mar 13 12:26:56 EST 2002
2584 mday   1.1 <!-- hhmts end -->
2585 martin 1.6   </body></html>

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2