evas: fix evas_pipe and use eina_condition.

SVN revision: 59291
This commit is contained in:
Cedric BAIL 2011-05-09 11:05:04 +00:00
parent 849eea718d
commit b15093851e
5 changed files with 33 additions and 32 deletions

View File

@ -486,7 +486,7 @@ evas_common_font_memory_load(const char *name, int size, const void *data, int d
#ifdef EVAS_FRAME_QUEUING
LKI(fn->ref_fq_add);
LKI(fn->ref_fq_del);
pthread_cond_init(&(fn->cond_fq_del), NULL);
eina_condition_new(&(fn->cond_fq_del), &(fn->ref_fq_del));
#endif
if (fi->inuse) evas_common_font_int_promote(fi);
else
@ -550,7 +550,7 @@ evas_common_font_load(const char *name, int size, Font_Rend_Flags wanted_rend)
#ifdef EVAS_FRAME_QUEUING
LKI(fn->ref_fq_add);
LKI(fn->ref_fq_del);
pthread_cond_init(&(fn->cond_fq_del), NULL);
eina_condition_new(&(fn->cond_fq_del), &(fn->ref_fq_del));
#endif
if (fi->inuse) evas_common_font_int_promote(fi);
else
@ -643,7 +643,7 @@ evas_common_font_free(RGBA_Font *fn)
#ifdef EVAS_FRAME_QUEUING
LKD(fn->ref_fq_add);
LKD(fn->ref_fq_del);
pthread_cond_destroy(&(fn->cond_fq_del));
eina_condition_free(&(fn->cond_fq_del));
#endif
free(fn);
}

View File

@ -140,7 +140,8 @@ _evas_common_rgba_image_new(void)
#ifdef EVAS_FRAME_QUEUING
LKI(im->cache_entry.ref_fq_add);
LKI(im->cache_entry.ref_fq_del);
pthread_cond_init(&(im->cache_entry.cond_fq_del), NULL);
eina_condition_new(&(im->cache_entry.cond_fq_del),
&(im->cache_entry.ref_fq_del));
#endif
evas_common_rgba_image_scalecache_init(&im->cache_entry);
@ -158,7 +159,7 @@ _evas_common_rgba_image_delete(Image_Entry *ie)
# ifdef EVAS_FRAME_QUEUING
LKD(im->cache_entry.ref_fq_add);
LKD(im->cache_entry.ref_fq_del);
pthread_cond_destroy(&(im->cache_entry.cond_fq_del));
eina_condition_free(&(im->cache_entry.cond_fq_del));
# endif
#endif
evas_common_rgba_image_scalecache_shutdown(&im->cache_entry);

View File

