예제 #1
0
파일: triefort.c 프로젝트: sw17ch/triefort
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;
}
예제 #2
0
/* 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;
}
예제 #3
0
파일: ptl.c 프로젝트: 01org/opa-psm2
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;
}
예제 #4
0
파일: triefort.c 프로젝트: sw17ch/triefort
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;
}