diff --git a/cesnet/cesnet.cpp b/cesnet/cesnet.cpp index 80656520a2f7a6dc076e9dbf225284a304124fa7..f633a798696e08de6e000b503493d958a738158f 100644 --- a/cesnet/cesnet.cpp +++ b/cesnet/cesnet.cpp @@ -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);