1 karl 1.54 //%2006////////////////////////////////////////////////////////////////////////
|
2 mday 1.1 //
|
3 karl 1.45 // Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
4 // Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
5 // Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;
|
6 karl 1.41 // IBM Corp.; EMC Corporation, The Open Group.
|
7 karl 1.45 // Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
8 // IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
|
9 karl 1.47 // Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
10 // EMC Corporation; VERITAS Software Corporation; The Open Group.
|
11 karl 1.54 // Copyright (c) 2006 Hewlett-Packard Development Company, L.P.; IBM Corp.;
12 // EMC Corporation; Symantec Corporation; The Open Group.
|
13 mday 1.1 //
14 // Permission is hereby granted, free of charge, to any person obtaining a copy
15 // of this software and associated documentation files (the "Software"), to
16 // deal in the Software without restriction, including without limitation the
17 // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
18 // sell copies of the Software, and to permit persons to whom the Software is
19 // furnished to do so, subject to the following conditions:
|
20 karl 1.54 //
|
21 mday 1.1 // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
22 // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
23 // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
24 // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
25 // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
26 // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
27 // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
28 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29 //
30 //==============================================================================
31 //
32 //%/////////////////////////////////////////////////////////////////////////////
33
34 #include "ModuleController.h"
|
35 kumpf 1.62 #include <Pegasus/Common/MessageLoader.h>
36 #include <Pegasus/Common/InternalException.h>
37
|
38 mday 1.1 PEGASUS_NAMESPACE_BEGIN
39
40 PEGASUS_USING_STD;
|
41 david.dillard 1.51
|
42 kumpf 1.62 RegisteredModuleHandle::RegisteredModuleHandle(
43 const String& name,
44 void* module_address,
45 Message* (*receive_message)(Message *, void *),
46 void (*async_callback)(Uint32, Message *, void *))
47 : _name(name),
48 _module_address(module_address),
49 _module_receive_message(receive_message),
50 _async_callback(async_callback)
|
51 mday 1.6 {
|
52 kumpf 1.62 PEGASUS_ASSERT(_module_receive_message != 0);
|
53 mday 1.6 }
54
|
55 kumpf 1.62 RegisteredModuleHandle::~RegisteredModuleHandle()
|
56 mday 1.6 {
57 }
|
58 david.dillard 1.51
|
59 kumpf 1.62 const String & RegisteredModuleHandle::get_name() const
|
60 mday 1.6 {
|
61 kumpf 1.62 return _name;
|
62 mday 1.6 }
63
|
64 kumpf 1.62 Message* RegisteredModuleHandle::_receive_message(Message *msg)
|
65 mday 1.2 {
|
66 kumpf 1.62 return _module_receive_message(msg, _module_address);
|
67 mday 1.2 }
68
|
69 kumpf 1.62 void RegisteredModuleHandle::_send_async_callback(
70 Uint32 msg_handle,
71 Message* msg,
72 void* parm)
|
73 mday 1.2 {
|
74 kumpf 1.62 // ATTN: Assert this condition?
75 if (_async_callback == 0)
76 {
77 throw NotImplemented("Module Async Receive");
78 }
|
79 mday 1.1
|
80 kumpf 1.62 _async_callback(msg_handle, msg, parm);
|
81 mday 1.6 }
82
|
83 mday 1.3
84 ModuleController::ModuleController(const char *name )
|
85 david.dillard 1.51 :Base(name, MessageQueue::getNextQueueId(),
|
86 mday 1.4 module_capabilities::module_controller |
87 module_capabilities::async),
|
88 mike 1.55 _modules()
|
89 david.dillard 1.51 {
|
90 mday 1.3 }
91
|
92 kumpf 1.5 ModuleController::~ModuleController()
93 {
94
|
95 kumpf 1.62 RegisteredModuleHandle *module;
|
96 mday 1.40
|
97 david.dillard 1.51 try
|
98 mday 1.40 {
|
99 mike 1.55 module = _modules.remove_front();
|
100 mday 1.40 while(module)
101 {
102 delete module;
|
103 mike 1.55 module = _modules.remove_front();
|
104 mday 1.40 }
105
106 }
107 catch(...)
|
108 mday 1.6 {
109 }
|
110 kumpf 1.5 }
|
111 mday 1.3
|
112 david.dillard 1.51 // called by a module to register itself, returns a handle to the controller
|
113 kumpf 1.62 ModuleController & ModuleController::register_module(
114 const String & controller_name,
115 const String & module_name,
116 void *module_address,
117 Message * (*receive_message)(Message *, void *),
118 void (*async_callback)(Uint32, Message *, void *),
119 RegisteredModuleHandle** instance)
|
120 mday 1.3 {
|
121 kumpf 1.62 RegisteredModuleHandle *module;
|
122 mday 1.6 ModuleController *controller;
|
123 david.dillard 1.51
|
124 mday 1.6 Array<Uint32> services;
|
125 david.dillard 1.51
|
126 kumpf 1.37 MessageQueue *message_queue = MessageQueue::lookup(controller_name.getCString());
|
127 david.dillard 1.51
|
128 mday 1.6 if ((message_queue == NULL) || ( false == message_queue->isAsync() ))
129 {
|
130 kumpf 1.36 throw IncompatibleTypesException();
|
131 mday 1.6 }
132
133 MessageQueueService *service = static_cast<MessageQueueService *>(message_queue);
134 if( (service == NULL) || ! ( service->get_capabilities() & module_capabilities::module_controller ))
|
135 kumpf 1.7 {
|
136 kumpf 1.36 throw IncompatibleTypesException();
|
137 kumpf 1.7 }
|
138 mday 1.6
|
139 kumpf 1.7 controller = static_cast<ModuleController *>(service);
|
140 david.dillard 1.51
|
141 mday 1.40 {
|
142 david.dillard 1.51
|
143 mday 1.4 // see if the module already exists in this controller.
|
144 mday 1.40 _module_lock lock(&(controller->_modules));
|
145 david.dillard 1.51
|
146 mike 1.55 module = controller->_modules.front();
|
147 mday 1.4 while(module != NULL )
148 {
149 if(module->get_name() == module_name )
150 {
|
151 humberto 1.39 MessageLoaderParms parms("Common.ModuleController.MODULE",
152 "module \"$0\"",
153 module_name);
154 throw AlreadyExistsException(parms);
|
155 mday 1.4 }
|
156 mike 1.55 module = controller->_modules.next_of(module);
|
157 mday 1.4 }
|
158 david.dillard 1.51
|
159 mday 1.40 }
|
160 david.dillard 1.51
|
161 mday 1.4 // now reserve this module name with the meta dispatcher
162
163 Uint32 result = 0 ;
|
164 kumpf 1.58 AutoPtr<RegisteredModule> request(new RegisteredModule(
|
165 david.dillard 1.51 0,
166 true,
|
167 mday 1.25 controller->getQueueId(),
|
168 a.arora 1.43 module_name));
|
169 mday 1.21
170 request->dest = CIMOM_Q_ID;
|
171 david.dillard 1.51
|
172 a.arora 1.43 AutoPtr<AsyncReply> response(controller->SendWait(request.get()));
|
173 david.dillard 1.51 if( response.get() != NULL)
|
174 mday 1.4 result = response->result;
|
175 david.dillard 1.51
|
176 a.arora 1.43 request.reset();
177 response.reset();
|
178 kumpf 1.62 if ( result == async_results::MODULE_ALREADY_REGISTERED)
179 {
|
180 humberto 1.39 MessageLoaderParms parms("Common.ModuleController.MODULE",
|
181 kumpf 1.62 "module \"$0\"", module_name);
182 throw AlreadyExistsException(parms);
|
183 humberto 1.39 }
|
184 david.dillard 1.51
185 // the module does not exist, go ahead and create it.
|
186 kumpf 1.62 module = new RegisteredModuleHandle(
|
187 david.dillard 1.51 module_name,
188 module_address,
189 receive_message,
|
190 kumpf 1.62 async_callback);
|
191 david.dillard 1.51
|
192 mike 1.55 controller->_modules.insert_back(module);
|
193 david.dillard 1.51
|
194 mday 1.8 if(instance != NULL)
195 *instance = module;
|
196 david.dillard 1.51
|
197 mday 1.6 return *controller;
|
198 mday 1.3 }
199
|
200 mday 1.4
201 Boolean ModuleController::deregister_module(const String & module_name)
202 {
|
203 kumpf 1.58 AutoPtr<DeRegisteredModule> request(new DeRegisteredModule(
|
204 mday 1.4 0,
205 true,
206 getQueueId(),
|
207 a.arora 1.43 module_name));
|
208 mday 1.4 request->dest = _meta_dispatcher->getQueueId();
|
209 david.dillard 1.51
|
210 a.arora 1.43 AutoPtr<AsyncReply> response(SendWait(request.get()));
|
211 mday 1.4
|
212 a.arora 1.43 request.reset();
213 response.reset();
|
214 david.dillard 1.51
|
215 kumpf 1.62 RegisteredModuleHandle *module;
|
216 mday 1.40
217 _module_lock lock(&_modules);
|
218 mike 1.55 module = _modules.front();
|
219 mday 1.4 while(module != NULL )
220 {
221 if( module->get_name() == module_name)
222 {
|
223 mike 1.55 _modules.remove(module);
|
224 mday 1.40 return true;
|
225 mday 1.4 }
|
226 mike 1.55 module = _modules.next_of(module);
|
227 mday 1.4 }
|
228 mday 1.40 return false;
|
229 mday 1.4 }
230
|
231 kumpf 1.62 Boolean ModuleController::verify_handle(RegisteredModuleHandle *handle)
|
232 mday 1.4 {
|
233 kumpf 1.62 RegisteredModuleHandle *module;
|
234 david.dillard 1.51
|
235 kumpf 1.62 if (handle->_module_address == (void *)this)
|
236 mday 1.16 return true;
|
237 david.dillard 1.51
|
238 mday 1.40 _module_lock lock(&_modules);
|
239 david.dillard 1.51
|
240 mike 1.55 module = _modules.front();
|
241 mday 1.4 while(module != NULL)
242 {
243 if ( module == handle)
244 {
|
245 mday 1.40 return true;
|
246 mday 1.4 }
|
247 mike 1.55 module = _modules.next_of(module);
|
248 mday 1.4 }
|
249 mday 1.40 return false;
|
250 mday 1.4 }
251
252 // given a name, find a service's queue id
|
253 kumpf 1.62 Uint32 ModuleController::find_service(
254 const RegisteredModuleHandle & handle,
255 const String & name)
|
256 mday 1.4 {
257
|
258 kumpf 1.62 if (false == verify_handle(const_cast<RegisteredModuleHandle *>(&handle)))
|
259 mike 1.63 throw Permission(Threads::self());
|
260 mday 1.4 Array<Uint32> services;
261 Base::find_services(name, 0, 0, &services);
262 return( services[0]);
263 }
264
265
|
266 david.dillard 1.51 // returns the queue ID of the service hosting the named module,
|
267 mday 1.4 // zero otherwise
268
|
269 kumpf 1.62 Uint32 ModuleController::find_module_in_service(
270 const RegisteredModuleHandle & handle,
271 const String & name)
|
272 mday 1.4 {
|
273 kumpf 1.62 if (false == verify_handle(const_cast<RegisteredModuleHandle *>(&handle)))
|
274 mike 1.63 throw(Permission(Threads::self()));
|
275 david.dillard 1.51
|
276 mday 1.4 Uint32 result = 0 ;
277
|
278 kumpf 1.58 AutoPtr<FindModuleInService> request(new FindModuleInService(
|
279 david.dillard 1.51 0,
280 true,
|
281 mday 1.4 _meta_dispatcher->getQueueId(),
|
282 david.dillard 1.51 name));
|
283 mday 1.4 request->dest = _meta_dispatcher->getQueueId();
|
284 a.arora 1.43 AutoPtr<FindModuleInServiceResponse>
285 response(static_cast<FindModuleInServiceResponse *>(SendWait(request.get())));
286 if( response.get() != NULL)
|
287 mday 1.4 result = response->_module_service_queue;
288
289 return result;
290 }
291
292
|
293 david.dillard 1.51 AsyncReply *ModuleController::_send_wait(Uint32 destination_q,
|
294 mday 1.16 AsyncRequest *request)
295 {
296 request->dest = destination_q;
297 AsyncReply *reply = Base::SendWait(request);
298 return reply;
299 }
300
301
|
302 mday 1.4 // sendwait to another service
|
303 kumpf 1.62 AsyncReply * ModuleController::ModuleSendWait(
304 const RegisteredModuleHandle & handle,
305 Uint32 destination_q,
306 AsyncRequest *request)
|
307 mday 1.4 {
|
308 kumpf 1.62 if (false == verify_handle(const_cast<RegisteredModuleHandle *>(&handle)))
|
309 mike 1.63 throw(Permission(Threads::self()));
|
310 mday 1.4
|
311 mday 1.16 return _send_wait(destination_q, request);
|
312 mday 1.4 }
313
|
314 david.dillard 1.51 AsyncReply *ModuleController::_send_wait(Uint32 destination_q,
315 const String & destination_module,
|
316 mday 1.16 AsyncRequest *message)
|
317 mday 1.4 {
|
318 kumpf 1.58 AutoPtr<AsyncModuleOperationStart> request(new AsyncModuleOperationStart(
|
319 david.dillard 1.51 0,
|
320 mday 1.4 destination_q,
321 getQueueId(),
|
322 david.dillard 1.51 true,
|
323 mday 1.4 destination_module,
|
324 a.arora 1.43 message));
|
325 david.dillard 1.51
|
326 mday 1.4 request->dest = destination_q;
|
327 david.dillard 1.51 AutoPtr<AsyncModuleOperationResult>
|
328 a.arora 1.43 response(static_cast<AsyncModuleOperationResult *>(SendWait(request.get())));
329
|
330 mday 1.4 AsyncReply *ret = 0;
|
331 david.dillard 1.51
|
332 a.arora 1.43 if (response.get() != NULL && response->getType() == async_messages::ASYNC_MODULE_OP_RESULT )
|
333 mday 1.4 {
334 ret = static_cast<AsyncReply *>(response->get_result());
335 //clear the request out of the envelope so it can be deleted by the module
336 }
|
337 mday 1.26 request->get_action();
|
338 mday 1.4 return ret;
339 }
340
|
341 mday 1.16
|
342 david.dillard 1.51 // sendwait to another module controlled by another service.
|
343 mday 1.16 // throws Deadlock() if destination_q is this->queue_id
|
344 kumpf 1.62 AsyncReply * ModuleController::ModuleSendWait(
345 const RegisteredModuleHandle & handle,
346 Uint32 destination_q,
347 const String & destination_module,
348 AsyncRequest *message)
|
349 mday 1.16 {
|
350 kumpf 1.62 if (false == verify_handle(const_cast<RegisteredModuleHandle *>(&handle)))
|
351 mike 1.63 throw(Permission(Threads::self()));
|
352 david.dillard 1.51
|
353 mday 1.16 return _send_wait(destination_q, destination_module, message);
354 }
355
|
356 david.dillard 1.51 void ModuleController::_async_handleEnqueue(AsyncOpNode *op,
357 MessageQueue *q,
|
358 mday 1.4 void *parm)
359 {
|
360 david.dillard 1.51
|
361 mday 1.4 ModuleController *myself = static_cast<ModuleController *>(q);
|
362 kumpf 1.61 Message *request = op->removeRequest();
363 Message *response = op->removeResponse();
|
364 mday 1.16
|
365 kumpf 1.64 if( request && (! (request->getMask() & MessageMask::ha_async)))
|
366 kumpf 1.36 throw TypeMismatchException();
|
367 mday 1.26
|
368 kumpf 1.64 if( response && (! (response->getMask() & MessageMask::ha_async) ))
|
369 kumpf 1.36 throw TypeMismatchException();
|
370 david.dillard 1.51
|
371 mday 1.17 op->release();
|
372 mday 1.6 myself->return_op(op);
|
373 david.dillard 1.51
374 // get rid of the module wrapper
|
375 mday 1.26 if( request && request->getType() == async_messages::ASYNC_MODULE_OP_START )
|
376 mday 1.6 {
|
377 mday 1.26 (static_cast<AsyncMessage *>(request))->op = NULL;
|
378 mday 1.6 AsyncModuleOperationStart *rq = static_cast<AsyncModuleOperationStart *>(request);
379 request = rq->get_action();
380 delete rq;
381 }
|
382 david.dillard 1.51
383 // get rid of the module wrapper
|
384 mday 1.26 if(response && response->getType() == async_messages::ASYNC_MODULE_OP_RESULT )
|
385 mday 1.6 {
|
386 mday 1.26 (static_cast<AsyncMessage *>(response))->op = NULL;
|
387 mday 1.6 AsyncModuleOperationResult *rp = static_cast<AsyncModuleOperationResult *>(response);
388 response = rp->get_result();
389 delete rp;
390 }
|
391 david.dillard 1.51
|
392 mday 1.16 callback_handle *cb = reinterpret_cast<callback_handle *>(parm);
|
393 david.dillard 1.51
|
394 kumpf 1.58 cb->_module->_send_async_callback(0, response, cb->_parm);
|
395 mday 1.16 delete cb;
|
396 david.dillard 1.51
|
397 mday 1.4 return;
398 }
399
400
401 // send an async message to a service asynchronously
|
402 kumpf 1.62 Boolean ModuleController::ModuleSendAsync(
403 const RegisteredModuleHandle & handle,
404 Uint32 msg_handle,
405 Uint32 destination_q,
406 AsyncRequest *message,
407 void *callback_parm)
|
408 mday 1.4 {
|
409 kumpf 1.30 //printf("verifying handle %p, controller at %p \n", &handle, this);
|
410 david.dillard 1.51
|
411 kumpf 1.62 if (false == verify_handle(const_cast<RegisteredModuleHandle *>(&handle)))
|
412 mike 1.63 throw(Permission(Threads::self()));
|
413 mday 1.6
414 if (message->op == NULL)
415 {
416 message->op = get_op();
|
417 kumpf 1.61 message->op->setRequest(message);
|
418 mday 1.6 }
419
|
420 mday 1.24
|
421 kumpf 1.62 callback_handle *cb = new callback_handle(
422 const_cast<RegisteredModuleHandle *>(&handle),
423 callback_parm);
|
424 david.dillard 1.51
|
425 mday 1.6 message->resp = getQueueId();
426 message->block = false;
427 message->dest = destination_q;
|
428 david.dillard 1.51 return SendAsync(message->op,
|
429 mday 1.4 destination_q,
430 _async_handleEnqueue,
431 this,
|
432 mday 1.16 cb);
|
433 mday 1.4 }
434
|
435 david.dillard 1.51 // send a message to a module within another service asynchronously
|
436 kumpf 1.62 Boolean ModuleController::ModuleSendAsync(const RegisteredModuleHandle& handle,
|
437 david.dillard 1.51 Uint32 msg_handle,
438 Uint32 destination_q,
|
439 mday 1.19 const String & destination_module,
|
440 david.dillard 1.51 AsyncRequest *message,
441 void *callback_parm)
|
442 mday 1.4 {
|
443 david.dillard 1.51
|
444 kumpf 1.62 if (false == verify_handle(const_cast<RegisteredModuleHandle *>(&handle)))
|
445 mike 1.63 throw(Permission(Threads::self()));
|
446 mday 1.19
|
447 mday 1.4 AsyncOpNode *op = get_op();
|
448 david.dillard 1.51 AsyncModuleOperationStart *request =
|
449 kumpf 1.58 new AsyncModuleOperationStart(
|
450 mday 1.4 op,
451 destination_q,
452 getQueueId(),
|
453 david.dillard 1.51 true,
|
454 mday 1.4 destination_module,
455 message);
456 request->dest = destination_q;
|
457 kumpf 1.62 callback_handle *cb = new callback_handle(
458 const_cast<RegisteredModuleHandle *>(&handle),
459 callback_parm);
|
460 david.dillard 1.51 return SendAsync(op,
|
461 mday 1.4 destination_q,
462 _async_handleEnqueue,
463 this,
|
464 mday 1.26 cb);
|
465 mday 1.4 }
466
|
467 mday 1.19
468 Boolean ModuleController::_send_forget(Uint32 destination_q, AsyncRequest *message)
469 {
470 message->dest = destination_q;
471 return SendForget(message);
472 }
473
|
474 david.dillard 1.51 Boolean ModuleController::_send_forget(Uint32 destination_q,
475 const String & destination_module,
|
476 mday 1.19 AsyncRequest *message)
477 {
478 AsyncOpNode *op = get_op();
479 message->dest = destination_q;
|
480 david.dillard 1.51 AsyncModuleOperationStart *request =
|
481 kumpf 1.58 new AsyncModuleOperationStart(
|
482 mday 1.19 op,
483 destination_q,
484 getQueueId(),
|
485 david.dillard 1.51 true,
|
486 mday 1.19 destination_module,
487 message);
488 return SendForget(request);
489 }
490
491
492
|
493 kumpf 1.62 Boolean ModuleController::ModuleSendForget(
494 const RegisteredModuleHandle & handle,
495 Uint32 destination_q,
496 AsyncRequest *message)
|
497 mday 1.19 {
|
498 kumpf 1.62 if (false == verify_handle(const_cast<RegisteredModuleHandle *>(&handle)))
|
499 mike 1.63 throw(Permission(Threads::self()));
|
500 david.dillard 1.51
|
501 mday 1.19 return _send_forget(destination_q, message);
502 }
|
503 david.dillard 1.51
|
504 kumpf 1.62 Boolean ModuleController::ModuleSendForget(
505 const RegisteredModuleHandle & handle,
506 Uint32 destination_q,
507 const String & destination_module,
508 AsyncRequest *message)
|
509 mday 1.19 {
|
510 kumpf 1.62 if (false == verify_handle(const_cast<RegisteredModuleHandle *>(&handle)))
|
511 mike 1.63 throw(Permission(Threads::self()));
|
512 david.dillard 1.51 return _send_forget(destination_q,
513 destination_module,
|
514 mday 1.19 message);
515 }
516
517
|
518 mday 1.6 void ModuleController::_handle_async_request(AsyncRequest *rq)
519 {
520
521 if( rq->getType() == async_messages::ASYNC_MODULE_OP_START)
522 {
523 // find the target module
|
524 kumpf 1.62 RegisteredModuleHandle *target;
|
525 mday 1.6 Message *module_result = NULL;
|
526 kumpf 1.49
|
527 mday 1.6 {
|
528 mday 1.40 _module_lock lock(&_modules);
|
529 mike 1.55 target = _modules.front();
|
530 mday 1.40 while(target != NULL)
|
531 mday 1.6 {
|
532 mday 1.40 if(target->get_name() == static_cast<AsyncModuleOperationStart *>(rq)->_target_module)
533 {
534 break;
535 }
|
536 david.dillard 1.51
|
537 mike 1.55 target = _modules.next_of(target);
|
538 mday 1.6 }
|
539 kumpf 1.49 }
540
541 if (target)
542 {
543 // ATTN: This statement was taken out of the _module_lock block
544 // above because that caused all requests to control providers to
545 // be serialized. There is now a risk that the control provider
546 // module may be deleted after the lookup and before this call.
547 // See Bugzilla 3120.
548 module_result = target->_receive_message(
549 static_cast<AsyncModuleOperationStart *>(rq)->_act);
|
550 mday 1.6 }
|
551 david.dillard 1.51
|
552 mday 1.6 if(module_result == NULL)
553 {
|
554 david.dillard 1.51 module_result = new AsyncReply(async_messages::REPLY,
|
555 kumpf 1.64 MessageMask::ha_async | MessageMask::ha_reply,
|
556 mday 1.6 rq->op,
557 async_results::CIM_NAK,
558 rq->resp,
559 false);
560 }
|
561 david.dillard 1.51
562 AsyncModuleOperationResult *result =
|
563 kumpf 1.58 new AsyncModuleOperationResult(
|
564 mday 1.6 rq->op,
565 async_results::OK,
566 static_cast<AsyncModuleOperationStart *>(rq)->resp,
|
567 david.dillard 1.51 false,
|
568 mday 1.6 static_cast<AsyncModuleOperationStart *>(rq)->_target_module,
569 module_result);
570 _complete_op_node(rq->op, 0, 0, 0);
571 }
572 else
573 Base::_handle_async_request(rq);
574 }
575
576 void ModuleController::_handle_async_callback(AsyncOpNode *op)
577 {
578 Base::_handle_async_callback(op);
|
579 david.dillard 1.51
|
580 mday 1.6 }
|
581 mday 1.12
|
582 kumpf 1.59 ModuleController* ModuleController::getModuleController()
|
583 mday 1.16 {
|
584 kumpf 1.59 MessageQueue *messageQueue =
585 MessageQueue::lookup(PEGASUS_QUEUENAME_CONTROLSERVICE);
586 PEGASUS_ASSERT(messageQueue != 0);
587 PEGASUS_ASSERT(messageQueue->isAsync());
588
589 MessageQueueService* service =
590 dynamic_cast<MessageQueueService*>(messageQueue);
591 PEGASUS_ASSERT(service != 0);
592 PEGASUS_ASSERT(
593 service->get_capabilities() & module_capabilities::module_controller);
|
594 david.dillard 1.51
|
595 kumpf 1.59 return static_cast<ModuleController*>(service);
|
596 mday 1.16 }
597
598
599 // send a message to another service
|
600 kumpf 1.59 AsyncReply *ModuleController::ClientSendWait(
|
601 david.dillard 1.51 Uint32 destination_q,
602 AsyncRequest *request)
|
603 mday 1.16 {
604 return _send_wait(destination_q, request);
605 }
606
607
608 // send a message to another module via another service
|
609 kumpf 1.59 AsyncReply *ModuleController::ClientSendWait(
|
610 mday 1.16 Uint32 destination_q,
611 String & destination_module,
|
612 david.dillard 1.51 AsyncRequest *request)
|
613 mday 1.16 {
614 return _send_wait(destination_q, destination_module, request);
615 }
616
617
618 // send an async message to another service
|
619 kumpf 1.59 Boolean ModuleController::ClientSendAsync(
|
620 david.dillard 1.51 Uint32 msg_handle,
621 Uint32 destination_q,
|
622 mday 1.16 AsyncRequest *message,
623 void (*async_callback)(Uint32, Message *, void *) ,
624 void *callback_parm)
625 {
|
626 kumpf 1.62 RegisteredModuleHandle *temp = new RegisteredModuleHandle(
|
627 kumpf 1.18 String(PEGASUS_MODULENAME_TEMP),
|
628 david.dillard 1.51 this,
629 0,
|
630 kumpf 1.62 async_callback);
|
631 david.dillard 1.51 return ModuleSendAsync( *temp,
632 msg_handle,
633 destination_q,
634 message,
|
635 mday 1.16 callback_parm);
636 }
637
638
639 // send an async message to another module via another service
|
640 kumpf 1.59 Boolean ModuleController::ClientSendAsync(
|
641 david.dillard 1.51 Uint32 msg_handle,
642 Uint32 destination_q,
|
643 mday 1.27 const String & destination_module,
|
644 david.dillard 1.51 AsyncRequest *message,
|
645 mday 1.16 void (*async_callback)(Uint32, Message *, void *),
646 void *callback_parm)
647 {
|
648 kumpf 1.62 RegisteredModuleHandle *temp = new RegisteredModuleHandle(
|
649 kumpf 1.18 String(PEGASUS_MODULENAME_TEMP),
|
650 david.dillard 1.51 this,
651 0,
|
652 kumpf 1.62 async_callback);
|
653 david.dillard 1.51 return ModuleSendAsync(*temp,
654 msg_handle,
655 destination_q,
|
656 mday 1.16 destination_module,
657 message,
658 callback_parm);
659 }
660
661
|
662 mday 1.19
|
663 kumpf 1.59 Boolean ModuleController::ClientSendForget(
|
664 david.dillard 1.51 Uint32 destination_q,
|
665 mday 1.19 AsyncRequest *message)
666 {
667 return _send_forget(destination_q, message);
668 }
669
670
|
671 kumpf 1.59 Boolean ModuleController::ClientSendForget(
|
672 david.dillard 1.51 Uint32 destination_q,
673 const String & destination_module,
|
674 mday 1.19 AsyncRequest *message)
675 {
676 return _send_forget(destination_q, destination_module, message);
677 }
678
|
679 mday 1.1 PEGASUS_NAMESPACE_END
|