Exemple #1
0
static ssize_t try_handler(machine_t *machine, request_t *request){ // {{{
	ssize_t               ret;
	data_t                freeme;
	request_t            *try_request;
	try_userdata         *userdata          = (try_userdata *)machine->userdata;
	try_threaddata       *threaddata        = thread_data_get(&userdata->thread_data);
	
	threaddata->machine  = machine;
	threaddata->request  = request;
	threaddata->ret      = 0;
	
	data_set_void(&freeme);
	
	if(userdata->request == 0){
		try_request = request;
	}else{
		if( (ret = get_hash(hash_data_find(request, userdata->request), &freeme, &try_request)) < 0)
			return ret;
	}
	
	request_t r_next[] = {
		{ userdata->return_to, DATA_MACHINET(userdata->try_end) },
		hash_inline(try_request),
		hash_end
	};
	
	fastcall_query r_query = { { 3, ACTION_QUERY }, r_next };
	if( (ret = data_query(&userdata->machine, &r_query)) < 0){
		if(userdata->request == 0){
			request_t r_pass[] = {
				{ HK(ret), DATA_PTR_SIZET(&ret) },
				hash_inline(request),
				hash_end
			};
			threaddata->ret = machine_pass(machine, r_pass);
		}else{
			request_t r_pass[] = {
				{ HK(ret), DATA_PTR_SIZET(&ret) },
				hash_inline(try_request),
				hash_end
			};
			
			request_t r_next[] = {
				{ HK(ret),               DATA_PTR_SIZET(&ret)   },
				{ userdata->request_out, DATA_PTR_HASHT(r_pass) },
				hash_inline(request),
				hash_end
			};
			threaddata->ret = machine_pass(machine, r_next);
		}
	}
	
	data_free(&freeme);
	return threaddata->ret;
} // }}}
Exemple #2
0
static ssize_t try_end_handler(machine_t *machine, request_t *request){ // {{{
	try_userdata         *userdata          = (try_userdata *)machine->userdata;
	try_threaddata       *threaddata        = thread_data_get(&userdata->thread_data);
	
	if(userdata->request == 0){
		threaddata->ret = machine_pass(threaddata->machine, request);
	}else{
		request_t r_next[] = {
			{ userdata->request_out, DATA_PTR_HASHT(request) },
			hash_inline(threaddata->request),
			hash_end
		};
		threaddata->ret = machine_pass(threaddata->machine, r_next);
	}
	return 0;
} // }}}
Exemple #3
0
static ssize_t morph_handler(machine_t *machine, request_t *request){ // {{{
	ssize_t                ret;
	hash_t                *pipelines;
	morph_userdata        *userdata = (morph_userdata *)machine->userdata;

	if(userdata->running == 0){
		config_t  child_config[] = {
			{ 0, DATA_HASHT(
				hash_inline(request),
				hash_inline(userdata->machine_config),
				hash_end
			)},
			hash_end
		};
		if( (ret = pipelines_new(&pipelines, child_config)) < 0)
			return ret;
		
		userdata->running = 1;
		userdata->machine = pipelines[0].data.ptr;
		data_set_void(&pipelines[0].data);
		hash_free(pipelines);
		
		if(userdata->pass_first == 0)
			return 0;
	}

	return machine_pass(userdata->machine, request);
} // }}}
Exemple #4
0
static ssize_t implode_request(machine_t *machine, request_t *request){ // {{{
	implode_userdata      *userdata          = (implode_userdata *)machine->userdata;
	
	request_t r_next[] = {
		{ userdata->buffer, DATA_PTR_HASHT(request) },
		hash_inline(request),
		hash_end
	};
	return machine_pass(machine, r_next);
} // }}}
Exemple #5
0
static ssize_t murmur2_64_handler(machine_t *machine, request_t *request){ // {{{
	uint64_t               hash              = 0;
	data_t                *key               = NULL;
	murmur_userdata       *userdata          = (murmur_userdata *)machine->userdata;
	
	key = hash_data_find(request, userdata->input);
	if(key == NULL){
		if(userdata->fatal == 0)
			return machine_pass(machine, request);
		return error("input key not supplied");
	}
	
	hash = MurmurHash64A(key, 0);
	
	request_t r_next[] = {
		{ userdata->output, DATA_UINT64T(hash) },
		hash_next(request)
	};
	return machine_pass(machine, r_next);
} // }}}
Exemple #6
0
static ssize_t mutex_request(machine_t *machine, request_t *request){ // {{{
	ssize_t                ret;
	mutex_userdata        *userdata          = (mutex_userdata *)machine->userdata;
	
	pthread_mutex_lock(&userdata->mutex);
	
		ret = machine_pass(machine, request);
	
	pthread_mutex_unlock(&userdata->mutex);
	return ret;
} // }}}
Exemple #7
0
static ssize_t struct_machine_pack(machine_t *machine, request_t *request){
	ssize_t          ret;
	size_t           struct_size;
	data_t          *buffer;
	request_t       *values;
	struct_userdata *userdata = (struct_userdata *)machine->userdata;
		
	switch(userdata->values){
		case STRUCT_VALUES_WHOLE: values = request; break;
		case STRUCT_VALUES_ONE:
			hash_data_get(ret, TYPE_HASHT, values, request, userdata->key_values);
			if(ret != 0)
				return error("hash with keys not supplied");
			break;
	};
	
	if(userdata->lazy == 1){
		request_t r_next[] = {
			{ userdata->buffer, DATA_STRUCTT(userdata->structure, values) },
			hash_next(request)
		};
		
		return machine_pass(machine, r_next);
	}else{
		buffer = hash_data_find(request, userdata->buffer);
		if(buffer != NULL){
			if( (struct_size = struct_pack(userdata->structure, values, buffer)) == 0)
				return error("struct_pack failed");
			
			request_t new_request[] = {
				{ userdata->size, DATA_SIZET(struct_size) },
				hash_next(request)
			};
			
			return machine_pass(machine, new_request);
		}
		return machine_pass(machine, request);
	}
}
Exemple #8
0
static ssize_t debug_request(machine_t *machine, request_t *request){ // {{{
	ssize_t                ret;
	debug_userdata        *userdata          = (debug_userdata *)machine->userdata;
	
	if( (userdata->flags & DEBUG_BEFORE) != 0)
		debug_do(machine, request, DEBUG_BEFORE);
	
	ret = machine_pass(machine, request);
	
	if( (userdata->flags & DEBUG_AFTER) != 0)
		debug_do(machine, request, DEBUG_AFTER);
	
	return ret;
} // }}}
Exemple #9
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;
} // }}}
Exemple #10
0
static ssize_t struct_machine_unpack(machine_t *machine, request_t *request){
	ssize_t          ret;
	data_t          *buffer;
	request_t       *values;
	struct_userdata *userdata = (struct_userdata *)machine->userdata;
	
	buffer = hash_data_find(request, userdata->buffer);
	if(buffer != NULL){
		switch(userdata->values){
			case STRUCT_VALUES_WHOLE: values = request; break;
			case STRUCT_VALUES_ONE:
				hash_data_get(ret, TYPE_HASHT, values, request, userdata->key_values);
				if(ret != 0)
					return error("hash with keys not supplied");
				break;
		};
		
		if(struct_unpack(userdata->structure, values, buffer) == 0)
			return error("struct_unpack failed");
	}
	
	return machine_pass(machine, request);
}
Exemple #11
0
void *  ipc_shmem_listen  (void *ipc){ // {{{
	ipc_shmem_block    *block;
	ipc_shmem_userdata *userdata = (ipc_shmem_userdata *)((ipc_t *)ipc)->userdata;
	
	while(1){
		if( (block = shmem_get_block(userdata, STATUS_WRITTEN, STATUS_EXECUTING)) == NULL)
			break;
		
		// run request
		request_t req[] = {
			{ userdata->buffer, DATA_RAW( userdata->shmdata + block->data_rel_ptr, userdata->shmaddr->item_size ) },
			hash_end
		};
		machine_pass(((ipc_t *)ipc)->machine, req);
		
		// update status. if client don't want read results - free block, overwise notify client
		if(shmem_block_status(userdata, block, STATUS_EXECUTING, 
			((block->return_result == 0) ? STATUS_FREE : STATUS_EXEC_DONE)
		) < 0)
			break;
	}
	//error("ipc_shmem_listen dead\n");
	return NULL;
} // }}}
Exemple #12
0
void        limit_machine_action(machine_t *machine, rule *rule){ // {{{
	limit_userdata        *userdata          = (limit_userdata *)machine->userdata;
	
	switch(rule->action){
		case ACTION_DESTROY:;
			// set machine mode to died
			limit_set_handler(machine, &limit_machine_request_died);
			
			if(userdata->perfork_childs != &userdata->perfork_childs_own){
				// kill childs for forked shops, keep for initial
				pipeline_destroy(machine->cnext);
			}
			
			break;
		case ACTION_REQUEST:;
			machine_pass(machine, rule->action_request);
			break;
		default:
			break;
	};
	
	// update parameter
	userdata->usage_parameter = limit_parameter_get(machine, userdata);
} // }}}
Exemple #13
0
static ssize_t null_handler(machine_t *machine, request_t *request){ // {{{
	return machine_pass(machine, request);
} // }}}