Skip to content
Snippets Groups Projects
Commit 35d36e62 authored by Martin Pulec's avatar Martin Pulec
Browse files

SHM: Fixed locking

parent ba23ee2c
No related branches found
No related tags found
No related merge requests found
......@@ -12,7 +12,7 @@
#include <sys/shm.h>
#endif
#define REQUIRED_SHM_VERSION 5
#define REQUIRED_SHM_VERSION 6
#define SEM_KEY 5004
#define SHM_KEY 5004
......@@ -180,8 +180,8 @@ void cesnet_set_render_buffer_yuv_i420(unsigned char *y, unsigned char *u, unsig
perror("shmat");
return;
}
/// 2 semaphores: [ready_to_consume_frame, freame_ready]
int sem = semget(SEM_KEY, 2, 0);
/// 3 semaphores: [ready_to_consume_frame, freame_ready, lock]
int sem = semget(SEM_KEY, 3, 0);
if (sem == -1) {
perror("semget");
return;
......@@ -191,11 +191,14 @@ void cesnet_set_render_buffer_yuv_i420(unsigned char *y, unsigned char *u, unsig
return;
}
struct sembuf op;
op.sem_num = 0; // wait until UltraGrid is able to take a frame
op.sem_op = -1; // decrement by one
op.sem_flg = 0;
if (semop(sem, &op, 1) == -1) {
struct sembuf op[2];
op[0].sem_num = 0; // wait until UltraGrid is able to take a frame
op[0].sem_op = -1; // decrement by one
op[0].sem_flg = 0;
op[1].sem_num = 2; // lock
op[1].sem_op = -1;
op[1].sem_flg = 0;
if (semop(sem, op, 2) == -1) {
perror("semop");
return;
}
......@@ -236,10 +239,13 @@ void cesnet_set_render_buffer_yuv_i420(unsigned char *y, unsigned char *u, unsig
convert_render_pkt_to_view_matrix(&cesnet_shm->pkt, g_view_matrix);
}
op.sem_num = 1;
op.sem_op = 1; // and post that we have a new frame
op.sem_flg = 0;
if (semop(sem, &op, 1) == -1) {
op[0].sem_num = 1;
op[0].sem_op = 1; // and post that we have a new frame
op[0].sem_flg = 0;
op[1].sem_num = 2;
op[1].sem_op = 1; // unlock
op[1].sem_flg = 0;
if (semop(sem, op, 2) == -1) {
perror("semop");
}
shmdt(cesnet_shm);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment