void NightWatch_sampling(void *p, size_t size, int type, void *alloc_context) { struct alloc_context *context, *ctx_snapshot; struct memory_chunk *chunk; ctx_snapshot = (struct alloc_context*)alloc_context; if (likely(ctx_snapshot->map_only_context_flag == MAP_ONLY_CONTEXT)) { return; } context = ctx_snapshot->ctx; /* chunk level skip */ if (likely(ctx_snapshot->sample_skip > 0 && ((size < SMALL_MEMORY_CHUNK) || (ctx_snapshot->last_chunk_sz == size && size < LARGE_MEMORY_CHUNK)))) { fetch_and_sub(&context->sample_skip, 1); set_extend_info(p, NULL); #ifdef PREDICTOR_INFO printf("skipping a chunk, size=%d context=%lu\n", (int)size, context->idx); #endif /* PREDICTOR_INFO */ return; } // assert(size >= SMALL_MEMORY_CHUNK); #ifdef PREDICTOR_INFO printf("monitoring a chunk, size=%d context=%lu\n", (int)size, context->idx); #endif /* PREDICTOR_INFO */ chunk = alloc_and_init_chunk(p, size, type, context); set_extend_info(p, chunk); utl_spin_lock(&context->lock); list_add(&chunk->sibling, &context->chunk); chunk->mr = get_predict_mr(context); if (context->last_chunk_sz != size) { context->skip_interval = 0; context->predict_type[0] = UNKNOWN_MAPPING; context->predict_mr[0] = -1; } if (unlikely(context->sample_skip <= 0 && size < LARGE_MEMORY_CHUNK)) { context->sample_skip = context->skip_interval; } context->last_chunk_sz = size; utl_spin_unlock(&context->lock); monit_chunk(chunk); }
int ring_queue_pop(ring_queue_t *queue, void **ele) { if (!(queue->num > 0)) return -1; int cur_head_index = queue->head; char * cur_head_flag_index = queue->flags + cur_head_index; while (!compare_and_swap(cur_head_flag_index, 2, 3)) { cur_head_index = queue->head; cur_head_flag_index = queue->flags + cur_head_index; } int update_head_index = (cur_head_index + 1) % queue->size; compare_and_swap(&queue->head, cur_head_index, update_head_index); *ele = *(queue->data + cur_head_index); fetch_and_sub(cur_head_flag_index, 3); fetch_and_sub(&queue->num, 1); return 0; }