@ -75,7 +75,7 @@ evas_common_frame_add(Evas_FrameQ *frameq, Evas_Frame *frame)
while ((int)eina_inlist_count(EINA_INLIST_GET(frameq->frames)) >= frameq->frameq_sz)
{
/* wait a worker thread finish previous frame */
pthread_cond_wait(&(frameq->cond_done), &(frameq->mutex));
eina_condition_wait(&(frameq->cond_done));
}
frameq->frames = (Evas_Frame *) eina_inlist_append(EINA_INLIST_GET(frameq->frames), EINA_INLIST_GET(frame));
@ -92,7 +92,7 @@ evas_common_frame_add(Evas_FrameQ *frameq, Evas_Frame *frame)
LKU(frameq->mutex);
pthread_cond_signal(&(frameq->cond_new));
eina_condition_signal(&(frameq->cond_new));
}
EAPI Evas_Surface *
@ -146,10 +146,10 @@ EAPI void
evas_common_frameq_init(void)
{
gframeq.frames = NULL;
pthread_cond_init(&(gframeq.cond_new), NULL);
pthread_cond_init(&(gframeq.cond_ready), NULL);
pthread_cond_init(&(gframeq.cond_done), NULL);
LKI(gframeq.mutex);
eina_condition_new(&(gframeq.cond_new), &(gframeq.mutex));
eina_condition_new(&(gframeq.cond_ready), &(gframeq.mutex));
eina_condition_new(&(gframeq.cond_done), &(gframeq.mutex));
gframeq.initialised = 0; // worker thread are not created yet
gframeq.frameq_sz = 1; // this value ensures the first frame can be enqueued.
}
@ -159,15 +159,13 @@ evas_common_frameq_destroy(void)
{
#if 0 // let them destroyed indirectly with program exit
LKL(gframeq.mutex);
pthread_cond_destroy(&(gframeq.cond_new));
pthread_cond_destroy(&(gframeq.cond_ready));
pthread_cond_destroy(&(gframeq.cond_done));
eina_condition_free(&(gframeq.cond_new));
eina_condition_free(&(gframeq.cond_ready));
eina_condition_free(&(gframeq.cond_done));
LKU(gframeq.mutex);
#endif
LKD(gframeq.mutex);
eina_threads_shutdown();
gframeq.frames = NULL;
gframeq.initialised = 0;
}
@ -182,7 +180,7 @@ evas_common_frameq_flush(void)
while(eina_inlist_count(EINA_INLIST_GET(gframeq.frames)) > 0)
{
/* wait a worker thread finish previous frame */
pthread_cond_wait(&(gframeq.cond_done), &(gframeq.mutex));
eina_condition_wait(&(gframeq.cond_done));
}
LKU(gframeq.mutex);
}
@ -362,7 +360,7 @@ evas_common_frameq_thread(void *data)
break;
}
pthread_testcancel();
pthread_cond_wait(&(frameq->cond_new), &(frameq->mutex));
eina_condition_wait(&(frameq->cond_new));
}
LKU(frameq->mutex);
@ -401,7 +399,7 @@ evas_common_frameq_thread(void *data)
LKL(frameq->mutex);
frame->ready = 1;
pthread_cond_signal(&frameq->cond_ready);
eina_condition_signal(&(frameq->cond_ready));
LKU(frameq->mutex);
}
@ -737,7 +735,7 @@ evas_common_frameq_thread_post(void *data)
LKL(frameq->mutex);
while(!frameq->frames || !frameq->frames->ready)
{
pthread_cond_wait(&(frameq->cond_ready), &(frameq->mutex));
eina_condition_wait(&(frameq->cond_ready));
}
frame = frameq->frames;
@ -787,7 +785,7 @@ evas_common_frameq_thread_post(void *data)
EINA_INLIST_GET(frame));
LKU(frameq->mutex);
pthread_cond_broadcast(&frameq->cond_done);
eina_condition_broadcast(&frameq->cond_done);
evas_common_frame_dealloc(frame);
}
@ -942,10 +940,10 @@ evas_common_frameq_finish(void)
/* 2. send signal to worker threads so that they enter to the thread cancelation cleanup handler */
for (i = 0; i < gframeq.thread_num; i++)
{
pthread_cond_signal(&(gframeq.cond_new));
eina_condition_signal(&(gframeq.cond_new));
}
// send signal to post-worker thread
pthread_cond_signal(&(gframeq.cond_ready));
eina_condition_signal(&(gframeq.cond_ready));
/* all the workers were created and detached before
* so don't need to join them here.
@ -1178,7 +1176,7 @@ evas_common_pipe_op_text_free(RGBA_Pipe_Op *op)
LKL(op->op.text.font->ref_fq_del);
op->op.text.font->ref_fq[1]++;
LKU(op->op.text.font->ref_fq_del);
pthread_cond_signal(&(op->op.text.font->cond_fq_del));
eina_condition_signal(&(op->op.text.font->cond_fq_del));
#else
evas_common_font_free(op->op.text.font);
#endif
@ -1198,7 +1196,7 @@ evas_common_pipe_op_text_flush(RGBA_Font *fn)
LKL(fn->ref_fq_del);
while (fn->ref_fq[0] != fn->ref_fq[1])
pthread_cond_wait(&(fn->cond_fq_del), &(fn->ref_fq_del));
eina_condition_wait(&(fn->cond_fq_del));
LKU(fn->ref_fq_del);
LKU(fn->ref_fq_add);
@ -1264,7 +1262,7 @@ evas_common_pipe_op_image_free(RGBA_Pipe_Op *op)
LKL(op->op.image.src->cache_entry.ref_fq_del);
op->op.image.src->cache_entry.ref_fq[1]++;
LKU(op->op.image.src->cache_entry.ref_fq_del);
pthread_cond_signal(&(op->op.image.src->cache_entry.cond_fq_del));
eina_condition_signal(&(op->op.image.src->cache_entry.cond_fq_del));
#else
op->op.image.src->ref--;
if (op->op.image.src->ref == 0)
@ -1286,7 +1284,7 @@ evas_common_pipe_op_image_flush(RGBA_Image *im)
LKL(im->cache_entry.ref_fq_del);
while (im->cache_entry.ref_fq[0] != im->cache_entry.ref_fq[1])
pthread_cond_wait(&(im->cache_entry.cond_fq_del), &(im->cache_entry.ref_fq_del));
eina_condition_wait(&(im->cache_entry.cond_fq_del));
LKU(im->cache_entry.ref_fq_del);
LKU(im->cache_entry.ref_fq_add);
@ -1568,7 +1566,7 @@ evas_common_pipe_map_render(RGBA_Image *root)
static Eina_List *task = NULL;
static Thinfo task_thinfo[TH_MAX];
static pthread_barrier_t task_thbarrier[2];
static LK(task_mutext) = PTHREAD_MUTEX_INITIALIZER;
static LK(task_mutext);
#endif
#ifdef BUILD_PTHREAD
@ -1641,6 +1639,8 @@ evas_common_pipe_init(void)
eina_threads_init();
LKI(task_mutext);
pthread_barrier_init(&(thbarrier[0]), NULL, thread_num + 1);
pthread_barrier_init(&(thbarrier[1]), NULL, thread_num + 1);
for (i = 0; i < thread_num; i++)

View File

@ -46,9 +46,9 @@ struct _Evas_FrameQ
{
int initialised;
Evas_Frame *frames;
pthread_cond_t cond_new;
pthread_cond_t cond_ready;
pthread_cond_t cond_done;
Eina_Condition cond_new;
Eina_Condition cond_ready;
Eina_Condition cond_done;
LK(mutex);
int thread_num;

View File

@ -552,7 +552,7 @@ struct _Image_Entry
#ifdef EVAS_FRAME_QUEUING
LK(ref_fq_add);
LK(ref_fq_del);
pthread_cond_t cond_fq_del;
Eina_Condition cond_fq_del;
int ref_fq[2]; // ref_fq[0] is for addition, ref_fq[1] is for deletion
#endif
#endif
@ -861,7 +861,7 @@ struct _RGBA_Font
int references;
#ifdef EVAS_FRAME_QUEUING
int ref_fq[2]; //ref_fq[0] is for addition, ref_fq[1] is for deletion
pthread_cond_t cond_fq_del;
Eina_Condition cond_fq_del;
LK(ref_fq_add);
LK(ref_fq_del);
#endif