示例#1
0
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);
}
示例#2
0
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;
}