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

ncd: don't start terminating template processes when requested to terminate; leave this responsibility
to their creators

ambrop7 14 лет назад
Родитель
Сommit
cab7ceacf8
2 измененных файлов с 15 добавлено и 35 удалено
  1. 6 34
      ncd/NCDModule.c
  2. 9 1
      ncd/ncd.c

+ 6 - 34
ncd/NCDModule.c

@@ -42,7 +42,6 @@
 #define PROCESS_STATE_DIE 4
 #define PROCESS_STATE_DEAD_PENDING 5
 #define PROCESS_STATE_DEAD 6
-#define PROCESS_STATE_ZOMBIE 7
 
 static void frontend_event (NCDModuleInst *n, int event)
 {
@@ -434,22 +433,10 @@ void NCDModuleProcess_Free (NCDModuleProcess *o)
 void NCDModuleProcess_Die (NCDModuleProcess *o)
 {
     DebugObject_Access(&o->d_obj);
+    ASSERT(o->state == PROCESS_STATE_NORMAL)
     
-    switch (o->state) {
-        case PROCESS_STATE_ZOMBIE: {
-            BPending_Set(&o->dead_job);
-            
-            o->state = PROCESS_STATE_DEAD_PENDING;
-        } break;
-        
-        case PROCESS_STATE_NORMAL: {
-            BPending_Set(&o->die_job);
-        
-            o->state = PROCESS_STATE_DIE_PENDING;
-        } break;
-        
-        default: ASSERT(0);
-    }
+    BPending_Set(&o->die_job);
+    o->state = PROCESS_STATE_DIE_PENDING;
 }
 
 void NCDModuleProcess_Interp_SetHandlers (NCDModuleProcess *o, void *interp_user, NCDModuleProcess_interp_handler_die interp_handler_die)
@@ -461,23 +448,8 @@ void NCDModuleProcess_Interp_SetHandlers (NCDModuleProcess *o, void *interp_user
 void NCDModuleProcess_Interp_Dead (NCDModuleProcess *o)
 {
     DebugObject_Access(&o->d_obj);
+    ASSERT(o->state == PROCESS_STATE_DIE)
     
-    switch (o->state) {
-        case PROCESS_STATE_NORMAL: {
-            o->state = PROCESS_STATE_ZOMBIE;
-        } break;
-        
-        case PROCESS_STATE_DIE_PENDING: {
-            BPending_Unset(&o->die_job);
-            BPending_Set(&o->dead_job);
-            o->state = PROCESS_STATE_DEAD_PENDING;
-        } break;
-        
-        case PROCESS_STATE_DIE: {
-            BPending_Set(&o->dead_job);
-            o->state = PROCESS_STATE_DEAD_PENDING;
-        } break;
-        
-        default: ASSERT(0);
-    }
+    BPending_Set(&o->dead_job);
+    o->state = PROCESS_STATE_DEAD_PENDING;
 }

+ 9 - 1
ncd/ncd.c

@@ -525,12 +525,15 @@ void signal_handler (void *unused)
         return;
     }
     
-    // start terminating all processes
+    // start terminating non-template processes
     LinkedList2Iterator it;
     LinkedList2Iterator_InitForward(&it, &processes);
     LinkedList2Node *n;
     while (n = LinkedList2Iterator_Next(&it)) {
         struct process *p = UPPER_OBJECT(n, struct process, list_node);
+        if (p->module_process) {
+            continue;
+        }
         process_start_teminating(p);
     }
 }
@@ -767,6 +770,7 @@ void process_free (struct process *p)
 {
     ASSERT(p->ap == 0)
     ASSERT(p->fp == 0)
+    ASSERT(p->terminating)
     
     // inform module process that the process is dead
     if (p->module_process) {
@@ -1410,7 +1414,11 @@ void process_statement_instance_logfunc (struct process_statement *ps)
 
 void process_moduleprocess_handler_die (struct process *p)
 {
+    ASSERT(p->module_process)
+    ASSERT(!p->terminating)
+    
     process_log(p, BLOG_INFO, "process termination requested");
     
+    // start terminating
     process_start_teminating(p);
 }