Example #1
0
jv_int_t jv_thread_queue(jv_thread_t *thread, void * (*func)(void *), void *arg) {
	jv_job_thread_t *job;
	if ((job = jv_pool_alloc(thread->pool, sizeof(jv_job_thread_t))) == NULL) {
		errno = ENOMEM;
		return JV_ERROR;
	}
	job->next = NULL;
	job->func = func;
	job->arg = arg;

	(void) pthread_mutex_lock(&thread->mutex);

	if (thread->head == NULL) {
		thread->head = job;
	} else {
		thread->tail->next = job;
	}
	thread->tail = job;

	if (thread->idle > 0) {
		(void) pthread_cond_signal(&thread->workcv);
	} else if (thread->count < thread->max && jv_create_worker(thread) == 0) {
		thread->count++;
	}
	(void) pthread_mutex_unlock(&thread->mutex);
	return (0);
}
Example #2
0
u_char *jv_strdup(jv_pool_t *pool, const u_char *s) {
	size_t n = jv_strlen(s) + 1;
	u_char *dst = jv_pool_alloc(pool, sizeof(u_char) * n);
	if (dst == NULL) {
		return NULL;
	}jv_memcpy(dst, s, n);
	return dst;
}
Example #3
0
void *jv_pool_calloc(jv_pool_t *pool, size_t size) {
	void *p;
	p = jv_pool_alloc(pool, size);
	if (p) {
		(void) jv_memzero(p, size);
	}
	return p;
}
Example #4
0
jv_thread_t *jv_thread_create(jv_pool_t *pool, jv_uint_t min, jv_uint_t max,
		jv_uint_t linger, pthread_attr_t *attr) {
	jv_thread_t *thread;
	(void) sigfillset(&fillset);
	if (min > max || max < 1) {
		errno = EINVAL;
		return NULL;
	}
	if ((thread = jv_pool_alloc(pool, sizeof(jv_thread_t))) == NULL) {
		errno = ENOMEM;
		return NULL;
	}
	(void) pthread_mutex_init(&thread->mutex, NULL);
	(void) pthread_cond_init(&thread->busycv, NULL);
	(void) pthread_cond_init(&thread->workcv, NULL);
	(void) pthread_cond_init(&thread->waitcv, NULL);
	thread->active = NULL;
	thread->head = NULL;
	thread->tail = NULL;
	thread->flag = 0;
	thread->linger = linger;
	thread->min = min;
	thread->max = max;
	thread->count = 0;
	thread->idle = 0;
	thread->pool = pool;

	/* We cannot just copy the attribute pointer.
	 * We need to initialize a new pthread_attr_t structure using
	 * the values from the caller-supplied attribute structure.
	 * If the attribute pointer is NULL, we need to initialize
	 * the new pthread_attr_t structure with default values. */
	jv_clone_attributes(&thread->attr, attr);
	/* insert into the global list of all thread threads */
	(void) pthread_mutex_lock(&jv_thread_lock);
	if (jv_threads == NULL) {
		thread->forw = thread;
		thread->back = thread;
		jv_threads = thread;
	} else {
		jv_threads->back->forw = thread;
		thread->forw = jv_threads;
		thread->back = jv_threads->back;
		jv_threads->back = thread;
	}
	(void) pthread_mutex_unlock(&jv_thread_lock);

	return thread;
}
Example #5
0
void *test_pool5(void *arg){
    jv_pool_t *pool=(jv_pool_t *)arg;
    jv_uint_t i;

    srand(time(NULL));
    for(i=0;i<100;i++){
        jv_uint_t j=rand()%100;
        jv_lump_t *lump=jv_pool_alloc(pool,j);
        if(lump==NULL){
            printf("free is error.\n");
            continue;
        }
        jv_pool_free(pool,lump);
    }
    each(pool);
    return NULL;
}
Example #6
0
void test3(void)
{
    jv_pool_t *pool;
    jv_uint_t i;
    pool=jv_pool_create(4096);
    each(pool);

    srand(time(NULL));
    for(i=0;i<100;i++)
	{
        jv_uint_t j = rand()%100 + 500;
        jv_lump_t* lump = (jv_lump_t*)jv_pool_alloc(pool,j);
        printf("apply memory size:%u\n",j);
        if(lump==NULL)
		{
            printf("free is error.\n");
            continue;
        }
        jv_pool_free(pool,lump);
    }
    each(pool);

    jv_pool_destroy(pool);
}
Example #7
0
int main() {
	jv_pool_t* pool;
	yahoo_guy_t* guy;
	jv_queue_t* q;
	yahoo_t* yahoo;
	pool = jv_pool_create(1024); //初始化内存池
	int i;
	// 构建队列
	const jv_str_t names[] = { jv_string("rainx"), jv_string("xiaozhe"),
			jv_string("zhoujian") };
	const int ids[] = { 4611, 8322, 6111 };

	yahoo = jv_pool_alloc(pool, sizeof(yahoo_t));
	jv_queue_init(&yahoo->queue);
	//初始化queue

	for (i = 0; i < 3; i++) {
		guy = (yahoo_guy_t*) jv_pool_alloc(pool, sizeof(yahoo_guy_t));
		guy->id = ids[i];
		//guy->name = (char*) jv_palloc(pool, (size_t) (strlen(names[i]) + 1) );
		guy->name = (u_char*) jv_strdup(pool, names[i].data);

		jv_queue_init(&guy->queue);
		// 从头部进入队列
		jv_queue_insert_head(&yahoo->queue, &guy->queue);
	}

	// 从尾部遍历输出
	for (q = jv_queue_last(&yahoo->queue);
			q != jv_queue_sentinel(&yahoo->queue); q = jv_queue_prev(q)) {

		guy = jv_queue_data(q, yahoo_guy_t, queue);
		printf("No. %d guy in yahoo is %s \n", guy->id, guy->name);
	}

	// 找到位于队列中间(若队列有奇数个元素就是正中间,若有偶数个元素则为后半部分的首个元素)的元素输出
	{
		jv_queue_t *m = jv_queue_middle(&yahoo->queue);
		guy = jv_queue_data(m, yahoo_guy_t, queue);
		printf("Middle man: ID: %d, Name: %s\n", guy->id, guy->name);
	}

	// 排序从头部输出
	jv_queue_sort(&yahoo->queue, yahoo_no_cmp);
	printf("sorting....\n");
	for (q = jv_queue_prev(&yahoo->queue);
			q != jv_queue_sentinel(&yahoo->queue); q = jv_queue_last(q)) {

		guy = jv_queue_data(q, yahoo_guy_t, queue);
		printf("No. %d guy in yahoo is %s \n", guy->id, guy->name);
	}

	// 找到位于队列中间(若队列有奇数个元素就是正中间,若有偶数个元素则为后半部分的首个元素)的元素输出
	{
		jv_queue_t *m = jv_queue_middle(&yahoo->queue);
		guy = jv_queue_data(m, yahoo_guy_t, queue);
		printf("Middle man: ID: %d, Name: %s\n", guy->id, guy->name);
	}

	jv_pool_destroy(pool);
	return 0;
}
Example #8
0
void test2(void)
{
    jv_pool_t *pool;
    void *a,*b,*c,*d,*e,*f,*g,*h;
    jv_lump_t *lump;
    /* printf("sizeof(jv_pool_t):%u\n",sizeof(jv_pool_t)); */
    //pool=jv_pool_create(128);
	pool=jv_pool_create(5000 * (4096 + 16 * 3));
   // printf("pool:%u,pos:%u,block:%u,block->next:%u,lump:%u,lump->next:%u\n",(jv_uint_t)pool,(jv_uint_t)pool->pos,(jv_uint_t)pool->first,(jv_uint_t)pool->first->next,(jv_uint_t)pool->lump,(jv_uint_t)pool->lump->next);
   // printf("\n");

   // assert((u_char *)pool->first+sizeof(jv_block_t)==(u_char *)pool);
   // assert((u_char *)pool->first+sizeof(jv_block_t)+sizeof(jv_pool_t)==(u_char *)pool->lump);
   // assert((u_char *)pool+sizeof(jv_pool_t)==(u_char *)(pool->lump));


   // a=jv_pool_alloc(pool,40);
   // printf("pool:%u,pos:%u,block:%u,block->next:%u,lump:%u,lump->next:%u\n",(jv_uint_t)pool,(jv_uint_t)pool->pos,(jv_uint_t)pool->first,(jv_uint_t)pool->first->next,(jv_uint_t)pool->lump,(jv_uint_t)pool->lump->next);
   // printf("a address:%u,pos:%u\n",(jv_uint_t)a,(jv_uint_t)pool->pos);
   // assert((u_char *)a==(u_char *)pool+sizeof(jv_pool_t)+sizeof(jv_lump_t)+32+sizeof(jv_lump_t));


   // printf("\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \n\n");
   // b=jv_pool_alloc(pool,56);
   // printf("pool:%u,pos:%u,block:%u,block->next:%u,lump:%u,lump->next:%u\n",(jv_uint_t)pool,(jv_uint_t)pool->pos,(jv_uint_t)pool->first,(jv_uint_t)pool->first->next,(jv_uint_t)pool->lump,(jv_uint_t)pool->lump->next);
   // printf("b address:%u,pos:%u\n",(jv_uint_t)b,(jv_uint_t)pool->pos);
   // assert((u_char *)b==(u_char *)pool->first->next+sizeof(jv_block_t)+sizeof(jv_lump_t)+52);


   // //each(pool);


   // printf("\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \n\n");
   // c=jv_pool_alloc(pool,32); /* (32,36) */
   // printf("pool:%u,pos:%u,block:%u,block->next:%u,lump:%u,lump->next:%u\n",(jv_uint_t)pool,(jv_uint_t)pool->pos,(jv_uint_t)pool->first,(jv_uint_t)pool->first->next,(jv_uint_t)pool->lump,(jv_uint_t)pool->lump->next);
   // printf("c address:%u,pos:%u\n",(jv_uint_t)c,(jv_uint_t)pool->pos);
   // assert((u_char *)c==(u_char *)pool->first->next+sizeof(jv_block_t)+sizeof(jv_lump_t));

   //// each(pool);


   // printf("\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \n\n");
   // d=jv_pool_alloc(pool,8);
   // printf("pool:%u,pos:%u,block:%u,block->next:%u,lump:%u,lump->next:%u\n",(jv_uint_t)pool,(jv_uint_t)pool->pos,(jv_uint_t)pool->first,(jv_uint_t)pool->first->next,(jv_uint_t)pool->lump,(jv_uint_t)pool->lump->next);
   // printf("d address:%u,pos:%u\n",(jv_uint_t)d,(jv_uint_t)pool->pos);
   // assert((u_char *)d==(u_char *)pool+sizeof(jv_pool_t)+sizeof(jv_lump_t)+24);


   // printf("\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \n\n");
   // e=jv_pool_alloc(pool,4); /* (4,8) */
   // printf("pool:%u,pos:%u,block:%u,block->next:%u,lump:%u,lump->next:%u\n",(jv_uint_t)pool,(jv_uint_t)pool->pos,(jv_uint_t)pool->first,(jv_uint_t)pool->first->next,(jv_uint_t)pool->lump,(jv_uint_t)pool->lump->next);
   // printf("e address:%u,pos:%u\n",(jv_uint_t)e,(jv_uint_t)pool->pos);
   // assert((u_char *)e==(u_char *)pool+sizeof(jv_pool_t)+sizeof(jv_lump_t));


   // printf("\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \n\n");
   // f=jv_pool_alloc(pool,24);
   // printf("pool:%u,pos:%u,block:%u,block->next->next:%u,lump:%u,lump->next:%u\n",(jv_uint_t)pool,(jv_uint_t)pool->pos,(jv_uint_t)pool->first,(jv_uint_t)pool->first->next->next,(jv_uint_t)pool->lump,(jv_uint_t)pool->lump->next);
   // printf("f address:%u,pos:%u\n",(jv_uint_t)f,(jv_uint_t)pool->pos);
   // assert((u_char *)f==(u_char *)pool->first->next->next+sizeof(jv_block_t)+sizeof(jv_lump_t)+68+sizeof(jv_lump_t));


   // printf("\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \n\n");
   // g=jv_pool_alloc(pool,104);
   // printf("pool:%u,pos:%u,block:%u,block->next->next:%u,lump:%u,lump->next:%u\n",(jv_uint_t)pool,(jv_uint_t)pool->pos,(jv_uint_t)pool->first,(jv_uint_t)pool->first->next->next,(jv_uint_t)pool->lump,(jv_uint_t)pool->lump->next);
   // printf("g address:%u,pos:%u\n",(jv_uint_t)g,(jv_uint_t)pool->pos);
   // assert((u_char *)g==(u_char *)pool->first->next->next->next+sizeof(jv_block_t)+sizeof(jv_lump_t));

    /*jeach(pool);

    v_pool_free(pool,c);
    lump=((jv_lump_t *)((u_char *)pool->first->next+sizeof(jv_block_t)));
    assert(lump->used==0);
    assert(lump->size==36);

    jv_pool_free(pool,f);
    lump=((jv_lump_t *)((u_char *)pool->first->next->next+sizeof(jv_block_t)+sizeof(jv_lump_t)+68));
    assert(lump->used==0);
    assert(lump->size==24);

    jv_pool_free(pool,a);
    lump=((jv_lump_t *)((u_char *)pool->first+sizeof(jv_block_t)+sizeof(jv_pool_t)+sizeof(jv_lump_t)+32));
    assert(lump->used==0);
    assert(lump->size==40);

    jv_pool_free(pool,e);
    lump=((jv_lump_t *)((u_char *)pool->first+sizeof(jv_block_t)+sizeof(jv_pool_t)));
    assert(lump->used==0);
    assert(lump->size==8);

    jv_pool_free(pool,d);
    lump=((jv_lump_t *)((u_char *)pool->first+sizeof(jv_block_t)+sizeof(jv_pool_t)));
    assert(lump->used==0);
    assert(lump->size==88);

    jv_pool_free(pool,b);
    lump=((jv_lump_t *)((u_char *)pool->first->next+sizeof(jv_block_t)));
    assert(lump->used==0);
    assert(lump->size==108);

    jv_pool_free(pool,g);
    lump=((jv_lump_t *)((u_char *)pool->first->next->next+sizeof(jv_block_t)));
    assert(lump->used==0);
    assert(lump->size==108);*/

    each(pool);
    h=jv_pool_alloc(pool,1000);
    each(pool);
    jv_pool_free(pool,h);
    each(pool);
   /* char* sss = (char*)malloc(4);
    assert(jv_pool_free(pool, sss)==JV_ERROR);
    free(sss);*/
    jv_pool_destroy(pool);
}