mirror of
https://github.com/tuxbox-neutrino/neutrino.git
synced 2025-08-30 00:41:17 +02:00
fb_accel_sti: reorder blit_mutex locking
This seems to help spurious deadlocks in the STI framebuffer blit code. Not 100% sure why, butthis helps, but I have not seen lockups with this.
This commit is contained in:
committed by
Jacek Jendrzej
parent
ee031801e4
commit
223d1d709f
@@ -36,6 +36,7 @@
|
|||||||
#include <memory.h>
|
#include <memory.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
#include <linux/kd.h>
|
#include <linux/kd.h>
|
||||||
|
|
||||||
@@ -333,10 +334,12 @@ void CFbAccelSTi::run()
|
|||||||
time_t last_blit = 0;
|
time_t last_blit = 0;
|
||||||
blit_pending = false;
|
blit_pending = false;
|
||||||
blit_thread = true;
|
blit_thread = true;
|
||||||
blit_mutex.lock();
|
|
||||||
set_threadname("stifb::autoblit");
|
set_threadname("stifb::autoblit");
|
||||||
while (blit_thread) {
|
while (blit_thread) {
|
||||||
|
blit_mutex.lock();
|
||||||
blit_cond.wait(&blit_mutex, blit_pending ? BLIT_INTERVAL_MIN : BLIT_INTERVAL_MAX);
|
blit_cond.wait(&blit_mutex, blit_pending ? BLIT_INTERVAL_MIN : BLIT_INTERVAL_MAX);
|
||||||
|
blit_mutex.unlock();
|
||||||
|
|
||||||
time_t now = time_monotonic_ms();
|
time_t now = time_monotonic_ms();
|
||||||
if (now - last_blit < BLIT_INTERVAL_MIN)
|
if (now - last_blit < BLIT_INTERVAL_MIN)
|
||||||
{
|
{
|
||||||
@@ -346,20 +349,22 @@ void CFbAccelSTi::run()
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
blit_pending = false;
|
blit_pending = false;
|
||||||
blit_mutex.unlock();
|
|
||||||
_blit();
|
_blit();
|
||||||
blit_mutex.lock();
|
|
||||||
last_blit = now;
|
last_blit = now;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
blit_mutex.unlock();
|
|
||||||
printf(LOGTAG "::run end\n");
|
printf(LOGTAG "::run end\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
void CFbAccelSTi::blit()
|
void CFbAccelSTi::blit()
|
||||||
{
|
{
|
||||||
//printf(LOGTAG "::blit\n");
|
//printf(LOGTAG "::blit\n");
|
||||||
blit_mutex.lock();
|
int status = blit_mutex.trylock();
|
||||||
|
if (status) {
|
||||||
|
printf(LOGTAG "::blit trylock failed: %d (%s)\n", status,
|
||||||
|
(status > 0) ? strerror(status) : strerror(errno));
|
||||||
|
return;
|
||||||
|
}
|
||||||
blit_cond.signal();
|
blit_cond.signal();
|
||||||
blit_mutex.unlock();
|
blit_mutex.unlock();
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user