]> rtime.felk.cvut.cz Git - frescor/forb.git/blobdiff - src/executor.c
forb: Fix deadlock in executor
[frescor/forb.git] / src / executor.c
index 7af1923975a17d4e479a24ddbbb21c66ae4f1816..08e00680f448689f782d1b8b68cd167a3484cc96 100644 (file)
@@ -150,8 +150,6 @@ int forb_executor_run(forb_executor_t *executor)
        
        fosa_mutex_lock(&executor->mutex);
        while (1) {
-               fosa_cond_wait(&executor->new_request_in_empty_list,
-                              &executor->mutex);
                while (!forb_exec_req_nolock_is_empty(executor)) {
                        forb_exec_req_t *exec_req;
                        exec_req = forb_exec_req_nolock_cut_first(executor);
@@ -161,6 +159,8 @@ int forb_executor_run(forb_executor_t *executor)
 
                        fosa_mutex_lock(&executor->mutex);
                }
+               fosa_cond_wait(&executor->new_request_in_empty_list,
+                              &executor->mutex);
        }
        fosa_mutex_unlock(&executor->mutex);
 ret:   
@@ -169,6 +169,8 @@ ret:
 
 /** 
  * Convenience function for executing only one object in one executor.
+ * This function calls forb_signal_server_ready() at the appropriate
+ * place.
  * 
  * @param obj The object to execute.
  * 
@@ -183,6 +185,9 @@ int forb_execute_object(forb_object obj)
        if (ret) goto error;
        ret = forb_executor_register_object(&executor, obj);
        if (ret) goto destroy_and_error;
+
+       ret = forb_signal_server_ready(obj->orb);
+       if (ret) goto destroy_and_error;
        
        ret = forb_executor_run(&executor);