Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7f04145f authored by Pavlin Radoslavov's avatar Pavlin Radoslavov Committed by Scott James Remnant
Browse files

Update the usage of fixed_queue.

 * Relax non-NULL requirements for fixed_queue by eliminating
   some of the asserts.
   Now, when semantically possible, fixed_queue - related function
   will return the appropriate value even if the queue pointer is NULL.
   This reduces clutter in the code where we had to do anyway
   "if (queue != NULL)" checks.

 * Add non-NULL guards in the few remaining places where
   fixed_queue_get_list(). For now, we need to use this function,
   hence the extra check.
   That function should be eliminated in the future, because all the
   code where it is used violates the semantics of using a queue.

Bug: 24723840
Change-Id: I47632a3515f3d27856d4870e18723d345c040d64
parent 753fe91e
Loading
Loading
Loading
Loading
+8 −8
Original line number Diff line number Diff line
@@ -45,11 +45,12 @@ fixed_queue_t *fixed_queue_new(size_t capacity);
// blocked on it) results in undefined behaviour.
void fixed_queue_free(fixed_queue_t *queue, fixed_queue_free_cb free_cb);

// Returns a value indicating whether the given |queue| is empty. |queue| may
// not be NULL.
// Returns a value indicating whether the given |queue| is empty. If |queue|
// is NULL, the return value is true.
bool fixed_queue_is_empty(fixed_queue_t *queue);

// Returns the length of the |queue|. |queue| may not be NULL.
// Returns the length of the |queue|. If |queue| is NULL, the return value
// is 0.
size_t fixed_queue_length(fixed_queue_t *queue);

// Returns the maximum number of elements this queue may hold. |queue| may
@@ -73,19 +74,18 @@ void *fixed_queue_dequeue(fixed_queue_t *queue);
bool fixed_queue_try_enqueue(fixed_queue_t *queue, void *data);

// Tries to dequeue an element from |queue|. This function will never block
// the caller. If the queue is empty, this function returns NULL immediately.
// Otherwise, the next element in the queue is returned. |queue| may not be
// NULL.
// the caller. If the queue is empty or NULL, this function returns NULL
// immediately. Otherwise, the next element in the queue is returned.
void *fixed_queue_try_dequeue(fixed_queue_t *queue);

// Returns the first element from |queue|, if present, without dequeuing it.
// This function will never block the caller. Returns NULL if there are no
// elements in the queue. |queue| may not be NULL.
// elements in the queue or |queue| is NULL.
void *fixed_queue_try_peek_first(fixed_queue_t *queue);

// Returns the last element from |queue|, if present, without dequeuing it.
// This function will never block the caller. Returns NULL if there are no
// elements in the queue. |queue| may not be NULL.
// elements in the queue or |queue| is NULL.
void *fixed_queue_try_peek_last(fixed_queue_t *queue);

// Tries to remove a |data| element from the middle of the |queue|. This
+13 −7
Original line number Diff line number Diff line
@@ -116,7 +116,8 @@ void fixed_queue_free(fixed_queue_t *queue, fixed_queue_free_cb free_cb) {
}

