forked from enlightenment/efl
evas: fix evas_pipe and use eina_condition.
SVN revision: 59291
This commit is contained in:
parent
849eea718d
commit
b15093851e
|
@ -486,7 +486,7 @@ evas_common_font_memory_load(const char *name, int size, const void *data, int d
|
||||||
#ifdef EVAS_FRAME_QUEUING
|
#ifdef EVAS_FRAME_QUEUING
|
||||||
LKI(fn->ref_fq_add);
|
LKI(fn->ref_fq_add);
|
||||||
LKI(fn->ref_fq_del);
|
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
|
#endif
|
||||||
if (fi->inuse) evas_common_font_int_promote(fi);
|
if (fi->inuse) evas_common_font_int_promote(fi);
|
||||||
else
|
else
|
||||||
|
@ -550,7 +550,7 @@ evas_common_font_load(const char *name, int size, Font_Rend_Flags wanted_rend)
|
||||||
#ifdef EVAS_FRAME_QUEUING
|
#ifdef EVAS_FRAME_QUEUING
|
||||||
LKI(fn->ref_fq_add);
|
LKI(fn->ref_fq_add);
|
||||||
LKI(fn->ref_fq_del);
|
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
|
#endif
|
||||||
if (fi->inuse) evas_common_font_int_promote(fi);
|
if (fi->inuse) evas_common_font_int_promote(fi);
|
||||||
else
|
else
|
||||||
|
@ -643,7 +643,7 @@ evas_common_font_free(RGBA_Font *fn)
|
||||||
#ifdef EVAS_FRAME_QUEUING
|
#ifdef EVAS_FRAME_QUEUING
|
||||||
LKD(fn->ref_fq_add);
|
LKD(fn->ref_fq_add);
|
||||||
LKD(fn->ref_fq_del);
|
LKD(fn->ref_fq_del);
|
||||||
pthread_cond_destroy(&(fn->cond_fq_del));
|
eina_condition_free(&(fn->cond_fq_del));
|
||||||
#endif
|
#endif
|
||||||
free(fn);
|
free(fn);
|
||||||
}
|
}
|
||||||
|
|
|
@ -140,7 +140,8 @@ _evas_common_rgba_image_new(void)
|
||||||
#ifdef EVAS_FRAME_QUEUING
|
#ifdef EVAS_FRAME_QUEUING
|
||||||
LKI(im->cache_entry.ref_fq_add);
|
LKI(im->cache_entry.ref_fq_add);
|
||||||
LKI(im->cache_entry.ref_fq_del);
|
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
|
#endif
|
||||||
|
|
||||||
evas_common_rgba_image_scalecache_init(&im->cache_entry);
|
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
|
# ifdef EVAS_FRAME_QUEUING
|
||||||
LKD(im->cache_entry.ref_fq_add);
|
LKD(im->cache_entry.ref_fq_add);
|
||||||
LKD(im->cache_entry.ref_fq_del);
|
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
|
||||||
#endif
|
#endif
|
||||||
evas_common_rgba_image_scalecache_shutdown(&im->cache_entry);
|
evas_common_rgba_image_scalecache_shutdown(&im->cache_entry);
|
||||||
|
|
|
@ -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)
|
while ((int)eina_inlist_count(EINA_INLIST_GET(frameq->frames)) >= frameq->frameq_sz)
|
||||||
{
|
{
|
||||||
/* wait a worker thread finish previous frame */
|
/* 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));
|
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);
|
LKU(frameq->mutex);
|
||||||
|
|
||||||
pthread_cond_signal(&(frameq->cond_new));
|
eina_condition_signal(&(frameq->cond_new));
|
||||||
}
|
}
|
||||||
|
|
||||||
EAPI Evas_Surface *
|
EAPI Evas_Surface *
|
||||||
|
@ -146,10 +146,10 @@ EAPI void
|
||||||
evas_common_frameq_init(void)
|
evas_common_frameq_init(void)
|
||||||
{
|
{
|
||||||
gframeq.frames = NULL;
|
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);
|
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.initialised = 0; // worker thread are not created yet
|
||||||
gframeq.frameq_sz = 1; // this value ensures the first frame can be enqueued.
|
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
|
#if 0 // let them destroyed indirectly with program exit
|
||||||
LKL(gframeq.mutex);
|
LKL(gframeq.mutex);
|
||||||
pthread_cond_destroy(&(gframeq.cond_new));
|
eina_condition_free(&(gframeq.cond_new));
|
||||||
pthread_cond_destroy(&(gframeq.cond_ready));
|
eina_condition_free(&(gframeq.cond_ready));
|
||||||
pthread_cond_destroy(&(gframeq.cond_done));
|
eina_condition_free(&(gframeq.cond_done));
|
||||||
LKU(gframeq.mutex);
|
LKU(gframeq.mutex);
|
||||||
#endif
|
#endif
|
||||||
LKD(gframeq.mutex);
|
LKD(gframeq.mutex);
|
||||||
|
|
||||||
eina_threads_shutdown();
|
|
||||||
|
|
||||||
gframeq.frames = NULL;
|
gframeq.frames = NULL;
|
||||||
gframeq.initialised = 0;
|
gframeq.initialised = 0;
|
||||||
}
|
}
|
||||||
|
@ -182,7 +180,7 @@ evas_common_frameq_flush(void)
|
||||||
while(eina_inlist_count(EINA_INLIST_GET(gframeq.frames)) > 0)
|
while(eina_inlist_count(EINA_INLIST_GET(gframeq.frames)) > 0)
|
||||||
{
|
{
|
||||||
/* wait a worker thread finish previous frame */
|
/* wait a worker thread finish previous frame */
|
||||||
pthread_cond_wait(&(gframeq.cond_done), &(gframeq.mutex));
|
eina_condition_wait(&(gframeq.cond_done));
|
||||||
}
|
}
|
||||||
LKU(gframeq.mutex);
|
LKU(gframeq.mutex);
|
||||||
}
|
}
|
||||||
|
@ -362,7 +360,7 @@ evas_common_frameq_thread(void *data)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
pthread_testcancel();
|
pthread_testcancel();
|
||||||
pthread_cond_wait(&(frameq->cond_new), &(frameq->mutex));
|
eina_condition_wait(&(frameq->cond_new));
|
||||||
}
|
}
|
||||||
LKU(frameq->mutex);
|
LKU(frameq->mutex);
|
||||||
|
|
||||||
|
@ -401,7 +399,7 @@ evas_common_frameq_thread(void *data)
|
||||||
|
|
||||||
LKL(frameq->mutex);
|
LKL(frameq->mutex);
|
||||||
frame->ready = 1;
|
frame->ready = 1;
|
||||||
pthread_cond_signal(&frameq->cond_ready);
|
eina_condition_signal(&(frameq->cond_ready));
|
||||||
LKU(frameq->mutex);
|
LKU(frameq->mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -737,7 +735,7 @@ evas_common_frameq_thread_post(void *data)
|
||||||
LKL(frameq->mutex);
|
LKL(frameq->mutex);
|
||||||
while(!frameq->frames || !frameq->frames->ready)
|
while(!frameq->frames || !frameq->frames->ready)
|
||||||
{
|
{
|
||||||
pthread_cond_wait(&(frameq->cond_ready), &(frameq->mutex));
|
eina_condition_wait(&(frameq->cond_ready));
|
||||||
}
|
}
|
||||||
frame = frameq->frames;
|
frame = frameq->frames;
|
||||||
|
|
||||||
|
@ -787,7 +785,7 @@ evas_common_frameq_thread_post(void *data)
|
||||||
EINA_INLIST_GET(frame));
|
EINA_INLIST_GET(frame));
|
||||||
|
|
||||||
LKU(frameq->mutex);
|
LKU(frameq->mutex);
|
||||||
pthread_cond_broadcast(&frameq->cond_done);
|
eina_condition_broadcast(&frameq->cond_done);
|
||||||
evas_common_frame_dealloc(frame);
|
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 */
|
/* 2. send signal to worker threads so that they enter to the thread cancelation cleanup handler */
|
||||||
for (i = 0; i < gframeq.thread_num; i++)
|
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
|
// 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
|
/* all the workers were created and detached before
|
||||||
* so don't need to join them here.
|
* 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);
|
LKL(op->op.text.font->ref_fq_del);
|
||||||
op->op.text.font->ref_fq[1]++;
|
op->op.text.font->ref_fq[1]++;
|
||||||
LKU(op->op.text.font->ref_fq_del);
|
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
|
#else
|
||||||
evas_common_font_free(op->op.text.font);
|
evas_common_font_free(op->op.text.font);
|
||||||
#endif
|
#endif
|
||||||
|
@ -1198,7 +1196,7 @@ evas_common_pipe_op_text_flush(RGBA_Font *fn)
|
||||||
LKL(fn->ref_fq_del);
|
LKL(fn->ref_fq_del);
|
||||||
|
|
||||||
while (fn->ref_fq[0] != fn->ref_fq[1])
|
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_del);
|
||||||
LKU(fn->ref_fq_add);
|
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);
|
LKL(op->op.image.src->cache_entry.ref_fq_del);
|
||||||
op->op.image.src->cache_entry.ref_fq[1]++;
|
op->op.image.src->cache_entry.ref_fq[1]++;
|
||||||
LKU(op->op.image.src->cache_entry.ref_fq_del);
|
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
|
#else
|
||||||
op->op.image.src->ref--;
|
op->op.image.src->ref--;
|
||||||
if (op->op.image.src->ref == 0)
|
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);
|
LKL(im->cache_entry.ref_fq_del);
|
||||||
|
|
||||||
while (im->cache_entry.ref_fq[0] != im->cache_entry.ref_fq[1])
|
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_del);
|
||||||
LKU(im->cache_entry.ref_fq_add);
|
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 Eina_List *task = NULL;
|
||||||
static Thinfo task_thinfo[TH_MAX];
|
static Thinfo task_thinfo[TH_MAX];
|
||||||
static pthread_barrier_t task_thbarrier[2];
|
static pthread_barrier_t task_thbarrier[2];
|
||||||
static LK(task_mutext) = PTHREAD_MUTEX_INITIALIZER;
|
static LK(task_mutext);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef BUILD_PTHREAD
|
#ifdef BUILD_PTHREAD
|
||||||
|
@ -1641,6 +1639,8 @@ evas_common_pipe_init(void)
|
||||||
|
|
||||||
eina_threads_init();
|
eina_threads_init();
|
||||||
|
|
||||||
|
LKI(task_mutext);
|
||||||
|
|
||||||
pthread_barrier_init(&(thbarrier[0]), NULL, thread_num + 1);
|
pthread_barrier_init(&(thbarrier[0]), NULL, thread_num + 1);
|
||||||
pthread_barrier_init(&(thbarrier[1]), NULL, thread_num + 1);
|
pthread_barrier_init(&(thbarrier[1]), NULL, thread_num + 1);
|
||||||
for (i = 0; i < thread_num; i++)
|
for (i = 0; i < thread_num; i++)
|
||||||
|
|
|
@ -46,9 +46,9 @@ struct _Evas_FrameQ
|
||||||
{
|
{
|
||||||
int initialised;
|
int initialised;
|
||||||
Evas_Frame *frames;
|
Evas_Frame *frames;
|
||||||
pthread_cond_t cond_new;
|
Eina_Condition cond_new;
|
||||||
pthread_cond_t cond_ready;
|
Eina_Condition cond_ready;
|
||||||
pthread_cond_t cond_done;
|
Eina_Condition cond_done;
|
||||||
LK(mutex);
|
LK(mutex);
|
||||||
|
|
||||||
int thread_num;
|
int thread_num;
|
||||||
|
|
|
@ -552,7 +552,7 @@ struct _Image_Entry
|
||||||
#ifdef EVAS_FRAME_QUEUING
|
#ifdef EVAS_FRAME_QUEUING
|
||||||
LK(ref_fq_add);
|
LK(ref_fq_add);
|
||||||
LK(ref_fq_del);
|
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
|
int ref_fq[2]; // ref_fq[0] is for addition, ref_fq[1] is for deletion
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
@ -861,7 +861,7 @@ struct _RGBA_Font
|
||||||
int references;
|
int references;
|
||||||
#ifdef EVAS_FRAME_QUEUING
|
#ifdef EVAS_FRAME_QUEUING
|
||||||
int ref_fq[2]; //ref_fq[0] is for addition, ref_fq[1] is for deletion
|
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_add);
|
||||||
LK(ref_fq_del);
|
LK(ref_fq_del);
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue