comparison pthread.c @ 8129:a9734fe0811e libavcodec

Making it easier to send arbitrary structures as work orders to MT workers
author romansh
date Wed, 12 Nov 2008 17:47:23 +0000
parents b0a566346fb1
children 09aafff47bc0
comparison
equal deleted inserted replaced
8128:e2241dd85c65 8129:a9734fe0811e
28 typedef int (action_t)(AVCodecContext *c, void *arg); 28 typedef int (action_t)(AVCodecContext *c, void *arg);
29 29
30 typedef struct ThreadContext { 30 typedef struct ThreadContext {
31 pthread_t *workers; 31 pthread_t *workers;
32 action_t *func; 32 action_t *func;
33 void **args; 33 void *args;
34 int *rets; 34 int *rets;
35 int rets_count; 35 int rets_count;
36 int job_count; 36 int job_count;
37 int job_size;
37 38
38 pthread_cond_t last_job_cond; 39 pthread_cond_t last_job_cond;
39 pthread_cond_t current_job_cond; 40 pthread_cond_t current_job_cond;
40 pthread_mutex_t current_job_lock; 41 pthread_mutex_t current_job_lock;
41 int current_job; 42 int current_job;
65 return NULL; 66 return NULL;
66 } 67 }
67 } 68 }
68 pthread_mutex_unlock(&c->current_job_lock); 69 pthread_mutex_unlock(&c->current_job_lock);
69 70
70 c->rets[our_job%c->rets_count] = c->func(avctx, c->args[our_job]); 71 c->rets[our_job%c->rets_count] = c->func(avctx, (char*)c->args + our_job*c->job_size);
71 72
72 pthread_mutex_lock(&c->current_job_lock); 73 pthread_mutex_lock(&c->current_job_lock);
73 our_job = c->current_job++; 74 our_job = c->current_job++;
74 } 75 }
75 } 76 }
98 pthread_cond_destroy(&c->last_job_cond); 99 pthread_cond_destroy(&c->last_job_cond);
99 av_free(c->workers); 100 av_free(c->workers);
100 av_freep(&avctx->thread_opaque); 101 av_freep(&avctx->thread_opaque);
101 } 102 }
102 103
103 int avcodec_thread_execute(AVCodecContext *avctx, action_t* func, void **arg, int *ret, int job_count) 104 int avcodec_thread_execute(AVCodecContext *avctx, action_t* func, void *arg, int *ret, int job_count, int job_size)
104 { 105 {
105 ThreadContext *c= avctx->thread_opaque; 106 ThreadContext *c= avctx->thread_opaque;
106 int dummy_ret; 107 int dummy_ret;
107 108
108 if (job_count <= 0) 109 if (job_count <= 0)
110 111
111 pthread_mutex_lock(&c->current_job_lock); 112 pthread_mutex_lock(&c->current_job_lock);
112 113
113 c->current_job = avctx->thread_count; 114 c->current_job = avctx->thread_count;
114 c->job_count = job_count; 115 c->job_count = job_count;
116 c->job_size = job_size;
115 c->args = arg; 117 c->args = arg;
116 c->func = func; 118 c->func = func;
117 if (ret) { 119 if (ret) {
118 c->rets = ret; 120 c->rets = ret;
119 c->rets_count = job_count; 121 c->rets_count = job_count;
145 147
146 avctx->thread_opaque = c; 148 avctx->thread_opaque = c;
147 avctx->thread_count = thread_count; 149 avctx->thread_count = thread_count;
148 c->current_job = 0; 150 c->current_job = 0;
149 c->job_count = 0; 151 c->job_count = 0;
152 c->job_size = 0;
150 c->done = 0; 153 c->done = 0;
151 pthread_cond_init(&c->current_job_cond, NULL); 154 pthread_cond_init(&c->current_job_cond, NULL);
152 pthread_cond_init(&c->last_job_cond, NULL); 155 pthread_cond_init(&c->last_job_cond, NULL);
153 pthread_mutex_init(&c->current_job_lock, NULL); 156 pthread_mutex_init(&c->current_job_lock, NULL);
154 pthread_mutex_lock(&c->current_job_lock); 157 pthread_mutex_lock(&c->current_job_lock);