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