and an alternative to use semphaore

This commit is contained in:
Vincent Wei
2023-07-14 13:11:30 +08:00
parent 613a19c236
commit 8b4ab267b6
2 changed files with 52 additions and 7 deletions

View File

@@ -545,9 +545,13 @@ static int RealEngine_Init(void)
static int SHADOW_LockHWSurface(_THIS, GAL_Surface *surface)
{
if (surface == this->screen && this->hidden->async_update) {
if (pthread_mutex_lock(&this->hidden->update_lock)) {
#if USE_UPDATE_SEM
if (sem_wait(&this->hidden->update_sem))
_ERR_PRINTF("Failed sem_wait(): %m\n");
#else
if (pthread_mutex_lock(&this->hidden->update_lock))
_ERR_PRINTF("Failed pthread_mutex_lock(): %m\n");
}
#endif
_DBG_PRINTF("locked\n");
return 0;
}
@@ -558,9 +562,13 @@ static int SHADOW_LockHWSurface(_THIS, GAL_Surface *surface)
static void SHADOW_UnlockHWSurface(_THIS, GAL_Surface *surface)
{
if (surface == this->screen && this->hidden->async_update) {
if (pthread_mutex_unlock(&this->hidden->update_lock)) {
#if USE_UPDATE_SEM
if (sem_post(&this->hidden->update_sem))
_ERR_PRINTF("Failed sem_post(): %m\n");
#else
if (pthread_mutex_unlock(&this->hidden->update_lock))
_ERR_PRINTF("Failed pthread_mutex_unlock(): %m\n");
}
#endif
_DBG_PRINTF("unlocked\n");
}
}
@@ -568,8 +576,13 @@ static void SHADOW_UnlockHWSurface(_THIS, GAL_Surface *surface)
static BOOL SHADOW_SyncUpdateAsync(_THIS)
{
if (this->hidden->async_update) {
#if USE_UPDATE_SEM
if (sem_wait(&this->hidden->update_sem))
_ERR_PRINTF("Failed sem_wait(): %m\n");
#else
if (pthread_mutex_lock(&this->hidden->update_lock))
_ERR_PRINTF("Failed pthread_mutex_lock(): %m\n");
#endif
}
if (_shadowfbheader->dirty || _shadowfbheader->palette_changed) {
@@ -594,8 +607,13 @@ static BOOL SHADOW_SyncUpdateAsync(_THIS)
}
if (this->hidden->async_update) {
#if USE_UPDATE_SEM
if (sem_post(&this->hidden->update_sem))
_ERR_PRINTF("Failed sem_post(): %m\n");
#else
if (pthread_mutex_unlock(&this->hidden->update_lock))
_ERR_PRINTF("Failed pthread_mutex_unlock(): %m\n");
#endif
}
return TRUE;
@@ -614,9 +632,13 @@ static void *task_do_update(void *data)
do {
usleep(this->hidden->update_interval * 1000);
if (pthread_mutex_lock(&this->hidden->update_lock)) {
#if USE_UPDATE_SEM
if (sem_wait(&this->hidden->update_sem))
_ERR_PRINTF("Failed sem_wait(): %m\n");
#else
if (pthread_mutex_lock(&this->hidden->update_lock))
_ERR_PRINTF("Failed pthread_mutex_lock(): %m\n");
}
#endif
_DBG_PRINTF("locked\n");
if (RECTH(this->hidden->update_rect)) {
@@ -660,8 +682,13 @@ static void *task_do_update(void *data)
SetRectEmpty(&this->hidden->update_rect);
}
#if USE_UPDATE_SEM
if (sem_post(&this->hidden->update_sem))
_ERR_PRINTF("Failed sem_post(): %m\n");
#else
if (pthread_mutex_unlock(&this->hidden->update_lock))
_ERR_PRINTF("Failed pthread_mutex_unlock(): %m\n");
#endif
_DBG_PRINTF("unlocked\n");
} while (1);
@@ -681,10 +708,17 @@ static int create_async_updater(_THIS)
return -1;
}
#if USE_UPDATE_SEM
if (sem_init(&this->hidden->update_sem, 0, 1)) {
_ERR_PRINTF("Failed sem_init(): %m\n");
return -1;
}
#else
if (pthread_mutex_init(&this->hidden->update_lock, NULL)) {
_ERR_PRINTF("Failed pthread_mutex_init(): %m\n");
return -1;
}
#endif
pthread_attr_t attr;
pthread_attr_init(&attr);
@@ -715,7 +749,11 @@ static void cancel_async_updater(_THIS)
pthread_cancel(this->hidden->update_thd);
pthread_join(this->hidden->update_thd, NULL);
#if USE_UPDATE_SEM
sem_destroy(&this->hidden->update_sem);
#else
pthread_mutex_destroy(&this->hidden->update_lock);
#endif
sem_destroy(&this->hidden->sync_sem);
}
}

View File

@@ -99,6 +99,8 @@ typedef struct _RealFBInfo {
/* Private display data */
#define USE_UPDATE_SEM 0
struct GAL_PrivateVideoData {
RealFBInfo * realfb_info;
#ifdef _MGRM_PROCESSES
@@ -110,8 +112,13 @@ struct GAL_PrivateVideoData {
int update_interval;
RECT update_rect;
pthread_t update_thd;
pthread_mutex_t update_lock;
sem_t sync_sem;
#if USE_UPDATE_SEM
sem_t update_sem;
#else
pthread_mutex_t update_lock;
#endif
};
typedef struct _ShadowFBOps {