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

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2