v_writeResult v_deliveryServiceEntryWrite( v_deliveryServiceEntry _this, v_message message, v_instance *instancePtr) { v_deliveryInfoTemplate ackMsg; v_writeResult result = V_WRITE_REJECTED; v_reader reader; OS_UNUSED_ARG(instancePtr); assert(C_TYPECHECK(_this,v_deliveryServiceEntry)); assert(message != NULL); /* Only write if the message is not produced by an incompatible writer. */ reader = v_entryReader(_this); OSPL_LOCK(reader); /* Filter-out all QoS-incompatible messages. */ if (!v_messageQos_isReaderCompatible(message->qos,reader)) { OSPL_UNLOCK(reader); return V_WRITE_SUCCESS; } /* If Alive then claim instance and trigger with sample event. */ ackMsg = (v_deliveryInfoTemplate)message; result = v_deliveryServiceWrite(v_deliveryService(reader),ackMsg); OSPL_UNLOCK(reader); return result; }
void v_publicDispose( v_public o) { assert(C_TYPECHECK(o,v_public)); if (o == NULL) { return; } switch(v_objectKind(o)) { case K_PARTICIPANT: v_participantDeinit(v_participant(o)); break; case K_PUBLISHER: v_publisherDeinit(v_publisher(o)); break; case K_SUBSCRIBER: v_subscriberDeinit(v_subscriber(o)); break; case K_WRITER: v_writerDeinit(v_writer(o)); break; case K_DATAREADER: v_dataReaderDeinit(v_dataReader(o)); break; case K_DELIVERYSERVICE:v_deliveryServiceDeinit(v_deliveryService(o)); break; case K_NETWORKREADER: v_networkReaderDeinit(v_networkReader(o)); break; case K_READER: v_readerDeinit(v_reader(o)); break; case K_GROUPQUEUE: v_groupQueueDeinit(v_groupQueue(o)); break; case K_TOPIC: v_topicDeinit(v_topic(o)); break; case K_ENTITY: break; case K_DOMAIN: v_partitionDeinit(v_partition(o)); break; case K_GROUP: v_groupDeinit(v_group(o)); break; case K_SERVICEMANAGER: /* Is never freed! */ break; case K_SPLICED: v_splicedDeinit(v_spliced(o)); break; case K_NETWORKING: case K_DURABILITY: case K_CMSOAP: case K_SERVICE: v_serviceDeinit(v_service(o)); break; case K_SERVICESTATE: /* Is never freed! */ break; case K_CONFIGURATION: break; case K_QUERY: OS_REPORT(OS_ERROR, "v_publicDispose failure", 0, "deinit of abstract class K_QUERY"); break; case K_DATAREADERQUERY: v_dataReaderQueryDeinit(v_dataReaderQuery(o)); break; case K_DATAVIEWQUERY: v_dataViewQueryDeinit(v_dataViewQuery(o)); break; case K_DATAVIEW: v_dataViewDeinit(v_dataView(o)); break; case K_WAITSET: v_waitsetDeinit(v_waitset(o)); break; case K_WRITERINSTANCE: v_writerInstanceDeinit(v_writerInstance(o)); break; case K_DATAREADERINSTANCE: v_dataReaderInstanceDeinit(v_dataReaderInstance(o)); break; case K_DATAVIEWINSTANCE: v_dataViewInstanceDeinit(v_dataViewInstance(o)); break; default: OS_REPORT_1(OS_ERROR,"v_publicDispose failed",0, "illegal entity kind (%d) specified",v_objectKind(o)); assert(FALSE); break; } c_free(o); }
c_bool v_readerUnSubscribe( v_reader r, v_partition d) { assert(C_TYPECHECK(r,v_reader)); switch(v_objectKind(r)) { case K_DATAREADER: return v_dataReaderUnSubscribe(v_dataReader(r),d); case K_DELIVERYSERVICE: return v_deliveryServiceUnSubscribe(v_deliveryService(r),d); case K_GROUPQUEUE: return v_groupStreamUnSubscribe(v_groupStream(r),d); case K_NETWORKREADER: return v_networkReaderUnSubscribe(v_networkReader(r),d); default: OS_REPORT_1(OS_ERROR,"v_readerUnSubscribe failed",0, "illegal reader kind (%d) specified", v_objectKind(r)); assert(FALSE); } return TRUE; }
/************************************************************** * Public functions **************************************************************/ c_bool v_readerSubscribe( v_reader r, v_partition d) { c_bool result; assert(C_TYPECHECK(r,v_reader)); switch(v_objectKind(r)) { case K_DATAREADER: result = v_dataReaderSubscribe(v_dataReader(r),d); break; case K_DELIVERYSERVICE: result = v_deliveryServiceSubscribe(v_deliveryService(r),d); break; case K_GROUPQUEUE: result = v_groupStreamSubscribe(v_groupStream(r),d); break; case K_NETWORKREADER: result = v_networkReaderSubscribe(v_networkReader(r),d); break; default: OS_REPORT_1(OS_ERROR,"v_readerSubscribe failed",0, "illegal reader kind (%d) specified", v_objectKind(r)); assert(FALSE); result = FALSE; break; } readerGetHistoricalData(r); return result; }
void v_subscriberFree( v_subscriber s) { v_kernel kernel; v_participant p; v_reader o; v_entity found; c_long sc; kernel = v_objectKernel(s); sc = (c_long)pa_decrement(&(s->shareCount)); if (sc > 0) return; if(sc == 0){ v_observableRemoveObserver(v_observable(kernel->groupSet),v_observer(s), NULL); if (s->qos->share.enable) { found = v_removeShare(kernel,v_entity(s)); assert(found == v_entity(s)); c_free(found); } while ((o = c_take(s->readers)) != NULL) { switch (v_objectKind(o)) { case K_DATAREADER: v_dataReaderFree(v_dataReader(o)); break; case K_DELIVERYSERVICE: v_deliveryServiceFree(v_deliveryService(o)); break; case K_GROUPQUEUE: v_groupQueueFree(v_groupQueue(o)); break; case K_NETWORKREADER: v_networkReaderFree(v_networkReader(o)); break; default: OS_REPORT_1(OS_ERROR, "v_subscriber", 0, "Unknown reader %d", v_objectKind(o)); assert(FALSE); break; } c_free(o); } p = v_participant(s->participant); if (p != NULL) { v_participantRemove(p,v_entity(s)); s->participant = NULL; } v_publicFree(v_public(s)); } else { OS_REPORT_1(OS_ERROR, "v_subscriberFree", 0, "subscriber already freed (shareCount is now %d).", sc); assert(sc == 0); } }
v_deliveryService v_deliveryServiceNew ( v_subscriber subscriber, const c_char *name) { v_kernel kernel; v_deliveryService _this; v_readerQos q; v_topic topic; c_base base; c_type type; v_entry entry, found; assert(C_TYPECHECK(subscriber,v_subscriber)); base = c_getBase(subscriber); kernel = v_objectKernel(subscriber); topic = v_lookupTopic (kernel, V_DELIVERYINFO_NAME); /* ES, dds1576: Before creating the ackreader we have to verify that read * access to the topic is allowed. We can accomplish this by checking the * access mode of the topic. */ if(!topic) { OS_REPORT(OS_ERROR, "v_deliveryServiceNew",0, "DeliveryService not created: " "Could not locate topic with name DCPS_Delivery."); return NULL; } if(v_topicAccessMode(topic) == V_ACCESS_MODE_READ || v_topicAccessMode(topic) == V_ACCESS_MODE_READ_WRITE) { q = v_readerQosNew(kernel,NULL); if (q == NULL) { OS_REPORT(OS_ERROR, "v_deliveryServiceNew", 0, "DeliveryService not created: inconsistent qos"); return NULL; } _this = v_deliveryService(v_objectNew(kernel,K_DELIVERYSERVICE)); type = c_resolve(base, "kernelModule::v_deliveryGuard"); _this->guards = c_tableNew(type, "writerGID.localId"); c_free(type); type = c_resolve(base, "kernelModule::v_subscriptionInfoTemplate"); _this->subscriptions = c_tableNew(type, "userData.key.systemId,userData.key.localId"); c_free(type); q->userKey.enable = TRUE; q->userKey.expression = NULL; v_readerInit(v_reader(_this),name, subscriber,q, NULL, TRUE); c_free(q); entry = v_entry(v_deliveryServiceEntryNew(_this,topic)); found = v_readerAddEntry(v_reader(_this),v_entry(entry)); c_free(entry); c_free(found); v_deliveryServiceEnable(_this); } else { OS_REPORT_1(OS_ERROR, "v_deliveryServiceNew", 0, "Creation of DeliveryService <%s> failed. Topic DCPS_Delivery." "does not have read access rights.", name); _this = NULL; } return _this; }