2016-02-13 67 views
1

當讀取涉及用v412 API的某些源代碼,我偶然發現這些段:爲什麼阻止信號然後解鎖它們?

第一:

sigemptyset(&set); 
sigaddset(&set, SIGCHLD); 
sigaddset(&set, SIGALRM); 
sigaddset(&set, SIGUSR1); 
sigaddset(&set, SIGTERM); 
sigaddset(&set, SIGHUP); 
pthread_sigmask(SIG_BLOCK, &set, &old); 

然後:

pthread_sigmask(SIG_UNBLOCK, &old, NULL); 

在這兩者之間:

if (s->pframe >= 0) { 
    if (xioctl(s->fd, VIDIOC_QBUF, &s->buf) == -1) { 
     motion_log(LOG_ERR, 1, "%s: VIDIOC_QBUF", __FUNCTION__); 
     return -1; 
    } 
} 

memset(&s->buf, 0, sizeof(struct v4l2_buffer)); 

s->buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; 
s->buf.memory = V4L2_MEMORY_MMAP; 

if (xioctl(s->fd, VIDIOC_DQBUF, &s->buf) == -1) { 

    /* some drivers return EIO when there is no signal, 
     driver might dequeue an (empty) buffer despite 
     returning an error, or even stop capturing. 
    */ 
    if (errno == EIO) { 
     s->pframe++; 
     if ((u32)s->pframe >= s->req.count) s->pframe = 0; 
     s->buf.index = s->pframe; 

     motion_log(LOG_ERR, 1, "%s: VIDIOC_DQBUF: EIO (s->pframe %d)", __FUNCTION__, s->pframe); 

     return 1; 
    } 

    motion_log(LOG_ERR, 1, "%s: VIDIOC_DQBUF", __FUNCTION__); 

    return -1; 
} 

s->pframe = s->buf.index; 
s->buffers[s->buf.index].used = s->buf.bytesused; 
s->buffers[s->buf.index].content_length = s->buf.bytesused; 

我誠實的猜測是阻止信號阻止,在這特殊情況下,安裝過程被中斷。但我完全不確定。請幫忙?

+0

你能表現出實際的順序碼?將中間代碼放在其他代碼之後會令人困惑。 – Barmar

+2

你的猜測對我來說很正確。它會阻止這些信號,進行設置,然後將信號掩碼恢復到之前的狀態。 – Barmar

+0

我想你不想讓視頻緩衝區處於中間狀態,部分初始化。 – Barmar

回答