示例#1
0
/*
* Class:     eu_vandertil_jerasure_jni_Galois
* Method:    galois_w08_region_multiply
* Signature: ([BII[BZ)V
*/
JNIEXPORT void JNICALL Java_eu_vandertil_jerasure_jni_Galois_galois_1w08_1region_1multiply
	(JNIEnv *env, jclass clazz, jbyteArray jregion, jint multby, jint nbytes, jbyteArray jr2, jboolean add)
{
	jbyte* region = env->GetByteArrayElements(jregion, NULL);
	if(region == NULL) {
		throwOutOfMemoryError(env, "Error getting region from Java");
		return;
	}

	jbyte* r2 = NULL;
	if(jr2 != NULL)
	{
		r2 = env->GetByteArrayElements(jr2, NULL);
		if(r2 == NULL) {
			throwOutOfMemoryError(env, "Error getting r2 from Java");

			env->ReleaseByteArrayElements(jregion, region, NULL);
			return;
		}
	}

	galois_w08_region_multiply((char*)region, multby, nbytes, (char*)r2, (add == JNI_TRUE ? 1 : 0));

	env->ReleaseByteArrayElements(jregion, region, NULL);
	env->ReleaseByteArrayElements(jr2, r2, NULL);
}
/*
  Multiplies matrix_row by multiple stripes of vector data.
  matrix_row is of length row_len, as is data_ptrs.
  Each data_ptr points to data_size bytes: all the stripes of particular vector-component.
  Puts result in dst.
*/
void row_data_product(int* matrix_row, char** data_ptrs, char* dst, int row_len, int data_size, int w)
{
  //int size = num_stripes * (w/8);
  int size = data_size;
  int k = row_len;

  int init;
  char *dptr, *sptr;
  int i;

  if (w != 1 && w != 8 && w != 16 && w != 32) {
    fprintf(stderr, "ERROR: w is not 1, 8, 16 or 32\n");
    exit(1);
  }

  init = 0;

  dptr = dst;

  /* First copy or xor any data that does not need to be multiplied by a factor */

  for (i = 0; i < k; i++) {
    if (matrix_row[i] == 1) {

      sptr = data_ptrs[i];

      if (init == 0) {
        memcpy(dptr, sptr, size);
        //jerasure_total_memcpy_bytes += size;
        init = 1;
      } else {
        galois_region_xor(sptr, dptr, size);
        //jerasure_total_xor_bytes += size;
      }
    }
  }

  /* Now do the data that needs to be multiplied by a factor */

  for (i = 0; i < k; i++) {
    if (matrix_row[i] != 0 && matrix_row[i] != 1) {

      sptr = data_ptrs[i];

      switch (w) {
        case 8:  galois_w08_region_multiply(sptr, matrix_row[i], size, dptr, init); break;
        case 16: galois_w16_region_multiply(sptr, matrix_row[i], size, dptr, init); break;
        case 32: galois_w32_region_multiply(sptr, matrix_row[i], size, dptr, init); break;
      }
      //jerasure_total_gf_bytes += size;
      init = 1;
    }
  }
}