v_deadLineInstanceList v_deadLineInstanceListNew( c_base base, v_leaseManager leaseManager, v_duration leaseDuration, v_leaseActionId actionId, v_public o) { v_deadLineInstanceList list; c_type type; assert(C_TYPECHECK(leaseManager,v_leaseManager)); assert(C_TYPECHECK(o,v_public)); type = c_resolve(base, "kernelModule::v_deadLineInstanceList"); assert(type); list = c_new(type); c_free(type); if (list) { v_objectKind(list) = K_DEADLINEINSTANCE; v_instanceInit(v_instance(list)); list->leaseManager = c_keep(leaseManager); list->leaseDuration = leaseDuration; list->deadlineLease = NULL; list->actionObject = o; /* no keep, since actionObject is onwer of v_deadLineInstanceList */ list->actionId = actionId; } else { OS_REPORT(OS_ERROR, "v_deadLineInstanceListNew",0, "Failed to allocate v_deadLineInstanceList."); } return list; }
v_dataViewInstance v_dataViewInstanceNew( v_dataView dataView, v_dataViewSample viewSample) { v_dataViewInstance instance; assert(dataView); assert(viewSample); assert(C_TYPECHECK(dataView,v_dataView)); assert(C_TYPECHECK(viewSample,v_dataViewSample)); instance = v_dataViewInstance(c_new(dataView->instanceType)); if (instance) { v_object(instance)->kernel = v_objectKernel(dataView); v_objectKind(instance) = K_DATAVIEWINSTANCE; v_instanceInit(v_instance(instance), v_entity(dataView)); viewSample->next = viewSample; v_dataViewInstanceTemplate(instance)->sample = viewSample; instance->sampleCount = 1; v_stateSet(v_instanceState(instance),L_NEW); v_stateClear(v_readerSample(viewSample)->sampleState,L_READ); assert(C_TYPECHECK(instance,v_dataViewInstance)); CHECK_INSTANCE(instance); } else { OS_REPORT(OS_FATAL, OS_FUNCTION, V_RESULT_INTERNAL_ERROR, "Failed to allocate v_dataViewInstance"); assert(FALSE); } return instance; }
void v_deadLineInstanceListRemoveInstance( v_deadLineInstanceList list, v_instance instance) { assert(C_TYPECHECK(list,v_deadLineInstanceList)); assert((instance->prev != NULL) && (instance->next != NULL)); assert(c_refCount(list) > 0); assert(c_refCount(instance) > 0); /* As the instance is removed, there is no need to update the lease. * Updating the lease might trigger the leasemanager thread to determine * the next expiry time. The next expiry time can also be determined on * the next deadline check, which is more efficient as the administration * might already have changed many times. */ v_instanceRemove(instance); if (v_instanceAlone(v_instance(list))) { /* list has become empty */ if (list->deadlineLease != NULL) { v_leaseManagerDeregister(list->leaseManager, list->deadlineLease); c_free(list->deadlineLease); list->deadlineLease = NULL; } } }
void v_dataViewInstanceDeinit( v_dataViewInstance instance) { OS_UNUSED_ARG(instance); assert(C_TYPECHECK(instance,v_dataViewInstance)); v_instanceDeinit(v_instance(instance)); }
c_bool v_deadLineInstanceListEmpty( v_deadLineInstanceList list) { if (v_instanceAlone(v_instance(list))) { return TRUE; } else { return FALSE; } }
void v_instanceAppend( v_instance instance, v_instance next) { assert(C_TYPECHECK(instance, v_instance)); assert(C_TYPECHECK(next, v_instance)); assert(v_instanceAlone(next)); v_instance(instance->next)->prev = next; next->next = instance->next; instance->next = next; next->prev = instance; }
void v_instanceInsert( v_instance instance, v_instance prev) { assert(C_TYPECHECK(instance, v_instance)); assert(C_TYPECHECK(prev, v_instance)); assert(v_instanceAlone(prev)); v_instance(instance->prev)->next = prev; prev->prev = instance->prev; instance->prev = prev; prev->next = instance; }
void v_deadLineInstanceListSetDuration( v_deadLineInstanceList list, v_duration duration) { v_kernel k; v_result result; assert(C_TYPECHECK(list,v_deadLineInstanceList)); list->leaseDuration = duration; if (list->deadlineLease != NULL) { if (c_timeCompare(duration, C_TIME_INFINITE) != C_EQ) { v_leaseRenew(list->deadlineLease,duration); } else { v_leaseManagerDeregister(list->leaseManager, list->deadlineLease); c_free(list->deadlineLease); list->deadlineLease = NULL; } } else { if ((v_objectKind(v_instance(list)->prev) != K_DEADLINEINSTANCE) && /* not in list */ (c_timeCompare(duration, C_TIME_INFINITE) != C_EQ)) { /* new instance */ k = v_objectKernel(list->leaseManager); list->deadlineLease = v_leaseNew(k, duration); if(list->deadlineLease) { result = v_leaseManagerRegister( list->leaseManager, list->deadlineLease, list->actionId, v_public(list->actionObject), TRUE /* repeat lease if expired */); if(result != V_RESULT_OK) { c_free(list->deadlineLease); list->deadlineLease = NULL; OS_REPORT_1(OS_ERROR, "v_deadLineInstanceList", 0, "A fatal error was detected when trying to register the deadline lease." "The result code was %d.", result); } } } } }
/* put at end of list */ void v_deadLineInstanceListInsertInstance( v_deadLineInstanceList list, v_instance instance) { v_instance head = v_instance(list); v_kernel k; v_result result; assert(C_TYPECHECK(instance,v_instance)); assert(C_TYPECHECK(list,v_deadLineInstanceList)); assert(v_instanceAlone(instance)); assert(c_refCount(list) > 0); assert(c_refCount(instance) > 0); /* As the instance is put at the end of the list no need to update the lease! */ v_instanceUpdate(instance); /* Updates instance checkTime */ v_instanceAppend(head,instance); if (list->deadlineLease == NULL) { if (c_timeCompare(list->leaseDuration, C_TIME_INFINITE) != C_EQ) { k = v_objectKernel(list->leaseManager); list->deadlineLease = v_leaseNew(k, list->leaseDuration); if(list->deadlineLease) { result = v_leaseManagerRegister( list->leaseManager, list->deadlineLease, list->actionId, v_public(list->actionObject), TRUE /* repeat lease if expired */); if(result != V_RESULT_OK) { c_free(list->deadlineLease); list->deadlineLease = NULL; OS_REPORT_1(OS_ERROR, "v_deadLineInstanceList", 0, "A fatal error was detected when trying to register the deadline lease." "The result code was %d.", result); } } } } }
void v_deadLineInstanceListUpdate( v_deadLineInstanceList list, v_instance instance) { assert(C_TYPECHECK(instance,v_instance)); assert(C_TYPECHECK(list,v_deadLineInstanceList)); assert(c_refCount(list) > 0); assert(c_refCount(instance) > 0); /* This will also place the current instance at the end of the list. Again no need to update the lease, we can determine the next wake-up as soon as the next deadlinecheck is performed. */ if (v_instanceAlone(instance)) { v_deadLineInstanceListInsertInstance(list,instance); } else { v_instanceRemove(instance); v_instanceUpdate(instance); /* Updates instance checkTime */ v_instanceAppend(v_instance(list), instance); } }