--- ./source/private_module/range/rl_lib/rl_freeze.c	2018-12-02 02:40:58.000000000 +0800
+++ ./source/private_module/range/rl_lib/rl_freeze.c.hotpatch	2018-12-02 02:40:58.000000000 +0800
@@ -16,12 +16,12 @@
 
 #include "rl_internal.h"
 
-/************************************************************************
-    ܣִproxyԴĶᣬֻ޸Դ״̬
-Դ
-
-  ֵԶRETURN_OK
-************************************************************************/
+void rlDoProcessFreezingReqInPatch(DLMRL_RSC_S* rscProxy, DLMRL_ARG_FREEZED_S* farg,
+    struct list_head *need_callbacks, struct list_head *need_free);
+
+
+
+
 int32_t rlDoFreeze(DLMRL_RSC_S* rscProxy)
 {
     /* proxyʹstatestatemasterԴstateķʽͬע֡
@@ -51,27 +51,27 @@
     rlResendLock2MasterWhenUnfreeze(rscProxy);
 
     spin_unlock(&rscProxy->lock);
-    
-    spin_lock(&rscProxy->lockState);
 
-    rlSetFlag(rscProxy->state, DLMRL_RSC_STATE_HANDLE_FREQ);
+
 
     /* ڼɵ:ȡȨӦٻ */
     rlProcessFreezingReq(rscProxy);
 
-    rlClrFlag(rscProxy->state, DLMRL_RSC_STATE_HANDLE_FREQ);
 
     /* ǣҪڴ궳ǡ
        ΪĹУmasterϢҲܻյmasterӦ
        ҪȷڶϺٴmasterӦ */
-    rlClrFlag(rscProxy->state, DLMRL_RSC_STATE_FREEZING);
-    spin_unlock(&rscProxy->lockState);
 
     DLM_LOG(DBG_LOG_DEBUG, DLM_LOG_ID_RLOCK(1), "RL rsc %p unfreezed.", rscProxy);
     return RETURN_OK;
 }
 
 
+
+
+
+
+
 /************************************************************************/
 /* ڲӿ */
 /************************************************************************/
@@ -149,69 +149,69 @@
 
 #define MIN_LOCK 2000
 #define MS_TO_NS   1000000
