コード例 #1
0
ファイル: alloc.c プロジェクト: 01BTC10/pbc
struct heap * 
_pbcH_new(int pagesize) {
	int cap = 1024;
	while(cap < pagesize) {
		cap *= 2;
	}
	struct heap * h = (struct heap *)_pbcM_malloc(sizeof(struct heap));
	h->current = (struct heap_page *)_pbcM_malloc(sizeof(struct heap_page) + cap);
	h->size = cap;
	h->used = 0;
	h->current->next = NULL;
	return h;
}
コード例 #2
0
ファイル: alloc.c プロジェクト: 01BTC10/pbc
void* 
_pbcH_alloc(struct heap *h, int size) {
	size = (size + 3) & ~3;
	if (h->size - h->used < size) {
		struct heap_page * p;
		if (size < h->size) {
			p = (struct heap_page *)_pbcM_malloc(sizeof(struct heap_page) + h->size);
		} else {
			p = (struct heap_page *)_pbcM_malloc(sizeof(struct heap_page) + size);
		}
		p->next = h->current;
		h->current = p;
		h->used = size;
		return (p+1);
	} else {
		char * buffer = (char *)(h->current + 1);
		buffer += h->used;
		h->used += size;
		return buffer;
	}
}
コード例 #3
0
ファイル: register.cpp プロジェクト: niuzb/hellopetclient
static void
_register_enum(struct pbc_env *p, struct _stringpool *pool, struct pbc_rmessage * enum_type, const char *prefix, int prefix_sz) {
	int field_count = pbc_rmessage_size(enum_type, "value");
	struct map_kv *table =(struct map_kv *) _pbcM_malloc(field_count * sizeof(struct map_kv));
	int i;
	for (i=0;i<field_count;i++) {
		struct pbc_rmessage * value = pbc_rmessage_message(enum_type, "value", i);
		int enum_name_sz;
		const char *enum_name = pbc_rmessage_string(value , "name" , 0 , &enum_name_sz);
		table[i].pointer = (void *)_pbcS_build(pool, enum_name , enum_name_sz);
		table[i].id = pbc_rmessage_integer(value , "number", 0 , 0);
	}
	int name_sz;
	const char * name = pbc_rmessage_string(enum_type, "name", 0 , &name_sz);
	const char *temp = _concat_name(pool, prefix , prefix_sz , name , name_sz, NULL);

	_pbcP_push_enum(p,temp,table,field_count);
	free(table);
}
コード例 #4
0
ファイル: register.cpp プロジェクト: niuzb/hellopetclient
int
pbc_register(struct pbc_env * p, struct pbc_slice *slice) {
	//dump((uint8_t *)slice->buffer, slice->len);
	struct pbc_rmessage * message = pbc_rmessage_new(p, "google.protobuf.FileDescriptorSet", slice);
	if (message == NULL) {
		p->lasterror = "register open google.protobuf.FileDescriptorSet fail";
		return 1;
	}
	int n = pbc_rmessage_size(message, "file");

	struct pbc_rmessage ** files = (struct pbc_rmessage **)_pbcM_malloc(n*(sizeof(struct pbc_rmessage *)));
	int i;
    int r = n;
	if (n == 0) {
		p->lasterror = "register empty";
		goto _error;
	}
	for (i=0;i<n;i++) {
		files[i] = pbc_rmessage_message(message, "file", i);
		if (files[i] == NULL) {
			p->lasterror = "register open fail";
			goto _error;
		}
	}

	
	do {
		int rr = _register_no_dependency(p,files , n);
		if (rr == r) {
			p->lasterror = "register dependency error";
			goto _error;
		}
		r = rr;
	} while (r>0);

	pbc_rmessage_delete(message);
    free(files);
	return 0;
_error:
	pbc_rmessage_delete(message);
    free(files);
	return 1;
}