Path: blob/master/test/hotspot/jtreg/vmTestbase/nsk/stress/jni/libjnistress001.cpp
41155 views
/*1* Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation.7*8* This code is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License11* version 2 for more details (a copy is included in the LICENSE file that12* accompanied this code).13*14* You should have received a copy of the GNU General Public License version15* 2 along with this work; if not, write to the Free Software Foundation,16* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.17*18* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA19* or visit www.oracle.com if you need additional information or have any20* questions.21*/2223#include <jni.h>24#include <stdio.h>25/* Changed from strings.h to string.h for Windows. */26#include <string.h>27#include <stdlib.h>28#include "jnihelper.h"2930extern "C" {3132#define DIGESTLENGTH 163334typedef struct {35const char **str;36char **checkstr;37} CHAR_ARRAY;3839typedef struct {40const jchar **str;41char **checkstr;42int *size;43} JCHAR_ARRAY;4445JNIEXPORT jstring JNICALL46Java_nsk_stress_jni_JNIter001_jnistress (JNIEnv *env, jobject jobj, jstring jstr,47jint nstr, jint printperiod) {4849int i,j;50size_t k;51static CHAR_ARRAY *element;52unsigned char digest[DIGESTLENGTH];53static int allocs=0;54static size_t strsize=0;55static unsigned int compared=1;5657const char *clsName = "nsk/stress/jni/JNIter001";58const char *name="setpass";59const char *sig="(Z)V";60const char *halt="halt";61const char *haltSig="()V";62jstring tmpstr;63jclass clazz;64jmethodID methodID;6566env->MonitorEnter(jobj); CE67if (!allocs) {68element = (CHAR_ARRAY *)c_malloc(env, sizeof(CHAR_ARRAY));69element->str = (const char **)c_malloc(env, nstr*sizeof(const char *));70element->checkstr = (char **)c_malloc(env, nstr*sizeof(char *));71for (j=0;j<nstr;j++)72element->checkstr[j] = (char *)c_malloc(env, DIGESTLENGTH*sizeof(char));73}74for (j=0;j<DIGESTLENGTH;j++) {75digest[j]=0;76}77element->str[allocs] = env->GetStringUTFChars(jstr,0); CE78if (strlen(element->str[allocs]) !=79(size_t) env->GetStringUTFLength(jstr))80printf("Length is wrong in string No. %d\n",allocs);81else82strsize += strlen(element->str[allocs])+1;83for (k = 0; k < strlen(element->str[allocs]); k++) {84digest[k % DIGESTLENGTH] += element->str[allocs][k];85}86memcpy(element->checkstr[allocs],digest,DIGESTLENGTH);87allocs++;88if (allocs % printperiod == 0) {89printf("Check string for thread %s is ", element->str[allocs-1]);90for (j=0;j<DIGESTLENGTH;j++)91printf("%02x", digest[j]);92printf("\n");93}94if (allocs == nstr) {95printf("JNI UTF8 strings memory=%zd\n", strsize);96tmpstr=env->NewStringUTF(element->str[allocs-1]); CE97for (j=0; j<nstr; j++) {9899for (i=0;i<DIGESTLENGTH;i++) {100digest[i]=0;101}102for (k=0; k < strlen(element->str[j]); k++) {103digest[k % DIGESTLENGTH] += element->str[j][k];104}105if (memcmp(digest,element->checkstr[j],DIGESTLENGTH) == 0) {106env->ReleaseStringUTFChars(jstr,element->str[j]); CE107element->str[j] = NULL;108element->checkstr[j] = NULL;109}110else {111compared=0;112printf("The element No. %d has been corrupted %s vs %s\n",j, element->str[j],element->checkstr[j]);113printf("Digest string is %s [", element->str[j]);114for (i=0;i<DIGESTLENGTH;i++)115printf("ch[%d]=%02x", i, digest[i]);116printf("Digest end\n");117}118}119allocs=0;120strsize = 0;121for (j=0;j<nstr;j++)122free(element->checkstr[j]);123free(element->checkstr);124free((void *)(element->str));125free(element);126clazz=env->FindClass(clsName); CE127if (!compared) {128methodID=env->GetStaticMethodID(clazz, name, sig); CE129env->CallStaticVoidMethod(clazz, methodID, JNI_FALSE); CE130}131//methodID=env->GetStaticMethodID(clazz, halt, haltSig); CE132//env->CallStaticVoidMethod(clazz, methodID); CE133return(tmpstr);134}135env->MonitorExit(jobj); CE136return (env->NewStringUTF(element->str[allocs-1]));137}138139JNIEXPORT jstring JNICALL140Java_nsk_stress_jni_JNIter001_jnistress1(JNIEnv *env, jobject jobj, jstring jstr,141jint nstr, jint printperiod) {142143int i,j;144static JCHAR_ARRAY *javachars;145unsigned char digest[DIGESTLENGTH];146static int index=0;147static long len=0;148static unsigned int equal=1;149char *elem;150int elem_len = -1;151152const char *clsName = "nsk/stress/jni/JNIter001";153const char *name="setpass";154const char *sig="(Z)V";155const char *halt="halt";156const char *haltSig="()V";157jstring tmpstr;158jclass clazz;159jmethodID methodID;160161env->MonitorEnter(jobj); CE162if (!index) {163javachars = (JCHAR_ARRAY *)c_malloc(env, sizeof(JCHAR_ARRAY));164javachars->str = (const jchar **)c_malloc(env, nstr*sizeof(const jchar *));165javachars->checkstr = (char **)c_malloc(env, nstr*sizeof(char *));166javachars->size = (int *)c_malloc(env, nstr*sizeof(int));167for (j=0;j<nstr;j++)168javachars->checkstr[j] = (char *)c_malloc(env, DIGESTLENGTH*sizeof(char));169}170for (j=0;j<DIGESTLENGTH;j++) {171digest[j]=0;172}173javachars->str[index] = env->GetStringChars(jstr,0); CE174javachars->size[index] = env->GetStringUTFLength(jstr); CE175elem_len = javachars->size[index];176len += elem_len;177elem = (char*) c_malloc(env, elem_len*sizeof(char));178for (j=0; j < elem_len; j++) {179elem[j] = (char) javachars->str[index][j];180}181182//memcpy(digest, elem, javachars->size[index]);183for (j=0;j<elem_len; j++) {184digest[j % DIGESTLENGTH]+=elem[j];185}186memcpy(javachars->checkstr[index++],digest,DIGESTLENGTH);187if (index % printperiod == 0) {188printf("Check string sum for thread %.*s is ", elem_len, elem);189for (j=0;j<DIGESTLENGTH;j++)190printf("%02x", digest[j]);191printf("\n");192}193free(elem);194if (index == nstr) {195printf("JNI Unicode strings memory=%ld\n",len);196tmpstr=env->NewString(javachars->str[index-1],elem_len); CE197for (j=0; j<nstr; j++) {198elem = (char*) c_malloc(env, javachars->size[j]*sizeof(char));199for (i=0; i < javachars->size[j]; i++) {200elem[i] = (char) javachars->str[j][i];201}202//memcpy(digest, elem, javachars->size[j]);203for (i=0;i<DIGESTLENGTH;i++) {204digest[i]=0;205}206for (i=0;i<javachars->size[j]; i++) {207digest[i % DIGESTLENGTH]+=elem[i];208}209free(elem);210if (memcmp(digest,javachars->checkstr[j],javachars->size[j]) == 0) {211env->ReleaseStringChars(jstr,javachars->str[j]); CE212javachars->str[j] = NULL;213javachars->checkstr[j] = NULL;214javachars->size[j] = 0;215}216else {217equal=0;218printf("The Unicode element No. %d has been corrupted\n",j);219for (i=0;i<DIGESTLENGTH;i++) {220printf("digest[%d]=%02x checkstr[%d]=%02x\n",i,digest[i],i,javachars->checkstr[j][i]);221}222}223}224index=0;225len = 0;226for (j=0;j<nstr;j++)227free(javachars->checkstr[j]);228free(javachars->checkstr);229free((void *)(javachars->str));230free(javachars->size);231free(javachars);232clazz=env->FindClass(clsName); CE233if (!equal) {234methodID=env->GetStaticMethodID(clazz, name, sig); CE235env->CallStaticVoidMethod(clazz, methodID, JNI_FALSE); CE236}237//methodID=env->GetStaticMethodID(clazz, halt, haltSig); CE238//env->CallStaticVoidMethod(clazz, methodID); CE239return(tmpstr);240}241env->MonitorExit(jobj); CE242return(env->NewString(javachars->str[index-1],elem_len));243}244245}246247248