]> rtime.felk.cvut.cz Git - frescor/forb.git/commitdiff
forb: Fix deadlock in executor
authorMichal Sojka <sojkam1@fel.cvut.cz>
Sat, 19 Feb 2011 22:57:48 +0000 (23:57 +0100)
committerMichal Sojka <sojkam1@fel.cvut.cz>
Sat, 19 Feb 2011 22:57:48 +0000 (23:57 +0100)
The first iteration of executor loop waited for the request without
actually checking that there is no request in the queue. Therefore,
when the client sent the request before the executor called
fosa_cond_wait()  for the first time, the executor blocked indefinitely.

src/executor.c

index 55c240f4be65ba3ff7f63c77883fc87e047ca4bb..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: