int32_t mm_jpeg_queue_flush(mm_jpeg_queue_t* queue) { mm_jpeg_q_node_t* node = NULL; void* data = NULL; struct cam_list *head = NULL; struct cam_list *pos = NULL; pthread_mutex_lock(&queue->lock); head = &queue->head.list; pos = head->next; while(pos != head) { node = member_of(pos, mm_jpeg_q_node_t, list); cam_list_del_node(&node->list); queue->size--; /* for now we only assume there is no ptr inside data * so we free data directly */ if (NULL != node->data) { free(node->data); } free(node); pos = pos->next; } queue->size = 0; pthread_mutex_unlock(&queue->lock); return 0; }
/*=========================================================================== * FUNCTION : flushNodes * * DESCRIPTION: flush only specific nodes, depending on * the given matching function. * * PARAMETERS : * @match : matching function * * RETURN : None *==========================================================================*/ void QCameraQueue::flushNodes(match_fn_data match, void *match_data){ camera_q_node* node = NULL; struct cam_list *head = NULL; struct cam_list *pos = NULL; if ( NULL == match ) { return; } pthread_mutex_lock(&m_lock); if (m_active) { head = &m_head.list; pos = head->next; while(pos != head) { node = member_of(pos, camera_q_node, list); pos = pos->next; if ( match(node->data, m_userData, match_data) ) { cam_list_del_node(&node->list); m_size--; if (NULL != node->data) { if (m_dataFn) { m_dataFn(node->data, m_userData); } free(node->data); } free(node); } } } pthread_mutex_unlock(&m_lock); }
/*=========================================================================== * FUNCTION : flush * * DESCRIPTION: flush all nodes from the queue, queue will be empty after this * operation. * * PARAMETERS : None * * RETURN : None *==========================================================================*/ void QCameraQueue::flush(){ camera_q_node* node = NULL; struct cam_list *head = NULL; struct cam_list *pos = NULL; pthread_mutex_lock(&m_lock); if (m_active) { head = &m_head.list; pos = head->next; while(pos != head) { node = member_of(pos, camera_q_node, list); pos = pos->next; cam_list_del_node(&node->list); m_size--; if (NULL != node->data) { if (m_dataFn) { m_dataFn(node->data, m_userData); } free(node->data); } free(node); } m_size = 0; m_active = false; } pthread_mutex_unlock(&m_lock); }
/*=========================================================================== * FUNCTION : dequeue * * DESCRIPTION: dequeue data from the queue * * PARAMETERS : * @bFromHead : if true, dequeue from the head * if false, dequeue from the tail * * RETURN : data ptr. NULL if not any data in the queue. *==========================================================================*/ void* QCameraQueue::dequeue(bool bFromHead) { camera_q_node* node = NULL; void* data = NULL; struct cam_list *head = NULL; struct cam_list *pos = NULL; pthread_mutex_lock(&m_lock); if (m_active) { head = &m_head.list; if (bFromHead) { pos = head->next; } else { pos = head->prev; } if (pos != head) { node = member_of(pos, camera_q_node, list); cam_list_del_node(&node->list); m_size--; } } pthread_mutex_unlock(&m_lock); if (NULL != node) { data = node->data; free(node); } return data; }
/*=========================================================================== * FUNCTION - delete_gpu_addr_list - * * DESCRIPTION: Delete gpu address list and free allocated memory. *==========================================================================*/ static void delete_gpu_addr_list() { struct cam_list *pos1, *pos2; struct cam_list *head = &(g_list.list); gpu_addr_list_t *entry; for (pos1 = head->next, pos2 = pos1->next; pos1 != head; pos1 = pos2, pos2 = pos1->next) { entry = member_of(pos1, gpu_addr_list_t, list); unmap_gpu_addr(entry->data.origGpuAddr); cam_list_del_node(pos1); free(entry); } } /* delete_gpu_addr_list */
void* mm_jpeg_queue_deq(mm_jpeg_queue_t* queue) { mm_jpeg_q_node_t* node = NULL; void* data = NULL; struct cam_list *head = NULL; struct cam_list *pos = NULL; pthread_mutex_lock(&queue->lock); head = &queue->head.list; pos = head->next; if (pos != head) { node = member_of(pos, mm_jpeg_q_node_t, list); cam_list_del_node(&node->list); queue->size--; } pthread_mutex_unlock(&queue->lock); if (NULL != node) { data = node->data; free(node); } return data; }