コード例 #1
0
ファイル: objectEntry.c プロジェクト: jiajw0426/easyscada
/*
 * objectEntryDelete - Delete a object from structure objectEntry
 * @objectEntry: pointer to root structure 
 * @obejctEntryOID: pointer to the deleted objectEntryOID
 *
 * return 0-no obj. was deleted, 1-OID was deleted,2-OID,AID was deleted,
 *        3-OID,AID,HID was deleted
 */
int
objectEntryDelete(ORTEDomain *d,ObjectEntryOID *objectEntryOID,Boolean destroy) {
  ObjectEntryHID *objectEntryHID;
  ObjectEntryAID *objectEntryAID;
  int            result=0;

  debug(8,10) ("objectEntryDelete: start\n");
  if (!objectEntryOID) return result;
  objectEntryHID=objectEntryOID->objectEntryHID;
  objectEntryAID=objectEntryOID->objectEntryAID;
  //Destroy object on level OID
  eventDetach(d,
          objectEntryOID->objectEntryAID,
          &objectEntryOID->expirationPurgeTimer,
          0);
  eventDetach(d,
          objectEntryOID->objectEntryAID,
          &objectEntryOID->sendCallBackDelayTimer,
          0);
  FREE(objectEntryOID->attributes);
  if (objectEntryAID->aobject==objectEntryOID) {
    objectEntryAID->aobject=NULL;
    debug(8,5) ("objectEntry: Object: %#10.8x deleted from AID\n",objectEntryOID->oid);
  }
  if (destroy) {
    ObjectEntryOID_delete(objectEntryAID,objectEntryOID);
    FREE(objectEntryOID);
  }
  debug(8,5) ("objectEntry: Object: %#10.8x deleted\n",objectEntryOID->oid);
  result=1;
  //Destroy object on level AID
  if (ObjectEntryOID_is_empty(objectEntryAID)) {
    debug(8,5) ("objectEntry: App   : %#10.8x deleted\n",objectEntryAID->aid);
    if (destroy) {
      ObjectEntryAID_delete(objectEntryHID,objectEntryAID);
      FREE(objectEntryAID);
    }
    result=2;
  }
  //Destroy object on level HID
  if (ObjectEntryAID_is_empty(objectEntryHID)) {
    debug(8,5) ("objectEntry: Host  : %#10.8x deleted\n",objectEntryHID->hid);
    if (destroy) {
      ObjectEntryHID_delete(&d->objectEntry,objectEntryHID);
      FREE(objectEntryHID);
    }
    result=3;
  }
  debug(8,10) ("objectEntryDelete: finished\n");
  return result;
}
コード例 #2
0
ファイル: objectEntry.c プロジェクト: jiajw0426/easyscada
void
objectEntryRefreshApp(ORTEDomain *d,ObjectEntryOID *objectEntryOID) {
  if (!objectEntryOID) return;
  if ((objectEntryOID->oid!=OID_APP) ||
      (objectEntryOID->guid.aid==AID_UNKNOWN) ||
      (!gavl_cmp_guid(&objectEntryOID->guid,&d->guid))) return;
  eventDetach(d,
          objectEntryOID->objectEntryAID,
          &objectEntryOID->expirationPurgeTimer,
          0);
  eventAdd(d,
          objectEntryOID->objectEntryAID,
          &objectEntryOID->expirationPurgeTimer,
          0,
          "ExpirationTimer",
          objectEntryExpirationTimer,
          NULL,
          objectEntryOID,
          &((AppParams*)objectEntryOID->attributes)->expirationTime);
  debug(8,3) ("refreshed: 0x%x-0x%x\n",
              objectEntryOID->objectEntryHID->hid,
              objectEntryOID->objectEntryAID->aid);
}
コード例 #3
0
ファイル: RTPSAck.c プロジェクト: CTU-IIG/orte
void
RTPSAck(ORTEDomain *d, CDR_Codec *cdrCodec, MessageInterpret *mi, IPAddress senderIPAddress)
{
  GUID_RTPS          readerGUID;
  CSTWriter          *cstWriter = NULL;
  CSTRemoteReader    *cstRemoteReader;
  CSChangeForReader  *csChangeForReader;
  StateMachineSend   stateMachineSendNew;
  ObjectId           roid, woid;
  SequenceNumber     sn, isn;
  char               queue = 1;
  CDR_Endianness     data_endian;
  CORBA_octet        flags;
  char               f_bit;

  /* restore flag possition in submessage */
  cdrCodec->rptr -= 3;

  /* flags */
  CDR_get_octet(cdrCodec, (CORBA_octet *)&flags);
  f_bit = flags & 2;

  /* move reading possition to begin of submessage */
  cdrCodec->rptr += 2;

  /* next data are sent in big endianing */
  data_endian = cdrCodec->data_endian;
  cdrCodec->data_endian = FLAG_BIG_ENDIAN;

  /* readerObjectId */
  CDR_get_ulong(cdrCodec, (CORBA_unsigned_long *)&roid);

  /* writerObjectId */
  CDR_get_ulong(cdrCodec, (CORBA_unsigned_long *)&woid);

  cdrCodec->data_endian = data_endian;

  /* SeqNumber */
  CDR_get_ulong(cdrCodec, (CORBA_unsigned_long *)&sn.high);
  CDR_get_ulong(cdrCodec, (CORBA_unsigned_long *)&sn.low);

  readerGUID.hid = mi->sourceHostId;
  readerGUID.aid = mi->sourceAppId;
  readerGUID.oid = roid;

  debug(47, 3) ("recv: RTPS ACK%c(0x%x) from 0x%x-0x%x\n",
		f_bit ? 'F' : 'f',
		woid, mi->sourceHostId, mi->sourceAppId);

  /* Manager */
  if ((d->guid.aid & 0x03) == MANAGER) {
    switch (woid) {
      case OID_WRITE_APPSELF:
	pthread_rwlock_wrlock(&d->writerApplicationSelf.lock);
	cstWriter = &d->writerApplicationSelf;
	readerGUID.hid = senderIPAddress;
	readerGUID.aid = AID_UNKNOWN;
	readerGUID.oid = roid;
	eventDetach(d,
		    cstWriter->objectEntryOID->objectEntryAID,
		    &cstWriter->registrationTimer,
		    0); //common timer
	break;
      case OID_WRITE_MGR:
	pthread_rwlock_wrlock(&d->writerManagers.lock);
	cstWriter = &d->writerManagers;
	break;
      case OID_WRITE_APP:
	pthread_rwlock_wrlock(&d->writerApplications.lock);
	cstWriter = &d->writerApplications;
	break;
    }
  }

  /* Application */
  if ((d->guid.aid & 0x03) == MANAGEDAPPLICATION) {
    switch (roid) {
      case OID_READ_APP:
      case OID_READ_APPSELF:
	pthread_rwlock_wrlock(&d->writerApplicationSelf.lock);
	cstWriter = &d->writerApplicationSelf;
	eventDetach(d,
		    cstWriter->objectEntryOID->objectEntryAID,
		    &cstWriter->registrationTimer,
		    0); //common timer
	break;
      case OID_READ_PUBL:
	pthread_rwlock_wrlock(&d->writerPublications.lock);
	cstWriter = &d->writerPublications;
	break;
      case OID_READ_SUBS:
	pthread_rwlock_wrlock(&d->writerSubscriptions.lock);
	cstWriter = &d->writerSubscriptions;
	break;
      default:
	if ((woid & 0x07) == OID_PUBLICATION) {
	  GUID_RTPS  guid = d->guid;
	  guid.oid = woid;
	  pthread_rwlock_rdlock(&d->publications.lock);
	  cstWriter = CSTWriter_find(&d->publications, &guid);
	  pthread_rwlock_wrlock(&cstWriter->lock);
	  queue = 2;
	}
	break;
    }
  }

  if (!cstWriter) {
    if ((woid & 0x07) == OID_PUBLICATION)
      pthread_rwlock_unlock(&d->publications.lock);
    return;
  }
  cstRemoteReader = CSTRemoteReader_find(cstWriter, &readerGUID);
  if (!cstRemoteReader) {
    pthread_rwlock_unlock(&cstWriter->lock);
    if ((woid & 0x07) == OID_PUBLICATION)
      pthread_rwlock_unlock(&d->publications.lock);
    return;
  }

  stateMachineSendNew = NOTHNIGTOSEND;
  csChangeForReader = CSChangeForReader_first(cstRemoteReader);
  while (csChangeForReader) {
    isn = csChangeForReader->csChange->sn;
    if (SeqNumberCmp(csChangeForReader->csChange->gapSN, noneSN) > 0) {
      SeqNumberAdd(isn, csChangeForReader->csChange->sn, csChangeForReader->csChange->gapSN);
      SeqNumberDec(isn, isn);
    }
    if (SeqNumberCmp(isn, sn) < 0) {     //ACK
      if (csChangeForReader->commStateChFReader != ACKNOWLEDGED) {
	CSChangeForReader *csChangeForReaderDestroyed;
	csChangeForReaderDestroyed = csChangeForReader;
	csChangeForReader->commStateChFReader = ACKNOWLEDGED;
	csChangeForReader =
	  CSChangeForReader_next(cstRemoteReader, csChangeForReader);
	if ((woid & 0x07) == OID_PUBLICATION) {
	  CSTWriterDestroyCSChangeForReader(
	    csChangeForReaderDestroyed, ORTE_TRUE);
	}
      } else {
	csChangeForReader =
	  CSChangeForReader_next(cstRemoteReader, csChangeForReader);
      }
    } else {                                                      //NACK
      if (csChangeForReader->commStateChFReader != TOSEND) {
	csChangeForReader->commStateChFReader = TOSEND;
	cstRemoteReader->commStateToSentCounter++;
      }
      stateMachineSendNew = MUSTSENDDATA;
      csChangeForReader =
	CSChangeForReader_next(cstRemoteReader, csChangeForReader);
    }
  }

  if ((cstRemoteReader->commStateSend == NOTHNIGTOSEND) &&
      (stateMachineSendNew == MUSTSENDDATA)) {
    cstRemoteReader->commStateSend = stateMachineSendNew;
    eventDetach(d,
		cstRemoteReader->sobject->objectEntryAID,
		&cstRemoteReader->delayResponceTimer,
		queue);
    if (queue == 1) {
      eventAdd(d,
	       cstRemoteReader->sobject->objectEntryAID,
	       &cstRemoteReader->delayResponceTimer,
	       queue, //metatraffic timer
	       "CSTWriterSendTimer",
	       CSTWriterSendTimer,
	       &cstRemoteReader->cstWriter->lock,
	       cstRemoteReader,
	       &cstRemoteReader->cstWriter->params.delayResponceTime);
    } else {
      eventAdd(d,
	       cstRemoteReader->sobject->objectEntryAID,
	       &cstRemoteReader->delayResponceTimer,
	       queue, //userdata timer
	       "CSTWriterSendStrictTimer",
	       CSTWriterSendStrictTimer,
	       &cstRemoteReader->cstWriter->lock,
	       cstRemoteReader,
	       &cstRemoteReader->cstWriter->params.delayResponceTime);
    }
  }

  if (stateMachineSendNew == NOTHNIGTOSEND) {
    cstRemoteReader->commStateSend = NOTHNIGTOSEND;
    if (queue == 1) {
      eventDetach(d,
		  cstRemoteReader->sobject->objectEntryAID,
		  &cstRemoteReader->delayResponceTimer,
		  queue);
    } else {
      eventDetach(d,
		  cstRemoteReader->sobject->objectEntryAID,
		  &cstRemoteReader->repeatAnnounceTimer,
		  queue);
    }
  }

  if ((!f_bit) && (cstRemoteReader->commStateSend == NOTHNIGTOSEND)) {
    cstRemoteReader->commStateHB = MUSTSENDHB;
    eventDetach(d,
		cstRemoteReader->sobject->objectEntryAID,
		&cstRemoteReader->delayResponceTimer,
		queue);
    if (queue == 1) {
      eventAdd(d,
	       cstRemoteReader->sobject->objectEntryAID,
	       &cstRemoteReader->delayResponceTimer,
	       queue, //metatraffic timer
	       "CSTWriterSendTimer",
	       CSTWriterSendTimer,
	       &cstRemoteReader->cstWriter->lock,
	       cstRemoteReader,
	       &cstRemoteReader->cstWriter->params.delayResponceTime);
    } else {
      eventAdd(d,
	       cstRemoteReader->sobject->objectEntryAID,
	       &cstRemoteReader->delayResponceTimer,
	       queue, //userdata timer
	       "CSTWriterSendStrictTimer",
	       CSTWriterSendStrictTimer,
	       &cstRemoteReader->cstWriter->lock,
	       cstRemoteReader,
	       &cstRemoteReader->cstWriter->params.delayResponceTime);
    }
  }

  pthread_rwlock_unlock(&cstWriter->lock);
  if ((woid & 0x07) == OID_PUBLICATION)
    pthread_rwlock_unlock(&d->publications.lock);
}