]> rtime.felk.cvut.cz Git - frescor/forb.git/commitdiff
Destroy forb in the correct order
authorMichal Sojka <sojkam1@fel.cvut.cz>
Thu, 24 Feb 2011 15:58:36 +0000 (16:58 +0100)
committerMichal Sojka <sojkam1@fel.cvut.cz>
Thu, 24 Feb 2011 15:58:36 +0000 (16:58 +0100)
This is to avoid deadlocks during forb_destroy().

src/forb.c

index 79759dad948213d0dc3f15231c243d9983df43c3..376651f44c269482d91d28848ae54e1223cf2bbf 100644 (file)
@@ -300,6 +300,22 @@ void forb_destroy(forb_orb orb)
        forb_t *forb = forb_object_to_forb(orb);
        forb_port_t *port;
        forb_regref_t *regref;
+       forb_object obj;
+
+       /* Destroy ports to prevent remote requests from coming */
+       ul_list_for_each_cut(forb_port, forb, port) {
+               forb_destroy_port(port);
+       }
+
+       /* Wait for executors to finish all requests (and thus close
+        * connections to peers). This is very inefficient for big
+        * number of objects, but we do not care */
+       gavl_cust_for_each(forb_objects_nolock, forb, obj) {
+               forb_executor_t *executor;
+               executor = forb_object_get_executor(obj);
+               if (executor)
+                       forb_executor_synchronize(executor);
+       }
 
        pthread_cancel(forb->execution_thread.pthread_id);
        pthread_join(forb->execution_thread.pthread_id, NULL);
@@ -309,9 +325,6 @@ void forb_destroy(forb_orb orb)
                forb_unregister_reference(orb, regref->name.str);
        }
        
-       ul_list_for_each_cut(forb_port, forb, port) {
-               forb_destroy_port(port);
-       }
        forb_object_release(orb);
        forb_free(forb);
 }