-
-/************************************************************************
-    ܣⶳʱڼ󡣴ʱĴδʱȫһ
-proxyԴ
-
-  ֵ
-************************************************************************/
 void rlProcessFreezingReq(DLMRL_RSC_S* rscProxy)
 {
     struct list_head* pos = NULL;
     struct list_head* next = NULL;
+    struct list_head need_callbacks;
+    struct list_head need_free;
     DLMRL_ARG_FREEZED_S* farg = NULL;
     DLM_RL_ARG_S *rlArg = NULL;
     uint32_t count = 0;
     uint32_t cancelExpire = 0;
     uint64_t costTime = 0;
-
+    INIT_LIST_HEAD(&need_callbacks);
+    INIT_LIST_HEAD(&need_free);
+    spin_lock(&rscProxy->lockState);
+    rlSetFlag(rscProxy->state, DLMRL_RSC_STATE_HANDLE_FREQ);
     list_for_each_safe(pos, next, &rscProxy->statistics.data.dataProxy->hungReqList)
     {
         farg  = list_entry(pos, DLMRL_ARG_FREEZED_S, stHead);
         rlArg = rlFArg2Arg(farg);
         cancelExpire = rlArg->cancelExpire;
-
-        /* гʱʱ첽Ĵ:
-           1) ʣʱ򲻴, ȴгʱ, ; 
-           2) ʣʱ㹻³ʱʱ, ɾᳬʱtimer,  */
         if (!farg->isCopy && cancelExpire > 0)
         {
             costTime = LVOS_GetNanoSecond() - farg->lockStartTime;
-
-            /* 趨ĳʱʱ̫, ʣʱ̫ */
+            /* 趨ĳʱʱ̫, ʣ̫ */
             if ((cancelExpire < MIN_LOCK)
                 || (costTime > (uint64_t)(cancelExpire - MIN_LOCK) * MS_TO_NS))
             {
                 continue;
             }
-
             /* ɾᳬʱtimer, ɾʧܱʱtimerѾ볬ʱ, ʲٴ */
             if (RETURN_OK != rlReqAppDelAutoCancelTimerInFreeze(farg))
             {
                 continue;
             }
-
             /* ³ʱʱ */
             rlArg->cancelExpire -= (uint32_t)(costTime / MS_TO_NS);
         }
-
-        rlDoProcessFreezingReq(rscProxy, rlArg);
         count++;
         list_del(pos);
         rscProxy->statistics.data.dataProxy->numOfHungReq--;
+        rlDoProcessFreezingReqInPatch(rscProxy, farg, &need_callbacks, &need_free);
+    }
+    rlClrFlag(rscProxy->state, DLMRL_RSC_STATE_HANDLE_FREQ);
+    rlClrFlag(rscProxy->state, DLMRL_RSC_STATE_FREEZING);
+    spin_unlock(&rscProxy->lockState);
+    list_for_each_safe(pos, next, &need_callbacks)
+    {
+        farg = list_entry(pos, DLMRL_ARG_FREEZED_S, stHead);
+        list_del(pos);
+        rlArg = rlFArg2Arg(farg);
+        rlArg->result = RETURN_ERROR;
+        rlArg->complete(rlArg);
+        rlFArgDestroy(farg);
+    }
+    list_for_each_safe(pos, next, &need_free)
+    {
+        farg = list_entry(pos, DLMRL_ARG_FREEZED_S, stHead);
+        list_del(pos);
         rlFArgDestroy(farg);
     }
-
     DLM_LOG(DBG_LOG_DEBUG, DLM_LOG_ID_RLOCK(1), "RL %u freezed req handled.", count);
 }
 
-/************************************************************************
-    ܣһ
-proxyԴapp
-
-  ֵ
-************************************************************************/
 void rlDoProcessFreezingReq(DLMRL_RSC_S* rscProxy, DLM_RL_ARG_S* arg)
 {
     switch(arg->opCode)
@@ -275,4 +275,38 @@
     return RETURN_OK;
 }
 #endif
-
+void rlDoProcessFreezingReqInPatch(DLMRL_RSC_S* rscProxy, DLMRL_ARG_FREEZED_S* farg,
+    struct list_head *need_callbacks, struct list_head *need_free)
+{
+    int32_t rc;
+    DLM_RL_ARG_S *arg = rlFArg2Arg(farg);
+    switch(arg->opCode)
+    {
+        case DLM_OPCODE_LOCK:
+        case DLM_OPCODE_TEST:
+        case DLM_OPCODE_TRY:
+            rc = rlAPIProxyLock(rscProxy, arg);
+            if(rc != RETURN_OK)
+            {
+                if ( arg->complete != NULL) {
+                    list_add_tail(&farg->stHead, need_callbacks);
+                } else {
+                    list_add_tail(&farg->stHead, need_free);
+                }
+            }
+            break;
+        case DLM_OPCODE_LOOKUP:
+            (void)rlAPIProxyLock(rscProxy, arg);
+            list_add_tail(&farg->stHead, need_free);
+            break;
+        case DLM_OPCODE_UNLOCK:
+        case DLM_OPCODE_CANCEL:
+            (void)rlAPIProxyUnlock(rscProxy, arg);
+            list_add_tail(&farg->stHead, need_free);
+            break;
+        default:
+            DLM_LOG(DBG_LOG_ERROR, DLM_LOGID_CRI(DLM_LOGID_RL_402A), "RL Invalid opcode(%d) when handling freezed req.", arg->opCode);
+            list_add_tail(&farg->stHead, need_free);
+            break;
+    }
+}
