S triefort_put(TF * fort, const void * const buffer, const size_t bufferlen, void * const hash) { NULLCHK(fort); NULLCHK(buffer); NULLCHK(hash); const size_t hashlen = fort->cfg.hash_len; triefort_hasher_fn * hfn = fort->hcfg->hasher; if (0 != hfn(hash, hashlen, buffer, bufferlen)) { return triefort_err_hasher_error; } sds sdata_path = NULL; PANIC_IF(triefort_ok != mk_trie_dirs(fort, hash, hashlen, &sdata_path)); sdata_path = sdscat(sdata_path, "/triefort.data"); S s = triefort_ok; if (file_exists(sdata_path)) { s = triefort_err_hash_already_exists; } else { if (!file_exists(sdata_path)) { s = write_file(sdata_path, buffer, bufferlen); } } sdsfree(sdata_path); return s; }
/* Prepares and runs a handler from a receive event. */ static int ips_am_run_handler(const struct ips_message_header *p_hdr, struct ips_epaddr *ipsaddr, struct ips_proto_am *proto_am, uint64_t *payload, uint32_t paylen) { struct ips_am_token token; int nargs = p_hdr->amhdr_nargs; psm2_am_handler_fn_t hfn; psm2_amarg_t *args = (psm2_amarg_t *)p_hdr->data; token.tok.flags = p_hdr->flags; token.tok.epaddr_incoming = (psm2_epaddr_t)&ipsaddr->msgctl->master_epaddr; token.tok.can_reply = (_get_proto_hfi_opcode(p_hdr) == OPCODE_AM_REQUEST); token.epaddr_rail = ipsaddr; token.proto_am = proto_am; if (token.tok.flags & IPS_SEND_FLAG_AMISTINY) { /* Payload is packed into header after args */ payload = (uint64_t *)&p_hdr->data[nargs].u64; paylen = p_hdr->amhdr_len; /* Interpret amhdr_len == 0 as 16 bytes of payload */ if (paylen == 0) paylen = 1 << IPS_AM_HDR_LEN_BITS; } else { if (nargs > IPS_AM_HDR_NARGS) { /* Args are split across header and payload */ int payload_args_len = (nargs - IPS_AM_HDR_NARGS) * sizeof(psm2_amarg_t); args = alloca(PSMI_AM_MAX_ARGS * sizeof(psm2_amarg_t)); args[0].u64 = p_hdr->data[0].u64; args[1].u64 = p_hdr->data[1].u64; memcpy(&args[2], payload, payload_args_len); payload += nargs - IPS_AM_HDR_NARGS; paylen -= payload_args_len; } /* Subtract off padding bytes (dword padding) for non-TINY. */ paylen -= p_hdr->amhdr_len; } hfn = psm_am_get_handler_function(proto_am->proto->ep, p_hdr->amhdr_hidx); int ret = hfn(&token, args, nargs, payload, paylen); return ret; }
void psmi_am_handler(void *toki, psm2_amarg_t *args, int narg, void *buf, size_t len) { amsh_am_token_t *tok = (amsh_am_token_t *) toki; psm2_am_handler_fn_t hfn; psmi_assert(toki != NULL); hfn = psm_am_get_handler_function(tok->mq->ep, (psm2_handler_t) args[0].u32w0); /* Invoke handler function. For AM we do not support break functionality */ hfn(toki, args + 1, narg - 1, buf, len); return; }
S triefort_put_with_key(TF * fort, const void * const key, const size_t keylen, const void * const buffer, const size_t bufferlen, void * const hash) { NULLCHK(fort); NULLCHK(key); NULLCHK(buffer); NULLCHK(hash); if (keylen > fort->cfg.max_key_len) { return triefort_err_key_too_long; } triefort_hasher_fn * hfn = fort->hcfg->hasher; const size_t hashlen = fort->cfg.hash_len; if (0 != hfn(hash, hashlen, key, keylen)) { return triefort_err_hasher_error; } S s; sds dir_path = NULL; PANIC_IF(triefort_ok != mk_trie_dirs(fort, hash, hashlen, &dir_path)); sds skey_path = sdsdup(dir_path); sds sdata_path = sdsdup(dir_path); sdata_path = sdscat(sdata_path, "/triefort.data"); skey_path = sdscat(skey_path, "/triefort.key"); if (file_exists(sdata_path)) { s = triefort_err_hash_already_exists; } else { s = write_file(skey_path, key, keylen); if (triefort_ok == s) { s = write_file(sdata_path, buffer, bufferlen); } } sdsfree(skey_path); sdsfree(sdata_path); sdsfree(dir_path); return s; }