Beispiel #1
0
static inline void
fq_push_free_message_stack(struct free_message_stack *stack, fq_msg *m)
{
    if (stack == NULL) {
        return;
    }

    while(ck_pr_load_32(&stack->size) > stack->max_size) {
        ck_stack_entry_t *ce = ck_stack_batch_pop_mpmc(&stack->stack);
        while (ce != NULL) {
            fq_msg *m = container_of(ce, fq_msg, cleanup_stack_entry);
            ce = ce->next;
            free(m);
        }
    }
    uint32_t c = ck_pr_load_32(&stack->size);
    if (c >= stack->max_size) {
        free(m);
        return;
    }

    ck_pr_inc_32(&stack->size);
    ck_stack_push_mpmc(&stack->stack, &m->cleanup_stack_entry);
}
Beispiel #2
0
void 
fq_clear_message_cleanup_stack()
{
  int i;
  if(tls_free_message_handle == NULL) return;
  tls_free_message_handle->valid = false;
  for(i=0; i<MSG_FREE_STACKS; i++) {
    if (tls_free_message_handle->stacks[i]) {
      tls_free_message_handle->stacks[i]->size = 0;
      ck_stack_entry_t *ce = ck_stack_batch_pop_mpmc(&tls_free_message_handle->stacks[i]->stack);
      while (ce != NULL) {
        fq_msg *m = container_of(ce, fq_msg, cleanup_stack_entry);
        ce = ce->next;
        free(m);
      }
    }
  }
  struct handle_free_list *node = calloc(1, sizeof(*node));
  pthread_mutex_lock(&free_message_handle_list_lock);
  node->handle = tls_free_message_handle;
  node->next = free_message_handle_list;
  free_message_handle_list = node;
  pthread_mutex_unlock(&free_message_handle_list_lock);
}