示例#1
0
文件: ipc.c 项目: Paresh1693/carmen
IPC_RETURN_TYPE IPC_defineMsg (const char *msgName, unsigned int length,
			       const char *formatString)
{
  char msgFormat[20];

  if (!msgName || strlen(msgName) == 0) {
    RETURN_ERROR(IPC_Null_Argument);
  } else if (!X_IPC_CONNECTED()) {
    RETURN_ERROR(IPC_Not_Connected);
  } if (length != (unsigned int)IPC_VARIABLE_LENGTH && formatString != NULL &&
	length != (unsigned int)x_ipc_dataStructureSize(ParseFormatString(formatString))) {
    RETURN_ERROR(IPC_Mismatched_Formatter);
  } else {
    if (length == IPC_VARIABLE_LENGTH) {
      sprintf(msgFormat, "{int, <byte:1>}");
    } else if (length == 0) {
      msgFormat[0] = '\0';
    } else {
      sprintf(msgFormat, "[byte:%d]", length);
    }
    x_ipcRegisterMessage(msgName, BroadcastClass, msgFormat, formatString);

    return IPC_OK;
  }
}
示例#2
0
void *x_ipcReferenceData(X_IPC_REF_PTR ref)
{
  int32 refId, sd;
  MSG_PTR msg;
  char *msgData;
  X_IPC_REF_PTR waitRef;
  X_IPC_RETURN_VALUE_TYPE returnValue;

  msg = x_ipc_msgFind(X_IPC_REF_DATA_QUERY);
  if (msg == NULL) return NULL;

  if (!ref->msg) {
    if (!ref->name) {
      /* 17-Jun-91: fedor: start enforcing correct refs */
      X_IPC_MOD_ERROR1("ERROR: x_ipcReferenceData: Badly Formed Reference: %d\n",
		  ref->refId);
      return NULL;
    }
    ref->msg = x_ipc_msgFind(ref->name);
    if (ref->msg == NULL) return NULL;
  }

  /* 17-Jun-91: fedor: check if any message form */
  if (!ref->msg->msgData->msgFormat)
    return NULL;

  refId = x_ipc_nextSendMessageRef();
  returnValue = x_ipc_sendMessage((X_IPC_REF_PTR)NULL, msg,
				  (char *)&ref->refId, (char *)NULL, refId);

  if (returnValue != Success) {
    X_IPC_MOD_ERROR("ERROR: x_ipcReferenceData: x_ipc_sendMessage Failed.\n");
    return NULL;
  }

  waitRef = x_ipcRefCreate(ref->msg, ref->name, refId);

  msgData = (char *)x_ipcMalloc((unsigned)x_ipc_dataStructureSize(ref->msg->msgData->msgFormat));

  LOCK_CM_MUTEX;
  sd = GET_C_GLOBAL(serverRead);
  UNLOCK_CM_MUTEX;
  returnValue = x_ipc_waitForReplyFrom(waitRef, msgData, TRUE, WAITFOREVER, sd);

  x_ipcRefFree(waitRef);

  if (returnValue == NullReply) {
    /* 17-Jun-91: fedor: if NullReply then nothing else was malloced. */
    x_ipcFree(msgData);
    return NULL;
  }
  else
    return msgData;
}
示例#3
0
static int32 printArrayData(FILE *stream, Print_Data_Ptr printer,
			    CONST_FORMAT_PTR format, 
			    const void *dataArray,
			    int32 AStart, FORMAT_ARRAY_PTR formatArray,
			    int32 dimension, int32 keepWithNext,
			    char *startToken, char *endToken)
{ 
  int32 i, element_size=0, last_dimension_p, last_element_p;
  int32 vector_length, next_keep;
  
  printString(stream, printer, startToken, DEFAULT_KEEP);
  
  last_dimension_p = (dimension+1 == formatArray[0].i);
  if (last_dimension_p)
    element_size = x_ipc_dataStructureSize(format);
  
  vector_length = formatArray[dimension].i;
  
  for (i=0; i<vector_length; i++) {
    if (printer->truncatedGlobal) 
      return 0;
    else {
      last_element_p = (i+1 == vector_length);
      next_keep = ((last_element_p) ? keepWithNext+1 : 1);
      if (last_dimension_p) {
	Print_Structured_Data(stream, printer, format,
			      (CONST_GENERIC_DATA_PTR)dataArray,
			      AStart, (FORMAT_PTR)NULL, next_keep);
	AStart += element_size;
	if (!last_element_p)
	  printCommaSpace(stream, printer);
      }
      else {
	AStart = printArrayData(stream, printer, format, dataArray, AStart, 
				formatArray, dimension+1, next_keep, 
				startToken, endToken);
	if (!last_element_p)
	  printCommaSpace(stream, printer);
      }
    }
  }
  
  printString(stream, printer, endToken, keepWithNext);
  
  return AStart;
}
示例#4
0
int main (int argc, char **argv)
#endif
{
#ifndef VXWORKS
  int numTrials;
  char *formatString;
#endif
  int i;
  FORMATTER_PTR format;
  char data[MAX_DATA_SIZE]; /* No error checking if the format is too big */
  void *dataPtr;
  IPC_VARCONTENT_TYPE vc;

  bzero(data, MAX_DATA_SIZE);
#ifndef VXWORKS
  if (argc == 1) {
    fprintf(stderr, "Usage %s: <format_string> [num_trials]\n", argv[0]);
    exit(-1);
  }

  formatString = argv[1];
  numTrials = (argc > 2 ? atoi(argv[2]) : DEFAULT_TRIALS);
#endif
  IPC_initialize();

  format = IPC_parseFormat(formatString);
  if (!format) {
    fprintf(stderr, "Illegal format string: %s\n", formatString);
    exit(-1);
  }

  /* Marshall tests */
  printf("Marshalling trial with %s\n", formatString);
  printf("  Struct Size: %d, Buffer Size: %d (%s size)\n",
	 x_ipc_dataStructureSize(format), 
	 (formatContainsPointers(format) ? -1 : x_ipc_bufferSize(format, NULL)),
	 (x_ipc_sameFixedSizeDataBuffer(format) ? "fixed" : "variable"));

  TIME_TRIAL({ IPC_marshall(format, &data, &vc);
	       IPC_freeByteArray(vc.content);})
示例#5
0
static void Print_Structured_Data(FILE *Stream, Print_Data_Ptr printer,
				  CONST_FORMAT_PTR Format,
				  CONST_GENERIC_DATA_PTR Data_Ptr, 
				  int32 DStart,
				  CONST_FORMAT_PTR parentFormat, 
				  int32 Keep_With_Next)
{ 
  TRANSLATE_FN_DPRINT printProc;
  int32 i, last_element_p, next_keep, length, currentDStart;
  u_int32 byte;
  void *StructPtr, *ArrayPtr;
  FORMAT_ARRAY_PTR format_array, fixed_format_array;

  currentDStart = DStart;
  switch (Format->type) {
  case LengthFMT:
    length = Format->formatter.i;
    printString(Stream, printer, "(", DEFAULT_KEEP);
    for (i=0; i<length; i++) {
      if (printer->truncatedGlobal) {
	return;
      } else {
	byte = 0;
	*(((u_char *)&byte)+sizeof(u_int32)-sizeof(u_char)) =
	  *(u_char *)(Data_Ptr+currentDStart+i);
	printHex(Stream, printer, &byte,
		 (i == length-1 ? Keep_With_Next+1 : 1));
	if (i == length-1) printString(Stream, printer, ")", Keep_With_Next);
	else printCommaSpace(Stream, printer);
      }
    }
    break;
    
  case PrimitiveFMT: 
    printProc = GET_M_GLOBAL(TransTable)[Format->formatter.i].DPrint;
    (* printProc)(Data_Ptr, currentDStart, Stream, printer, Keep_With_Next);
    break;
    
  case PointerFMT:
    StructPtr = REF(GENERIC_DATA_PTR, Data_Ptr, currentDStart);
    if (StructPtr) { 
      printString(Stream, printer, "*", DEFAULT_KEEP);
      Print_Structured_Data(Stream, printer,
			    CHOOSE_PTR_FORMAT(Format, parentFormat),
			    (CONST_GENERIC_DATA_PTR)StructPtr, 0,
			    (CONST_FORMAT_PTR)NULL, Keep_With_Next);
    }
    else
      printString(Stream, printer, "NULL", Keep_With_Next);
    break;
    
  case StructFMT:
    printString(Stream, printer, "{", DEFAULT_KEEP);
    format_array = Format->formatter.a;
    for (i=1;i<format_array[0].i;i++) {
      if (printer->truncatedGlobal)
	return;
      else {
	last_element_p = (i+1 == format_array[0].i);
	next_keep = ((last_element_p) ? Keep_With_Next+1 : 1);
	Print_Structured_Data(Stream, printer, format_array[i].f, 
			      Data_Ptr+DStart, currentDStart-DStart, 
			      Format, next_keep);
	currentDStart += x_ipc_dataStructureSize(format_array[i].f);
	currentDStart = x_ipc_alignField(Format, i, currentDStart);
	if (last_element_p)
	  printString(Stream, printer, "}", Keep_With_Next);
	else
	  printCommaSpace(Stream, printer);
      }
    }
    break;
    
  case FixedArrayFMT:
    (void)printArrayData(Stream, printer, Format->formatter.a[1].f,
			 Data_Ptr, currentDStart, 
			 Format->formatter.a, 2, Keep_With_Next, "[", "]");
    break;
    
  case VarArrayFMT:
    ArrayPtr = REF(GENERIC_DATA_PTR, Data_Ptr, currentDStart);
    format_array = Format->formatter.a;
    if (ArrayPtr) {
      fixed_format_array = fix_format_array(format_array, 
					    parentFormat,
					    Data_Ptr, currentDStart);
      (void)printArrayData(Stream, printer, format_array[1].f, ArrayPtr, 0, 
			   fixed_format_array, 2, Keep_With_Next, "<", ">");
      x_ipcFree((char *)fixed_format_array);
    }
    else
      printString(Stream, printer, "NULL", Keep_With_Next);
    break;
  case NamedFMT:
    Print_Structured_Data(Stream, printer,
			  x_ipc_fmtFind(Format->formatter.name),
			  Data_Ptr, currentDStart,
			  parentFormat, Keep_With_Next);
    break;
  case BadFormatFMT:
    printString(Stream, printer, "Bad Format", Keep_With_Next);
  case EnumFMT:
    { int32 eVal;
      eVal = x_ipc_enumToInt(Format, Data_Ptr, &currentDStart);
      if (Format->formatter.a[0].i > 2 &&
	  /* enum value within range */
	  0 <= eVal && eVal <= ENUM_MAX_VAL(Format)) {
	printString(Stream, printer,
		    Format->formatter.a[eVal+2].f->formatter.name,
		    Keep_With_Next);
      } else {
	printInt(Stream, printer, &eVal, Keep_With_Next);
      }
      break;
    }

#ifndef TEST_CASE_COVERAGE
  default:
    X_IPC_MOD_ERROR1("Unknown Print_Structured_Data Type %d", Format->type);
    break;
#endif
  }
}