aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFredrik Holmqvist <fredrik.holmqvist@gmail.com>2012-07-31 20:44:01 +0200
committerFredrik Holmqvist <fredrik.holmqvist@gmail.com>2012-07-31 20:51:02 +0200
commit57e2ce542e59a69f405a60f1ab7a3e0e54e4f6a2 (patch)
tree8becb5044e30b9d3f36a0d1dd8f474e4024e2ace
parent66f16cca0a9ce2084680038f2fa0c3aa2649700b (diff)
CID-701956: list_remove_head_item may return null.hrev44449
Simplified from while (1) to while that checks sem directly.
-rw-r--r--src/libs/compat/freebsd_network/taskqueue.c12
1 files changed, 5 insertions, 7 deletions
diff --git a/src/libs/compat/freebsd_network/taskqueue.c b/src/libs/compat/freebsd_network/taskqueue.c
index 10b03bf104..b4cf6d1c35 100644
--- a/src/libs/compat/freebsd_network/taskqueue.c
+++ b/src/libs/compat/freebsd_network/taskqueue.c
@@ -116,16 +116,14 @@ tq_handle_thread(void *data)
sem = tq->tq_sem;
tq_unlock(tq, cpu_state);
- while (1) {
- status_t status = acquire_sem(sem);
- if (status < B_OK)
- break;
-
+ while (acquire_sem(sem) == B_NO_ERROR) {
tq_lock(tq, &cpu_state);
t = list_remove_head_item(&tq->tq_list);
+ tq_unlock(tq, cpu_state);
+ if (t == NULL)
+ continue;
pending = t->ta_pending;
t->ta_pending = 0;
- tq_unlock(tq, cpu_state);
t->ta_handler(t->ta_argument, pending);
}
@@ -319,7 +317,7 @@ init_taskqueues()
return B_NO_MEMORY;
status = taskqueue_start_threads(&taskqueue_fast, 1,
- B_REAL_TIME_PRIORITY, "fast taskq");
+ B_REAL_TIME_PRIORITY, "fast taskq thread");
if (status < B_OK)
goto err_1;
}