]> rtime.felk.cvut.cz Git - frescor/forb.git/blobdiff - src/executor.c
forb: Fix deadlock in executor
[frescor/forb.git] / src / executor.c
index 7e75eb8b33d8a0fe8b76faccfd13109343a106c3..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);
 
@@ -196,16 +201,10 @@ error:
 /**
  * Determines the executor we are currently in.
  *
- * @param executor Current executor pointer.
- *
- * @return Zero in case of success.
+ * @return Pointer to the current executor or NULL if not called
+ * within executor.
  */
-int forb_get_current_executor(forb_executor_t **executor)
+forb_executor_t *forb_get_current_executor(void)
 {
-       int ret = 0;
-       *executor = (void *) pthread_getspecific(forb_executor_key);
-                                           
-       if (!(*executor))
-               ret = 1;
-       return ret;
+       return pthread_getspecific(forb_executor_key);
 }