/* * Class: eu_vandertil_jerasure_jni_Galois * Method: galois_w16_region_multiply * Signature: ([BII[BZ)V */ JNIEXPORT void JNICALL Java_eu_vandertil_jerasure_jni_Galois_galois_1w16_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_w16_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; } } }