void v_serviceRenewLease( v_service service, os_duration leasePeriod) { assert(service != NULL); assert(C_TYPECHECK(service, v_service)); OSPL_LOCK(service); v_leaseRenew(service->lease, leasePeriod); OSPL_UNLOCK(service); }
void v_participantRenewLease( v_participant p, v_duration leasePeriod) { assert(p != NULL); assert(C_TYPECHECK(p, v_participant)); c_lockWrite(&p->lock); v_leaseRenew(p->lease, leasePeriod); c_lockUnlock(&p->lock); }
void v_serviceRenewLease( v_service service, v_duration leasePeriod) { assert(service != NULL); assert(C_TYPECHECK(service, v_service)); v_observerLock(v_observer(service)); v_leaseRenew(service->lease, &leasePeriod); v_observerUnlock(v_observer(service)); }
c_bool collectExpired( c_object o, c_voidp arg) { v_leaseAction leaseAction = v_leaseAction(o); struct collectExpiredArg *a = (struct collectExpiredArg *)arg; c_time headExpTime; c_time leaseExpTime; c_bool setHead; c_equality cmp; setHead = TRUE; leaseExpTime = v_leaseExpiryTime(leaseAction->lease); /* * A lease is expired if the expiry time is greater than or equal * to the current time! */ cmp = c_timeCompare(a->now, leaseExpTime); if ((cmp == C_GT) || (cmp == C_EQ)) { a->expiredLeases = c_iterInsert(a->expiredLeases, c_keep(leaseAction)); /* An expired lease can still become the next expirytime, * if it should be repeated */ if (leaseAction->repeat) { v_leaseRenew(leaseAction->lease, NULL); } else { setHead = FALSE; } } if (setHead) { if (a->firstLeaseToExpire == NULL) { a->firstLeaseToExpire = c_keep(leaseAction); } else { headExpTime = v_leaseExpiryTime(a->firstLeaseToExpire->lease); leaseExpTime = v_leaseExpiryTime(leaseAction->lease); if (c_timeCompare(headExpTime, leaseExpTime) == C_GT) { c_free(a->firstLeaseToExpire); a->firstLeaseToExpire = c_keep(leaseAction); } } } return TRUE; }
c_iter v_deadLineInstanceListCheckDeadlineMissed( v_deadLineInstanceList list, v_duration deadlineTime, c_time now) { c_time expiryTime; v_instance listItem; c_iter missed; assert(C_TYPECHECK(list,v_deadLineInstanceList)); missed = NULL; if (v_instanceAlone(v_instance(list))) { /* list is empty */ assert (list->deadlineLease != NULL); v_leaseManagerDeregister(list->leaseManager, list->deadlineLease); c_free(list->deadlineLease); list->deadlineLease = NULL; } else { listItem = v_instance(list)->prev; expiryTime = c_timeSub(now, deadlineTime); while ((listItem != NULL) && (v_objectKind(listItem) != K_DEADLINEINSTANCE) && (c_timeCompare(expiryTime, listItem->lastCheckTime) != C_LT)) { missed = c_iterInsert(missed, listItem); listItem->lastCheckTime = now; listItem = listItem->prev; } /* determine next wake-up time */ if (v_objectKind(listItem) == K_DEADLINEINSTANCE) { /* listItem is the deadline list itself, so if there * were instances all instances have been missed. Just * set the new check to be in 'deadlineTime'. */ expiryTime = deadlineTime; } else { /* * The new lease duration can be calculated: * lastCheckTime + deadlineTime = next expiry time * next expiry time - now = lease duration */ expiryTime = c_timeAdd(listItem->lastCheckTime, deadlineTime); expiryTime = c_timeSub(expiryTime, now); v_leaseRenew(list->deadlineLease, expiryTime); } } return missed; }
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); } } } } }