History

pthread: Avoid crashes/odd behavior caused by spurious wakeups

This is similar to 5152196b2b47d446d9a509b9bfb318daa26a1f2b.

Derek Buitenhuis committed 13 years ago

Commit 3511d4f1 parent 157dc0b1 file · +8 −2Browse files

Unified · Split

libavfilter/pthread.c+8−2
@@ -56,6 +56,7 @@ typedef struct ThreadContext { · 55 unmodified lines
56 pthread_cond_t current_job_cond;56 pthread_cond_t current_job_cond;
57 pthread_mutex_t current_job_lock;57 pthread_mutex_t current_job_lock;
58 int current_job;58 int current_job;
59 unsigned int current_execute;
59 int done;60 int done;
60} ThreadContext;61} ThreadContext;
61 62
@@ -64,6 +65,7 @@ static void* attribute_align_arg worker(void *v) · 2 unmodified lines
64 ThreadContext *c = v;65 ThreadContext *c = v;
65 int our_job = c->nb_jobs;66 int our_job = c->nb_jobs;
66 int nb_threads = c->nb_threads;67 int nb_threads = c->nb_threads;
68 unsigned int last_execute = 0;
67 int self_id;69 int self_id;
68 70
69 pthread_mutex_lock(&c->current_job_lock);71 pthread_mutex_lock(&c->current_job_lock);
@@ -73,8 +75,9 @@ static void* attribute_align_arg worker(void *v) · 3 unmodified lines
73 if (c->current_job == nb_threads + c->nb_jobs)75 if (c->current_job == nb_threads + c->nb_jobs)
74 pthread_cond_signal(&c->last_job_cond);76 pthread_cond_signal(&c->last_job_cond);
75 77
76 if (!c->done)78 while (last_execute == c->current_execute && !c->done)
77 pthread_cond_wait(&c->current_job_cond, &c->current_job_lock);79 pthread_cond_wait(&c->current_job_cond, &c->current_job_lock);
80 last_execute = c->current_execute;
78 our_job = self_id;81 our_job = self_id;
79 82
80 if (c->done) {83 if (c->done) {
@@ -111,7 +114,8 @@ static void slice_thread_uninit(ThreadContext *c) · 30 unmodified lines
111 114
112static void slice_thread_park_workers(ThreadContext *c)115static void slice_thread_park_workers(ThreadContext *c)
113{116{
114 pthread_cond_wait(&c->last_job_cond, &c->current_job_lock);117 while (c->current_job != c->nb_threads + c->nb_jobs)
118 pthread_cond_wait(&c->last_job_cond, &c->current_job_lock);
115 pthread_mutex_unlock(&c->current_job_lock);119 pthread_mutex_unlock(&c->current_job_lock);
116}120}
117 121
@@ -138,6 +142,8 @@ static int thread_execute(AVFilterContext *ctx, avfilter_action_func *func, · 20 unmodified lines
138 c->rets = &dummy_ret;142 c->rets = &dummy_ret;
139 c->nb_rets = 1;143 c->nb_rets = 1;
140 }144 }
145 c->current_execute++;
146
141 pthread_cond_broadcast(&c->current_job_cond);147 pthread_cond_broadcast(&c->current_job_cond);
142 148
143 slice_thread_park_workers(c);149 slice_thread_park_workers(c);

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t