--- ./source/private_module/framework/lib/dlm_common.c	2018-12-02 02:40:58.000000000 +0800
+++ ./source/private_module/framework/lib/dlm_common.c.hotpatch	2018-12-02 02:40:58.000000000 +0800
@@ -484,7 +484,7 @@
     }
 
     cap = &g_dlmModuleCapability.rangeCaps[nameSpace].caps[capItem];
-    DLM_LOG(DBG_LOG_DEBUG, DLM_LOG_ID_CORE(1), "DlmCap, check specication, nameSpace(%d) capType(%d) capItem(%d) spec(%llu) stat(%llu).",
+    DLM_LOG(DBG_LOG_DEBUG, DLM_LOG_ID_CORE(1), "DlmCap, check specication, nameSpace(%d) capType(%d) capItem(%d) spec(%llu) stat(%llu)..",
             nameSpace, capType, capItem, cap->maxSpec, userStat);
 
     if (userStat >= cap->maxSpec)
@@ -614,26 +614,26 @@
     lifecycle->expectMax = lifecycle->expectMax > expectTime ? lifecycle->expectMax : expectTime;
     lifecycle->expectTotal += expectTime;
     /* ĬֵΪ0һֱӶСֵֵ*/
-    if (lifecycle->expectMin == 0)
+    if (lifecycle->expectMin == 0 || lifecycle->expectMin > expectTime)
     {
         lifecycle->expectMin = expectTime;
     }
-    else
-    {
-        lifecycle->expectMin = lifecycle->expectMin < expectTime ? lifecycle->expectMin : expectTime;
-    }
+
+
+
+
 
     lifecycle->realMax = lifecycle->realMax > realTime ? lifecycle->realMax : realTime;
     lifecycle->realTotal += realTime;
     /* ĬֵΪ0һֱӶСֵֵ*/
-    if (lifecycle->realMin == 0)
+    if (lifecycle->realMin == 0 || lifecycle->realMin > realTime)
     {
         lifecycle->realMin = realTime;
     }
-    else
-    {
-        lifecycle->realMin = lifecycle->realMin < realTime ? lifecycle->realMin : realTime;
-    }
+
+
+
+
     
     lifecycle->destroyNumber++;
     spin_unlock(&lifecycle->lock);
@@ -756,4 +756,95 @@
 EXPORT_SYMBOL(dlmDestroyProxyStat);
 
 #endif /*DESC("ӿ")*/
+bool dlmCapabilitySpecCheckOverflowWithPercent(DLM_RES_NAMESPACE_E nameSpace, DLM_CAPABILITY_TYPE_E capType,
+    DLM_RANGELOCK_CAPABILITY_ITEM_E capItem, DLM_RANGELOCK_CAPABILITY_CHECK_RESULT_E* checkResult, uint32_t percent)
+{
+    bool ret = B_FALSE;
+    DLM_COMMON_CAPABILITY_S* cap = NULL;
+    int64_t usedCount = 0;
+    uint64_t maxSpec = 0ULL;
+
+    UNREFERENCE_PARAM(capType);
+    if ((DLM_RES_NAMESPACE_BUTT <= nameSpace) ||
+        (DLM_RES_NAMESPACE_DEFAULT > nameSpace) ||
+        (DLM_RANGELOCK_CAPABILITY_ITEM_BUTT <= capItem)
+        || percent > 100)
+    {
+        DLM_LOG_LIMITED(600 * HZ, 1, DBG_LOG_ERROR, DLM_LOG_ID_CORE(1), "DlmCap, invalid param, nameSpace(%d) capType(%d) capItem(%d), percent(%u).",
+                               nameSpace, capType, capItem, percent);
+        return B_TRUE;
+    }
+    cap = &g_dlmModuleCapability.rangeCaps[nameSpace].caps[capItem];
+    usedCount = (int64_t)atomic64_read(&cap->usedCount);
+    DLM_LOG(DBG_LOG_DEBUG, DLM_LOG_ID_CORE(1), "DlmCap, check specication, nameSpace(%d) capType(%d) capItem(%d) curValue(%lld) spec(%llu).",
+            nameSpace, capType, capItem, usedCount, cap->maxSpec);
+    maxSpec = cap->maxSpec * percent / 100;
+    if ((usedCount >= 0) &&
+        ((uint64_t)usedCount >= maxSpec))
+    {
+        DLM_LOG_LIMITED(30 * HZ, 1, DBG_LOG_ERROR, DLM_LOG_ID_CORE(1), "DlmCap, beyound spec, nameSpace(%d) capType(%d) capItem(%d) curValue(%lld) spec(%llu).",
+            nameSpace, capType, capItem, (int64_t)atomic64_read(&cap->usedCount), cap->maxSpec);
+        ret = B_TRUE;
+    }
+    LVOS_TP_START(DLM_SPEC_1_602_2_1, &ret, B_TRUE)
+    LVOS_TP_END
+    if (NULL != checkResult)
+    {
+        *checkResult = (!ret) ? DLM_RANGELOCK_CAPABILITY_CHECK_RESULT_BELOW :
+                       ((uint64_t)usedCount == cap->maxSpec) ? DLM_RANGELOCK_CAPABILITY_CHECK_RESULT_EQUAL :
+                       DLM_RANGELOCK_CAPABILITY_CHECK_RESULT_ABOVE;
+    }
+    return ret;
+}
+
+
+bool dlmCapabilitySpecCheckAboutToOverflow(DLM_RES_NAMESPACE_E nameSpace, DLM_CAPABILITY_TYPE_E capType,
+    DLM_RANGELOCK_CAPABILITY_ITEM_E capItem, DLM_RANGELOCK_CAPABILITY_CHECK_RESULT_E* checkResult, uint32_t number)
+{
+    bool ret = B_FALSE;
+    DLM_COMMON_CAPABILITY_S* cap = NULL;
+    int64_t usedCount = 0;
+    uint64_t maxSpec = 0ULL;
+
+    UNREFERENCE_PARAM(capType);
+
+    if ((DLM_RES_NAMESPACE_BUTT <= nameSpace) ||
+        (DLM_RES_NAMESPACE_DEFAULT > nameSpace) ||
+        (DLM_RANGELOCK_CAPABILITY_ITEM_BUTT <= capItem))
+    {
+        DLM_LOG_LIMITED(600 * HZ, 1, DBG_LOG_ERROR, DLM_LOG_ID_CORE(1), "DlmCap, invalid param, nameSpace(%d) capType(%d) capItem(%d), number(%u).",
+                               nameSpace, capType, capItem, number);
+        return B_TRUE;
+    }
+
+    cap = &g_dlmModuleCapability.rangeCaps[nameSpace].caps[capItem];
+    usedCount = (int64_t)atomic64_read(&cap->usedCount);
+    DLM_LOG(DBG_LOG_DEBUG, DLM_LOG_ID_CORE(1), "DlmCap, check specication, nameSpace(%d) capType(%d) capItem(%d) curValue(%lld) spec(%llu) number(%u).",
+            nameSpace, capType, capItem, usedCount, cap->maxSpec, number);
+
+    // maxSpecʹõu64, percentֵ100, ıʽ
+    // һԽ
+    maxSpec = cap->maxSpec;
+    if ((usedCount >= 0) &&
+        ((uint64_t)usedCount + number >= maxSpec))
+    {
+        DLM_LOG_LIMITED(30 * HZ, 1, DBG_LOG_ERROR, DLM_LOG_ID_CORE(1), "DlmCap, beyound spec, nameSpace(%d) capType(%d) capItem(%d) curValue(%lld) spec(%llu).",
+            nameSpace, capType, capItem, (int64_t)atomic64_read(&cap->usedCount), cap->maxSpec);
+        ret = B_TRUE;
+    }
+
+    LVOS_TP_START(DLM_SPEC_1_602_2_1, &ret, B_TRUE)
+    LVOS_TP_END
+
+    /*ע,tpֻԷֵЧ*/
+    if (NULL != checkResult)
+    {
+        *checkResult = (!ret) ? DLM_RANGELOCK_CAPABILITY_CHECK_RESULT_BELOW :
+                       ((uint64_t)usedCount == cap->maxSpec) ? DLM_RANGELOCK_CAPABILITY_CHECK_RESULT_EQUAL :
+                       DLM_RANGELOCK_CAPABILITY_CHECK_RESULT_ABOVE;
+    }
+
+    return ret;
+}
 
+EXPORT_SYMBOL(dlmCapabilitySpecCheckAboutToOverflow);
\ No newline at end of file
