Просмотр исходного кода

ncd: NCDRequestClient: add NCDRequestClientRequest_Abort()

ambrop7 14 лет назад
Родитель
Сommit
b616ac4cf8
2 измененных файлов с 39 добавлено и 17 удалено
  1. 38 17
      ncd/NCDRequestClient.c
  2. 1 0
      ncd/NCDRequestClient.h

+ 38 - 17
ncd/NCDRequestClient.c

@@ -232,34 +232,31 @@ static void recv_if_handler_send (NCDRequestClient *o, uint8_t *data, int data_l
                 goto fail;
             }
             
+            NCDRequestClientRequest *creq = req->creq;
+            req->creq = NULL;
+            
             switch (req->state) {
                 case RSTATE_SENDING_ABORT: {
                     // set state dying send
                     req->state = RSTATE_DEAD_SENDING;
-                    return;
-                } break;
-                
-                case RSTATE_WAITING_END: {
-                    // free req
-                    req_free(req);
-                    return;
                 } break;
                 
+                case RSTATE_WAITING_END:
                 case RSTATE_READY: {
-                    NCDRequestClientRequest *creq = req->creq;
-                    
                     // free req
                     req_free(req);
-                    
-                    // report finished
-                    request_report_finished(creq, type == REQUESTPROTO_TYPE_SERVER_ERROR);
-                    return;
                 } break;
                 
                 default:
                     BLog(BLOG_ERROR, "received unexpected finished/aborted");
                     goto fail;
             }
+            
+            // report finished
+            if (creq) {
+                request_report_finished(creq, type == REQUESTPROTO_TYPE_SERVER_ERROR);
+            }
+            return;
         } break;
         
         default:
@@ -475,6 +472,7 @@ void NCDRequestClient_Free (NCDRequestClient *o)
         BAVLNode *tn;
         while (tn = BAVL_GetFirst(&o->reqs_tree)) {
             struct NCDRequestClient_req *req = UPPER_OBJECT(tn, struct NCDRequestClient_req, reqs_tree_node);
+            ASSERT(!req->creq)
             ASSERT(req->state != RSTATE_SENDING_REQUEST)
             ASSERT(req->state != RSTATE_READY)
             req_free(req);
@@ -569,13 +567,16 @@ fail0:
 
 void NCDRequestClientRequest_Free (NCDRequestClientRequest *o)
 {
-    NCDRequestClient *client = o->client;
     struct NCDRequestClient_req *req = o->req;
     DebugObject_Free(&o->d_obj);
     DebugError_Free(&o->d_err);
-    DebugCounter_Decrement(&client->d_reqests_ctr);
+    DebugCounter_Decrement(&o->client->d_reqests_ctr);
     
     if (req) {
+        ASSERT(req->creq == o)
+        
+        req->creq = NULL;
+        
         switch (req->state) {
             case RSTATE_SENDING_REQUEST: {
                 req->state = RSTATE_SENDING_REQUEST_ABORT;
@@ -584,8 +585,28 @@ void NCDRequestClientRequest_Free (NCDRequestClientRequest *o)
             case RSTATE_READY: {
                 req_send_abort(req);
             } break;
-            
-            default: ASSERT(0);
         }
     }
 }
+
+void NCDRequestClientRequest_Abort (NCDRequestClientRequest *o)
+{
+    struct NCDRequestClient_req *req = o->req;
+    DebugObject_Access(&o->d_obj);
+    DebugError_AssertNoError(&o->d_err);
+    
+    ASSERT(req)
+    ASSERT(req->creq == o)
+    
+    switch (req->state) {
+        case RSTATE_SENDING_REQUEST: {
+            req->state = RSTATE_SENDING_REQUEST_ABORT;
+        } break;
+        
+        case RSTATE_READY: {
+            req_send_abort(req);
+        } break;
+        
+        default: ASSERT(0);
+    }
+}

+ 1 - 0
ncd/NCDRequestClient.h

@@ -104,5 +104,6 @@ int NCDRequestClientRequest_Init (NCDRequestClientRequest *o, NCDRequestClient *
                                   NCDRequestClientRequest_handler_reply handler_reply,
                                   NCDRequestClientRequest_handler_finished handler_finished) WARN_UNUSED;
 void NCDRequestClientRequest_Free (NCDRequestClientRequest *o);
+void NCDRequestClientRequest_Abort (NCDRequestClientRequest *o);
 
 #endif