Example #1
0
static ssize_t data_allocator_fixed_t_delete(data_t *data, fastcall_delete *fargs){ // {{{
	ssize_t                ret;
	allocator_fixed_t     *fdata          = (allocator_fixed_t *)data->ptr;
	
	pthread_rwlock_wrlock(&fdata->rwlock);
		
		if(fdata->removed_items.type){
			data_t        d_offset = DATA_PTR_UINTT(&fargs->offset);
			data_t        d_copy;
			
			fastcall_copy r_copy = { { 3, ACTION_COPY }, &d_copy };
			if( (ret = data_query(&d_offset, &r_copy)) < 0)
				goto exit;
			
			fastcall_push r_push   = {
				{ 3, ACTION_PUSH },
				&d_copy
			};
			if(data_query(&fdata->removed_items, &r_push) != 0){
				ret = -EFAULT;
				goto exit;
			}
		}
		// TODO move items
		//ret = allocator_removelastid(fdata);
	
exit:
	pthread_rwlock_unlock(&fdata->rwlock);
	return ret;
} // }}}
Example #2
0
static ssize_t data_allocator_fixed_t_create(data_t *data, fastcall_create *fargs){ // {{{
	ssize_t                ret;
	allocator_fixed_t     *fdata          = (allocator_fixed_t *)data->ptr;
	
	pthread_rwlock_wrlock(&fdata->rwlock);
		
		if(fdata->removed_items.type){
			data_t       d_offset = DATA_PTR_UINTT(&fargs->offset);
			data_t       d_copy;
			
			fastcall_pop r_pop    = {
				{ 3, ACTION_POP },
				&d_copy
			};
			if( (ret = data_query(&fdata->removed_items, &r_pop)) == 0)
				goto exit;
			
			fastcall_transfer r_transfer = { { 3, ACTION_TRANSFER }, &d_offset };
			ret = data_query(&d_copy, &r_transfer);
			goto exit;
		}
		
		ret = allocator_getnewid(fdata, &fargs->offset);
exit:
	pthread_rwlock_unlock(&fdata->rwlock);
	return ret;
} // }}}
Example #3
0
static ssize_t data_length_t_handler(data_t *data, fastcall_header *hargs){ // {{{
	ssize_t                ret;
	length_t              *fdata             = (length_t *)data->ptr;
	
	fastcall_length r_len = { { 4, ACTION_LENGTH }, 0, fdata->format };
	if( (ret = data_query(&fdata->data, &r_len)) < 0)
		return ret;
	
	data_t                 d_length          = DATA_PTR_UINTT(&r_len.length);
	return data_query(&d_length, hargs);
} // }}}
Example #4
0
uintmax_t   limit_parameter_get(machine_t *machine, limit_userdata *userdata){ // {{{
	switch(userdata->parameter){
		case PARAMETER_ONE:   return (machine->machine_type_hash.func_handler == &limit_machine_request_died) ? 0 : 1;
		case PARAMETER_TICKS: return userdata->usage_ticks_last;
		case PARAMETER_REQUEST:;
			uintmax_t buffer    = 0;
			request_t r_query[] = {
				{ HK(buffer), DATA_PTR_UINTT(&buffer) },
				hash_next(userdata->parameter_request)
			};
			machine_pass(machine, r_query);
			
			return buffer;
		default:
			break;
	};
	return 0;
} // }}}
Example #5
0
static ssize_t hashtable_handler(backend_t *backend, request_t *request){ // {{{
	ssize_t                ret;
	uint32_t               action;
	uintmax_t              d_input;
	hashtable_userdata    *userdata          = (hashtable_userdata *)backend->userdata;

	hash_data_copy(ret, TYPE_UINT32T, action,  request, HK(action));         if(ret != 0) return -ENOSYS;
	hash_data_copy(ret, TYPE_UINTT,   d_input, request, userdata->input);
	if(ret == 0){
		d_input = d_input % userdata->hashtable_size;
		
		request_t r_next[] = {
			{ userdata->input,  DATA_PTR_UINTT(&d_input) },
			hash_next(request)
		};
		return ( (ret = backend_pass(backend, r_next)) < 0 ) ? ret : -EEXIST;
	}
	return ( (ret = backend_pass(backend, request)) < 0 ) ? ret : -EEXIST;
} // }}}
Example #6
0
static ssize_t data_complexkey_t_lookup(data_t *data, fastcall_lookup *fargs){ // {{{
	ssize_t                ret;
	uintmax_t              key               = 0;
	data_t                 d_key             = DATA_PTR_UINTT(&key);
	complexkey_t          *fdata             = (complexkey_t *)data->ptr;
	
	if(fargs->value == NULL)
		return -EINVAL;
	
	data_get(ret, TYPE_UINTT, key, fargs->key);
	if(ret < 0)
		return ret;
	
	if(key == 0)
		return data_notconsumable_t(fargs->value, fdata->value);
	
	key--;
	
	fastcall_lookup r_lookup = { { 4, ACTION_LOOKUP }, &d_key, fargs->value };
	return data_query(&fdata->cnext, &r_lookup);
} // }}}