bool fixed_queue_is_empty(fixed_queue_t *queue) {
  assert(queue != NULL);
  if (queue == NULL)
    return true;

  pthread_mutex_lock(&queue->lock);
  bool is_empty = list_is_empty(queue->list);
@@ -126,7 +127,8 @@ bool fixed_queue_is_empty(fixed_queue_t *queue) {
}

size_t fixed_queue_length(fixed_queue_t *queue) {
  assert(queue != NULL);
  if (queue == NULL)
    return 0;

  pthread_mutex_lock(&queue->lock);
  size_t length = list_length(queue->list);
@@ -185,7 +187,8 @@ bool fixed_queue_try_enqueue(fixed_queue_t *queue, void *data) {
}

void *fixed_queue_try_dequeue(fixed_queue_t *queue) {
  assert(queue != NULL);
  if (queue == NULL)
    return NULL;

  if (!semaphore_try_wait(queue->dequeue_sem))
    return NULL;
@@ -201,7 +204,8 @@ void *fixed_queue_try_dequeue(fixed_queue_t *queue) {
}

void *fixed_queue_try_peek_first(fixed_queue_t *queue) {
  assert(queue != NULL);
  if (queue == NULL)
    return NULL;

  pthread_mutex_lock(&queue->lock);
  void *ret = list_is_empty(queue->list) ? NULL : list_front(queue->list);
@@ -211,7 +215,8 @@ void *fixed_queue_try_peek_first(fixed_queue_t *queue) {
}

void *fixed_queue_try_peek_last(fixed_queue_t *queue) {
  assert(queue != NULL);
  if (queue == NULL)
    return NULL;

  pthread_mutex_lock(&queue->lock);
  void *ret = list_is_empty(queue->list) ? NULL : list_back(queue->list);
@@ -221,7 +226,8 @@ void *fixed_queue_try_peek_last(fixed_queue_t *queue) {
}

void *fixed_queue_try_remove_from_queue(fixed_queue_t *queue, void *data) {
  assert(queue != NULL);
  if (queue == NULL)
    return NULL;

  pthread_mutex_lock(&queue->lock);
  bool removed = list_remove(queue->list, data);
@@ -236,7 +242,7 @@ list_t *fixed_queue_get_list(fixed_queue_t *queue) {
  assert(queue != NULL);

  // NOTE: This function is not thread safe, and there is no point for
  // callint pthread_mutex_lock() / pthread_mutex_unlock()
  // calling pthread_mutex_lock() / pthread_mutex_unlock()
  return queue->list;
}

+46 −44
Original line number Diff line number Diff line
@@ -1287,6 +1287,7 @@ void avdt_scb_hdl_write_req_frag(tAVDT_SCB *p_scb, tAVDT_SCB_EVT *p_data)

    ssrc = avdt_scb_gen_ssrc(p_scb);

    if (! fixed_queue_is_empty(p_data->apiwrite.frag_q)) {
        list_t *list = fixed_queue_get_list(p_data->apiwrite.frag_q);
        const list_node_t *node = list_begin(list);
        if (node != list_end(list)) {
@@ -1333,6 +1334,7 @@ void avdt_scb_hdl_write_req_frag(tAVDT_SCB *p_scb, tAVDT_SCB_EVT *p_data)
            /* length of all remaining transport packet */
            UINT16_TO_BE_STREAM(p, p_frag->layer_specific);
        }
    }

    /* store it */
    p_scb->frag_q = p_data->apiwrite.frag_q;
+3 −1
Original line number Diff line number Diff line
@@ -6231,8 +6231,10 @@ static BOOLEAN btm_sec_is_serv_level0(UINT16 psm)
static void btm_sec_check_pending_enc_req (tBTM_SEC_DEV_REC  *p_dev_rec, tBT_TRANSPORT transport,
                                            UINT8 encr_enable)
{
    UINT8                   res = encr_enable ? BTM_SUCCESS : BTM_ERR_PROCESSING;
    if (fixed_queue_is_empty(btm_cb.sec_pending_q))
        return;

    UINT8 res = encr_enable ? BTM_SUCCESS : BTM_ERR_PROCESSING;
    list_t *list = fixed_queue_get_list(btm_cb.sec_pending_q);
    for (const list_node_t *node = list_begin(list); node != list_end(list); ) {
        tBTM_SEC_QUEUE_ENTRY *p_e = (tBTM_SEC_QUEUE_ENTRY *)list_node(node);
+12 −8
Original line number Diff line number Diff line
@@ -166,18 +166,22 @@ static BOOLEAN process_read_multi_rsp (tGATT_SR_CMD *p_cmd, tGATT_STATUS status,
            p_buf->len = 1;

            /* Now walk through the buffers puting the data into the response in order */
            list_t *list = fixed_queue_get_list(p_cmd->multi_rsp_q);
            const list_node_t *node;
            list_t *list = NULL;
            const list_node_t *node = NULL;
            if (! fixed_queue_is_empty(p_cmd->multi_rsp_q))
                list = fixed_queue_get_list(p_cmd->multi_rsp_q);
            for (ii = 0; ii < p_cmd->multi_req.num_handles; ii++)
            {
                tGATTS_RSP *p_rsp = NULL;

                if (list != NULL) {
                    if (ii == 0)
                        node = list_begin(list);
                    else
                        node = list_next(node);
                    if (node != list_end(list))
                        p_rsp = (tGATTS_RSP *)list_node(node);
                }

                if (p_rsp != NULL)
                {
Loading