> 
> +     struct message_queue_entry *cur_msg, *next_msg, *new_msg = NULL;
>       while (1) {
> -             if (read_msg(&msg, &sa) == 0)
> -                     process_msg(&msg, &sa);
> +             /* we want to process all messages in order of their arrival,
> +              * but status of init_complete may change while we're iterating
> +              * the tailq. so, store it here and check once every iteration.
> +              */
> +             int init_complete;

Do we allow variables to be defined in the middle of a block, I thought we only 
allowed them after a ‘{‘ or open block.

> +
> +             if (new_msg == NULL)
> +                     new_msg = malloc(sizeof(*new_msg));

I am very concerned about allocating memory with no limit. If the process never 
completes then we could receive messages and consume a lot of memory. I would 
want to see a limit to the number of messages we can consume in the queue just 
to be sure.

> +             if (read_msg(&new_msg->msg, &new_msg->sa) == 0) {
> +                     /* we successfully read the message, so enqueue it */
> +                     TAILQ_INSERT_TAIL(&message_queue, new_msg, next);
> +                     new_msg = NULL;
> +             } /* reuse new_msg for next message if we couldn't read_msg */
> +
> +             init_complete = internal_config.init_complete;

Does the internal_config.init_complete need to be a volatile to make sure it is 
reread each time thru the loop?

> +
> +             /* tailq only accessed here, so no locking needed */
> +             TAILQ_FOREACH_SAFE(cur_msg, &message_queue, next, next_msg) {
> +                     /* secondary process should not process any incoming
> +                      * requests until its initialization is complete, but
> +                      * it is allowed to process replies to its own queries.
> +                      */
> +                     if (rte_eal_process_type() == RTE_PROC_SECONDARY &&
> +                                     !init_complete &&
> +                                     cur_msg->msg.type != MP_REP)
> +                             continue;
> +
> +                     TAILQ_REMOVE(&message_queue, cur_msg, next);
> +
> +                     process_msg(&cur_msg->msg, &cur_msg->sa);
> +
> +                     free(cur_msg);
> +             }
>       }
> 
>       return NULL;
> -- 
> 2.7.4

Regards,
Keith

Reply via email to