perfsch.c.txt
/*+
*
* File: perfsch.c
*
* Description: Performer with call back ESROS API (with scheduler)
*
* Functions:
* G_heartBeat(void)
*
-*/
#include "estd.h"
#include "pf.h"
#include "eh.h"
#include "du.h"
#include "getopt.h"
#include "tm.h"
#include "addr.h"
#include "inetaddr.h"
#include "sch.h"
#include "esro_cb.h"
#include "extfuncs.h"
#include "target.h"
RC_DEBUG_ENABLE;
char *__applicationName = "perfsch";
extern Int G_heartBeat(void);
PUBLIC DU_Pool *G_duMainPool;
typedef struct G_Env {
Char *progName;
/* Application Specific Information */
} G_Env;
PUBLIC TM_ModDesc G_tmDesc;
PUBLIC G_Env G_env;
ESRO_SapSel locSapSel = 15;
ESRO_SapDesc locSapDesc;
ESRO_InvokeId invokeId;
ESRO_EncodingType encodingType;
ESRO_OperationValue operationValue;
#define SHELL_CMD_OP 2
ESRO_FunctionalUnit funcUnit = ESRO_3Way;
struct ESRO_Event event;
Bool reset = 0;
#define RESULT 0
#define ERROR 1
Int resErr = RESULT;
/*<
* Function: G_init
*
* Description: Initialize.
*
* Arguments: None.
*
* Returns: None.
*
>*/
Void
G_init(void)
{
G_tmDesc = TM_open("G_");
if (!G_tmDesc) {
EH_problem("G_init : TM_open G_ failed");
}
signal(SIGINT, G_sigIntr);
}
/*<
* Function: G_exit
*
* Description: Exit.
*
* Arguments: Exit code.
*
* Returns: None.
*
>*/
Void
G_exit(Int code)
{
exit(code);
}
/*<
* Function: G_usage
*
* Description: Usage.
*
* Arguments: None.
*
* Returns: None.
*
>*/
Void
G_usage(void)
{
String usage1 = "";
String usage2 = "";
printf("%s: Usage: %s\n", G_env.progName, usage1);
printf("%s: Usage: %s\n", G_env.progName, usage2);
}
/*<
* Function: G_sigIntr
*
* Description: Signal processing.
*
* Arguments: None.
*
* Returns: None.
*
>*/
Void
G_sigIntr(Int unUsed)
{
signal(SIGINT, G_sigIntr);
G_exit(22);
}
/*<
* Function: G_heartBeat
*
* Description: Heart Beat for the stack.
*
* Arguments: None.
*
* Returns: 0 on successful completion, -1 on unsuccessful completion.
*
>*/
SuccFail
G_heartBeat(void)
{
if (SCH_block() < 0) {
EH_fatal("main: SCH_block returned negative value");
return (FAIL);
}
SCH_run();
return (SUCCESS);
}
static void resultReq(String result);
static void errorReq(String error);
int
invokeIndication (ESRO_SapDesc locSapDesc, ESRO_SapSel remESROSap,
T_SapSel *remTsap, N_SapAddr *remNsap, ESRO_InvokeId invokeId,
ESRO_OperationValue opValue, ESRO_EncodingType encodingType,
DU_View parameter)
{
TM_TRACE((G_tmDesc, TM_ENTER,
"Got ESRO-Invoke.Indcation invokeId=%d, operationValue=%d, paramter=%s\n",
invokeId,
opValue,
DU_data(parameter)));
/* Here is where you perform what you should do
* and then call resultReq or errorReq.
*/
{
time_t idate;
idate = time(&idate);
if (resErr == RESULT) {
resultReq(ctime(&idate));
} else {
errorReq(ctime(&idate));
}
}
return 1;
}
/*<
* Function: resultReq
*
* Description: Result request.
*
* Arguments: Result.
*
* Returns: None.
*
>*/
static void
resultReq(String result)
{
ESRO_RetVal gotVal;
DU_View resultDU;
int paramLength;
TM_TRACE((G_tmDesc, TM_ENTER, "Issuing ESRO-Result.Request parameter=%s\n",
result));
paramLength = strlen(result);
resultDU = DU_alloc(G_duMainPool, paramLength);
OS_copy(DU_data(resultDU), result, paramLength);
if ((gotVal = ESRO_CB_resultReq(invokeId, (ESRO_EncodingType) 2, resultDU))
< 0) {
EH_problem("resultReq: Could not Invoke");
}
DU_free(resultDU);
reset = 1;
}
/*<
* Function: errorReq
*
* Description: Error request.
*
* Arguments: Error.
*
* Returns: None.
*
>*/
static void
errorReq(String error)
{
ESRO_RetVal gotVal;
DU_View errorDU;
int paramLength;
TM_TRACE((G_tmDesc, TM_ENTER, "Issuing ESRO-Error.Request parameter=%s\n",
error));
paramLength = strlen(error);
errorDU = DU_alloc(G_duMainPool, paramLength);
OS_copy(DU_data(errorDU), error, paramLength);
if ((gotVal = ESRO_CB_errorReq(invokeId, (ESRO_EncodingType) 2, 0, errorDU))
< 0) {
EH_problem("errorReq: Could not Invoke");
}
DU_free(errorDU);
reset = 1;
}
int
resultInd (ESRO_InvokeId invokeId,
ESRO_EncodingType encodingType,
DU_View parameter)
{
char *duData;
duData = DU_data(parameter);
printf("-------------------------------------------------------------------\n");
printf("Performer: Got Result Indication: invokeId=%d, paramter=%s\n",
invokeId, duData);
printf("-------------------------------------------------------------------\n");
return 1;
}
int
errorInd (ESRO_InvokeId invokeId,
ESRO_EncodingType encodingType,
ESRO_ErrorValue errorValue,
DU_View parameter)
{
char *duData;
duData = DU_data(parameter);
printf("-------------------------------------------------------------------\n");
printf("Performer: Got Error Indication: invokeId=%d, paramter=%s\n",
invokeId, duData);
printf("-------------------------------------------------------------------\n");
reset = 1;
return 1;
}
int
resultCnf(ESRO_InvokeId invokeId)
{
TM_TRACE((G_tmDesc, TM_ENTER,
"Got ESRO-Result.Confirm invokeid=%d\n",
invokeId));
printf("------------------------------------------------------\n");
printf("Performer: Got Result Confirmation. invokeId=%d\n",
invokeId);
printf("------------------------------------------------------\n");
reset = 1;
return 1;
}
int
errorCnf(ESRO_InvokeId invokeId)
{
TM_TRACE((G_tmDesc, TM_ENTER,
"Got ESRO-Error.Confirm invokeid=%d\n",
invokeId));
printf("------------------------------------------------------\n");
printf("Performer: Got Error Confirmation. invokeId=%d\n",
invokeId);
printf("------------------------------------------------------\n");
reset = 1;
return 1;
}
int
failureInd(ESRO_InvokeId invokeId, ESRO_FailureValue failureValue)
{
printf("\nPerformer: Failure Indication: InvokeId = %d \n", invokeId);
return 1;
}
/*<
* Function: main()
*
* Description: main function of performer.
*
* Arguments: argc, argv.
*
* Returns: None.
*
>*/
Int
main(int argc, char **argv)
{
Int c;
Bool badUsage;
G_env.progName = argv[0];
TM_init();
badUsage = FALSE;
while ((c = getopt(argc, argv, "T:l:f:re")) != EOF) {
switch (c) {
case `T':
TM_setUp(optarg);
break;
case `l': /* Local ESRO Sap Selector */
{
Int gotVal;
if ( PF_getInt(optarg, &gotVal, 13, 0, 63) ) {
EH_problem("main (performer): ");
badUsage = TRUE;
} else {
locSapSel = gotVal;
}
}
break;
case `f': /* ESRO functional unit */
{
Int gotVal;
if ( PF_getInt(optarg, &gotVal, 12, 0, 63) ) {
EH_problem("main: ");
badUsage = TRUE;
} else {
funcUnit = gotVal;
}
}
break;
case `r':
resErr = RESULT;
break;
case `e':
resErr = ERROR;
break;
case `u':
case `?':
default:
badUsage = TRUE;
break;
}
}
if (badUsage) {
G_usage();
G_exit(1);
}
G_init();
G_duMainPool = DU_buildPool(MAXBFSZ, BUFFERS, VIEWS); /* build buf pool */
ESRO_init();
TM_validate();
printf("\nFunctional Unit: %d-Way handshaking\n", funcUnit);
ESRO_CB_sapUnbind(locSapSel);
if (ESRO_CB_sapBind(&locSapDesc, locSapSel,
funcUnit,
invokeIndication,
resultInd,
errorInd, resultCnf,
errorCnf, failureInd) < 0) {
EH_fatal("perform: Could not activate local ESRO SAP.");
}
while (!reset) {
if (G_heartBeat()) {
G_exit(13);
}
}
ESRO_CB_sapUnbind(locSapSel);
exit (0);
} /* main() */