Files
cdev-1.7.2n/extensions/SimpleService/cdevSimpleRequestObject.cc
2022-12-13 12:44:04 +01:00

146 lines
5.6 KiB
C++
Executable File

//-----------------------------------------------------------------------------
// Copyright (c) 1995 Southeastern Universities Research Association,
// Continuous Electron Beam Accelerator Facility
//
// This software was developed under a United States Government license
// described in the NOTICE file included as part of this distribution.
//
//-----------------------------------------------------------------------------
//
// Description:
// This header file contains the class definitions for the classes
// associated with the construction of a model request object.
//
// Author: Walt Akers
//
// Revision History:
// cdevSimpleRequestObject.cc,v
// Revision 1.1 1996/11/21 18:22:19 akers
// Non-Server Oriented Service
//
// Revision 1.1 1996/04/30 15:37:30 akers
// Simple CDEV Service
//
// Revision 1.1.1.1 1996/02/28 16:36:21 akers
// Initial release of support for ACE Services
//
//-----------------------------------------------------------------------------
//
#include <cdevSimpleService.h>
#include <cdevSimpleRequestObject.h>
#include <cdevClock.h>
#include <cdevTranNode.h>
// *********************************************************************
// * cdevSimpleRequestObject::cdevSimpleRequestObject :
// * This constructor initializes the internals of a device/message
// * pair associated with the model server.
// *
// * Returns nothing.
// *********************************************************************
cdevSimpleRequestObject::cdevSimpleRequestObject ( char * device, char * message, cdevSystem & system)
: cdevRequestObject(device, message, system)
{
cdevData::tagC2I("transaction", &TRANSACT_TAG);
cdevData::tagC2I("transobject", &TRANSOBJ_TAG);
}
// *****************************************************************************
// * cdevSimpleRequestObject::sendNoBlock :
// * This function allows the caller to submit an asynchronous message to the
// * server for processing.
// *****************************************************************************
int cdevSimpleRequestObject::sendNoBlock (cdevData * in, cdevData * out)
{
cdevSimpleService * svc = (cdevSimpleService *)service_;
cdevTranNode * xobj = new cdevTranNode(&system_, this, out, &svc->callback);
char * Device = strdup(deviceName_);
char * Message = strdup(message_);
cdevData * Data = ((in==NULL)?new cdevData:new cdevData(*in));
svc->submit(xobj, Device, Message, Data);
return CDEV_SUCCESS;
}
// *****************************************************************************
// * cdevSimpleRequestObject::sendCallback :
// * This function allows the caller to submit an asynchronous message to the
// * server for processing.
// *****************************************************************************
int cdevSimpleRequestObject::sendCallback (cdevData * in, cdevCallback & callback)
{
cdevSimpleService * svc = (cdevSimpleService *)service_;
cdevTranNode * xobj = new cdevTranNode(&system_, this, NULL, new cdevCallback(callback));
char * Device = strdup(deviceName_);
char * Message = strdup(message_);
cdevData * Data = ((in==NULL)?new cdevData:new cdevData(*in));
xobj->enableDeleteCbk();
svc->submit(xobj, Device, Message, Data);
return CDEV_SUCCESS;
}
// *****************************************************************************
// * cdevSimpleRequestObject::send :
// * The send interface is used to provide synchronous I/O with the service.
// *
// * Returns CDEV_SUCCESS on success or CDEV_ERROR on error.
// *****************************************************************************
int cdevSimpleRequestObject::send ( cdevData * in, cdevData * out )
{
int status = CDEV_SUCCESS;
cdevSimpleService * svc = (cdevSimpleService *)service_;
cdevTranNode * xobj = new cdevTranNode(&system_, this, out, &svc->callback);
char * Device = strdup(deviceName_);
char * Message = strdup(message_);
cdevData * Data = ((in==NULL)?new cdevData:new cdevData(*in));
xobj->permanent(1);
svc->submit(xobj, Device, Message, Data);
// *********************************************************************
// * I used to wait for a response here only if the outbound cdevData
// * object was non-null. However, that provided unexpected behavior
// * to the client. Now I wait whether output data is expected or not.
// *********************************************************************
cdevTimeValue t(30.0);
cdevClock timer;
timer.schedule(NULL,t);
// *********************************************************************
// * WAITING WITH system_.pend():
// * Previously I was using system_.pend() to process events while
// * waiting for the service to respond. This resulted in a lock-up
// * when the connection could not be established or if the
// * connection collapsed while in use.
// *
// * WAITING WITH system_.poll():
// * When in a heavy inbound traffic situation, the calls from other
// * services will trample all over the inbound data coming from the
// * model service. This results in unreliable delivery and
// * processing of messages from the model server.
// *
// * WAITING WITH service_.poll():
// * So far so good.
// *********************************************************************
while(!xobj->finished() && !timer.expired()) service_->poll();
if (!xobj->finished())
{
status = CDEV_ERROR;
system_.reportError(
CDEV_SEVERITY_ERROR,
"cdevRequestObject",
this,
"Transaction wasn't processed after 30 seconds");
}
delete xobj;
return status;
}