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; } // }}}
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; } // }}}
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); } // }}}
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; } // }}}
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; } // }}}
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); } // }}}