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