From a2e2dd6f27e1dc62f2c042b022ef9bb3ec4a7d0a Mon Sep 17 00:00:00 2001 From: Pedro Monteiro Date: Tue, 19 Aug 2014 10:28:47 -0300 Subject: [PATCH 1/5] Saving statics from fields of classes and updating before exit(). Added logger. HI 1 achieved --- src/jamvm/jamvm-1.5.4/src/alloc.c | 1 + src/jamvm/jamvm-1.5.4/src/class.c | 200 ++++++++++++++++--- src/jamvm/jamvm-1.5.4/src/jam.c | 82 +++++++- src/jamvm/jamvm-1.5.4/src/jam.h | 1 + src/jamvm/jamvm-1.5.4/src/nvm/utils/logger.h | 48 +++++ src/jamvm/jamvm-1.5.4/src/utf8.c | 2 +- 6 files changed, 305 insertions(+), 29 deletions(-) create mode 100644 src/jamvm/jamvm-1.5.4/src/nvm/utils/logger.h diff --git a/src/jamvm/jamvm-1.5.4/src/alloc.c b/src/jamvm/jamvm-1.5.4/src/alloc.c index d7d0b0d8..faae66ba 100644 --- a/src/jamvm/jamvm-1.5.4/src/alloc.c +++ b/src/jamvm/jamvm-1.5.4/src/alloc.c @@ -2031,6 +2031,7 @@ void *gcMalloc(int len) { fclose(freeListFile); } + return ret_addr; } diff --git a/src/jamvm/jamvm-1.5.4/src/class.c b/src/jamvm/jamvm-1.5.4/src/class.c index 1ddc0a6d..0152ea9b 100644 --- a/src/jamvm/jamvm-1.5.4/src/class.c +++ b/src/jamvm/jamvm-1.5.4/src/class.c @@ -29,6 +29,10 @@ #include #include #include +#include +#include +#include + #include "jam.h" #include "sig.h" @@ -123,9 +127,14 @@ char *FILENAME_CLASSES_NAMES = "classes.cn"; int testing_mode_classes = FALSE; FILE *hash_file_classes; FILE *name_file_classes; +FILE *statics_file_classes; int pointer_file_exists_classes = FALSE; int name_file_exists_classes = FALSE; int classes_ht_initialized = FALSE; +int statics_file_initialized = FALSE; +LogLevel log_level; + +struct stat st = {0}; @@ -304,13 +313,9 @@ Class *searchClass(char *classname, char *data, int offset, int len, Object *cla buff[length] = '\0'; ptr += length; - //Changed this part to save utf8 entries of classes with classloaders - if(class_to_save){ - CP_INFO(constant_pool,i) = (uintptr_t) (utf8 = newUtf8Save(buff)); - } - else{ - CP_INFO(constant_pool,i) = (uintptr_t) (utf8 = newUtf8(buff)); - } + + CP_INFO(constant_pool,i) = (uintptr_t) (utf8 = newUtf8(buff)); + if(utf8 != buff) sysFree(buff); @@ -342,16 +347,12 @@ Class *searchClass(char *classname, char *data, int offset, int len, Object *cla // Unit tests if(testing_mode_classes) { - FILE *test_output = fopen("testsoutput.txt", "a+"); - fprintf(test_output, (const char*)classname); - fprintf(test_output, "\n"); if(result == NULL){ log_test_results("searchClass_foundClass", FALSE); } else{ log_test_results("searchClass_foundClass", TRUE); } - fclose(test_output); } return result; @@ -360,9 +361,12 @@ Class *searchClass(char *classname, char *data, int offset, int len, Object *cla Class *defineClass(char *classname, char *data, int offset, int len, Object *class_loader) { + //NVM Variables int reload = FALSE; Class *result = NULL; + + //NVM MODIFICATION if(is_persistent_classes){ if(class_loader != NULL){ class_to_save = TRUE; @@ -379,6 +383,7 @@ Class *defineClass(char *classname, char *data, int offset, int len, reload = FALSE; } } + //END OF MODIFICATION @@ -403,6 +408,8 @@ Class *defineClass(char *classname, char *data, int offset, int len, READ_U2(minor_version, ptr, len); READ_U2(major_version, ptr, len); + + //NVM MOFICIATION (FIRST IF CLAUSE. ELSE IS VOLATILE FLUX) if(reload == TRUE){ class = result; } @@ -410,6 +417,8 @@ Class *defineClass(char *classname, char *data, int offset, int len, if((class = allocClass()) == NULL) return NULL; } + //END OF MODIFICATION + classblock = CLASS_CB(class); READ_U2(cp_count, ptr, len); @@ -474,6 +483,7 @@ Class *defineClass(char *classname, char *data, int offset, int len, buff[length] = '\0'; ptr += length; + //NVM MODIFICATION //Changed this part to save utf8 entries of classes with classloaders if(class_to_save){ CP_INFO(constant_pool,i) = (uintptr_t) (utf8 = newUtf8Save(buff)); @@ -481,6 +491,7 @@ Class *defineClass(char *classname, char *data, int offset, int len, else{ CP_INFO(constant_pool,i) = (uintptr_t) (utf8 = newUtf8(buff)); } + //END OF MODIFICATION if(utf8 != buff) sysFree(buff); @@ -527,6 +538,51 @@ Class *defineClass(char *classname, char *data, int offset, int len, classblock->super_name = CP_UTF8(constant_pool, CP_CLASS(constant_pool, super_idx)); } + // XXX NVM MODIFICATION + if(is_persistent_classes){ + if(class_loader != NULL){ + int file_exists; + //Check if fields folder exists, if not create it + if (stat("fields", &st) == -1) { + mkdir("fields", 0700); + } + //Malloc the size of the classname plus fields/ (7) plus .fld (4) plus \0 (1) + char *file_name = (char*)calloc(1, sizeof(classblock->name)+12); + strcat(file_name,"fields/"); + strcat(file_name, classblock->name); + strcat(file_name, ".fld\0"); + + if(access(file_name, F_OK) == -1) { + + if(testing_mode_classes){ + log_level = DEBUG; + char log[100]; + sprintf(log, "Creating field file: %s", file_name); + log(log_level, log); + } + + statics_file_classes = fopen(file_name, "wr+b"); + fclose(statics_file_classes); + } + + + + //Unit Tests + if(testing_mode_classes){ + if(access(file_name, F_OK) != -1) { + file_exists = TRUE; + } + else{ + file_exists = FALSE; + } + log_test_results("defineClass_fileExists", file_exists); + } + } + } + //END OF MODIFICATION + + + classblock->class_loader = class_loader; @@ -951,8 +1007,97 @@ void prepareFields(Class *class) { for(i = 0; i < cb->fields_count; i++) { FieldBlock *fb = &cb->fields[i]; - if(fb->access_flags & ACC_STATIC) - fb->u.static_value.l = 0; + if(fb->access_flags & ACC_STATIC){ + fb->u.static_value.l = 0; + + //XXX NVM MODIFICATION + if(is_persistent_classes){ + if(CLASS_CB(class)->class_loader != NULL){ + // Calloc the size of the classname plus fields/ (7) plus .fld (4) plus \0 (1) + char *file_name = (char*)calloc(1, strlen(CLASS_CB(class)->name) + 12); + strcat(file_name,"fields/"); + strcat(file_name, CLASS_CB(class)->name); + strcat(file_name, ".fld\0"); + + if(testing_mode_classes){ + log_level = DEBUG; + char log[100]; + sprintf(log, "Initializing variable from field file: %s", file_name); + log(log_level, log); + } + + // FIELD FILE STRUCTURE + // HEADER (number of chars) | VAR NAME | POINTER TO VALUE | VALUE + + // Reading field file + statics_file_classes = fopen(file_name, "r+b"); + size_t len = 0; + unsigned short string_length; + long long *pointer; + long long value = 0; + int reload_variable = FALSE; + + len = fread(&string_length, sizeof(unsigned short), 1, statics_file_classes); + + while (len == 1) { + char *var_name = (char*)calloc(1, (string_length * sizeof(char)) + 1); + fread(var_name, sizeof(char), string_length, statics_file_classes); + var_name[string_length] = 0; + + if(testing_mode_classes){ + log_level = DEBUG; + char log[100]; + sprintf(log, "Variable: %s", var_name); + log(log_level, log); + } + + if(strcmp(var_name, fb->name) == 0){ + reload_variable = TRUE; + pointer = &(fb->u.static_value.l); + fwrite(&pointer, sizeof(long long*), 1, statics_file_classes); + fread(&value, sizeof(long long), 1, statics_file_classes); + + if(testing_mode_classes){ + log_level = DEBUG; + char log[100]; + sprintf(log, "Found match in field file for variable %s. Assigning value %d", var_name, value); + log(log_level, log); + } + + fb->u.static_value.l = value; + } + + + + len = fread(&string_length, sizeof(unsigned short), 1, statics_file_classes); + + } + fclose(statics_file_classes); + + // Adding entry to field file + if(reload_variable == FALSE){ + statics_file_classes = fopen(file_name, "r+b"); + string_length = strlen(fb->name); + fwrite(&string_length, sizeof(unsigned short), 1, statics_file_classes); + fwrite(fb->name, sizeof(char), string_length, statics_file_classes); + pointer = &(fb->u.static_value.l); + fwrite(&pointer, sizeof(long long*), 1, statics_file_classes); + fwrite(&value, sizeof(long long), 1, statics_file_classes); + fclose(statics_file_classes); + + printf("Added entries to field file for variable: %s\n", fb->name); + + } + + // UNIT TESTS + if(testing_mode_classes){ + log_test_results("pepareFields_reloadVariable", reload_variable); + } + } + } + // END OF MODIFICATION + } + else { FieldBlock **list; @@ -1626,13 +1771,16 @@ void initializeClassesHT(Object *class_loader){ int count_hash_entries = 0; //Testing variable int count_name_entries = 0; //Testing variable - Object *vmdata = allocObject(ldr_new_unloader->class); - HashTable *table = sysMalloc(sizeof(HashTable)); - initHashTable((*table), CLASS_INITSZE, TRUE); - - INST_DATA(vmdata, HashTable*, ldr_data_tbl_offset) = table; - INST_DATA(class_loader, Object*, ldr_vmdata_offset) = vmdata; - + Object *vmdata = INST_DATA(class_loader, Object*, ldr_vmdata_offset); + HashTable *table; + if(vmdata == NULL){ + vmdata = allocObject(ldr_new_unloader->class); + table = calloc(1, sizeof(HashTable)); + initHashTable((*table), CLASS_INITSZE, TRUE); + } + else{ + INST_DATA(vmdata, HashTable*, ldr_data_tbl_offset) = table; + } if(access (FILENAME_CLASSES_HT, F_OK) != -1) { pointer_file_exists_classes = TRUE; } @@ -1640,8 +1788,8 @@ void initializeClassesHT(Object *class_loader){ name_file_exists_classes = TRUE; } if((pointer_file_exists_classes == TRUE) && (name_file_exists_classes == TRUE)) { - hash_file_classes = fopen (FILENAME_CLASSES_HT, "rb"); - name_file_classes = fopen (FILENAME_CLASSES_NAMES, "rb"); + hash_file_classes = fopen (FILENAME_CLASSES_HT, "r+b"); + name_file_classes = fopen (FILENAME_CLASSES_NAMES, "r+b"); if((hash_file_classes == NULL) || (name_file_classes == NULL)) { printf("ERROR: error trying to open classes hash table context files\n"); exit(EXIT_FAILURE); @@ -1649,7 +1797,7 @@ void initializeClassesHT(Object *class_loader){ size_t len_pointer = 0; size_t len_string = 0; Class *interned = NULL; - Class *to_add = (Class*)malloc(sizeof(Class*)); + Class *to_add = (Class*)calloc(1, sizeof(Class*)); len_pointer = fread(&to_add, sizeof(Class*), 1, hash_file_classes); while (len_pointer == 1) { do { @@ -1657,7 +1805,7 @@ void initializeClassesHT(Object *class_loader){ unsigned short string_length = 0; len_string = fread(&string_length, sizeof(unsigned short), 1, name_file_classes); - char *class_name = (char*)malloc(string_length * sizeof(char)); + char *class_name = (char*)calloc(1, string_length * sizeof(char)); int count = fread(class_name, sizeof(char), string_length, name_file_classes); if(count == string_length){ @@ -1929,7 +2077,7 @@ Class* findInFile (char* name_to_find){ while ((read = getline(&line, &len, file)) != -1) { char *name_to_add; - name_to_add = malloc(read*sizeof(char)); + name_to_add = calloc(1 ,read*sizeof(char)); strcpy(name_to_add, line); name_to_add[strlen(name_to_add)-1] = 0; @@ -1939,7 +2087,7 @@ Class* findInFile (char* name_to_find){ if (!strcmp(name_to_find,name_to_add)){ for (i = 0; i < 3; i++){ if ((read = getline(&line, &len, file)) != -1){ - name_to_add = malloc(read*sizeof(char)); + name_to_add = calloc(1, read*sizeof(char)); strcpy(name_to_add, line); name_to_add[strlen(name_to_add)-1] = 0; pointer = (int) strtoll (name_to_add,NULL,16); diff --git a/src/jamvm/jamvm-1.5.4/src/jam.c b/src/jamvm/jamvm-1.5.4/src/jam.c index 71cddab2..f9b982d0 100644 --- a/src/jamvm/jamvm-1.5.4/src/jam.c +++ b/src/jamvm/jamvm-1.5.4/src/jam.c @@ -23,12 +23,17 @@ #include #include #include +#include +#include +#include #include "jam.h" #include "class.h" #include "symbol.h" #include "excep.h" + LogLevel log_level; + #ifdef USE_ZIP #define BCP_MESSAGE "" #else @@ -363,6 +368,9 @@ int main(int argc, char *argv[]) { int i; initialise_tests_file(); + initialise_log_file(); + log_level = INFO; + log(log_level, "Starting JamVM main()"); setDefaultInitArgs(&args); class_arg = parseCommandLine(argc, argv, &args); @@ -404,8 +412,12 @@ int main(int argc, char *argv[]) { break; /* Call the main method */ - if(i == argc) - executeStaticMethod(main_class, mb, array); + if(i == argc){ + log_level = INFO; + log(log_level, "Starting Java main()"); + + executeStaticMethod(main_class, mb, array); + } } error: @@ -416,6 +428,72 @@ int main(int argc, char *argv[]) { /* Wait for all but daemon threads to die */ mainThreadWaitToExitVM(); + + /* XXX NVM Modification - Saving fields context for each file in fields folder */ + + if(args.testing_mode == TRUE){ + log_level = TRACE; + log(log_level, "Saving fields context before exit()") + } + + if(args.persistent_heap == TRUE){ + DIR *dp; + struct dirent *ep; + FILE *field_file; + unsigned short string_length; + long long *pointer, pointer_to_value; + long long value = 0; + size_t len; + + dp = opendir ("fields"); + if (dp != NULL) { + while (ep = readdir (dp)) { + if(strcmp(ep->d_name, ".") != 0 && strcmp(ep->d_name, "..") != 0){ + // Calloc the size of file name plus "fields/" (7) plus /0 (1) + char *file_name = (char*)calloc(1, sizeof(ep->d_name) + 8); + strcat(file_name, "fields/"); + strcat(file_name, ep->d_name); + + if(args.testing_mode == TRUE){ + log_level = DEBUG; + char log[100]; + sprintf(log, "Saving context from %s file", file_name); + log(log_level, log); + } + + field_file = fopen(file_name, "r+b"); + + len = fread(&string_length, sizeof(unsigned short), 1, field_file); + + + while (len == 1) { + char *var_name = (char*)calloc(1, (string_length * sizeof(char)) + 1); + fread(var_name, sizeof(char), string_length, field_file); + var_name[string_length] = 0; + fread(&pointer, sizeof(long long*), 1, field_file); + pointer_to_value = &value; + memcpy(pointer_to_value, pointer, sizeof(long long)); + fwrite(&value, sizeof(long long), 1, field_file); + + if(args.testing_mode == TRUE){ + log_level = DEBUG; + char log[100]; + sprintf(log, "Variable %s has value %d before exit", var_name, value); + log(log_level, log); + } + + len = fread(&string_length, sizeof(unsigned short), 1, field_file); + } + + } + + } + closedir (dp); + } else + printf ("Couldn't open fields folder\n"); + } + /* END OF MODIFICATION */ + exitVM(status); /* Keep the compiler happy */ diff --git a/src/jamvm/jamvm-1.5.4/src/jam.h b/src/jamvm/jamvm-1.5.4/src/jam.h index 8c3eeaf4..92451169 100644 --- a/src/jamvm/jamvm-1.5.4/src/jam.h +++ b/src/jamvm/jamvm-1.5.4/src/jam.h @@ -33,6 +33,7 @@ /* NVM specific includes */ #include "nvm/test/testing_utils.h" +#include "nvm/utils/logger.h" #ifndef TRUE #define TRUE 1 diff --git a/src/jamvm/jamvm-1.5.4/src/nvm/utils/logger.h b/src/jamvm/jamvm-1.5.4/src/nvm/utils/logger.h new file mode 100644 index 00000000..f96efdd6 --- /dev/null +++ b/src/jamvm/jamvm-1.5.4/src/nvm/utils/logger.h @@ -0,0 +1,48 @@ +/* + * logger.h + * + * Created on: Aug 18, 2014 + * Author: lis + */ + +#ifndef LOGGER_H_ +#define LOGGER_H_ + +#include +#include + +typedef enum {INFO, DEBUG, TRACE, ERROR} LogLevel; + + +#define initialise_log_file(){ \ + FILE *f; \ + f = fopen("log.txt", "w+"); \ + fclose(f); \ +} + +#define log(level, content){ \ + char level_name[6]; \ + switch (level) \ + { \ + case INFO: strcpy(level_name, "INFO"); break; \ + case DEBUG: strcpy(level_name, "DEBUG"); break; \ + case TRACE: strcpy(level_name, "TRACE"); break; \ + case ERROR: strcpy(level_name, "ERROR"); break; \ + } \ + FILE *f; \ + f = fopen("log.txt", "a+"); \ + time_t timer; \ + char buffer[25]; \ + struct tm* tm_info; \ + time(&timer); \ + tm_info = localtime(&timer); \ + strftime(buffer, 25, "%Y:%m:%d\t%H:%M:%S", tm_info); \ + printf("%s\t %s\t %s\n", buffer, level_name, content); \ + fprintf(f, "%s\t %s\t %s\n", buffer, level_name, content); \ + fclose(f); \ +} + + + + +#endif /* LOGGER_H_ */ diff --git a/src/jamvm/jamvm-1.5.4/src/utf8.c b/src/jamvm/jamvm-1.5.4/src/utf8.c index 062e4eaf..e28f1eab 100644 --- a/src/jamvm/jamvm-1.5.4/src/utf8.c +++ b/src/jamvm/jamvm-1.5.4/src/utf8.c @@ -196,7 +196,7 @@ void initialiseUtf8Persistent(){ while (len == 1) { char *interned = NULL; - char *to_add = (char*)malloc(string_length * sizeof(char)); + char *to_add = (char*)sysMalloc(string_length * sizeof(char)); int count = fread(to_add, sizeof(char), string_length, hash_file_utf8); do { addHashEntry((*hash_table), to_add, interned); From 51eb5af7eb7f0b212ae4a7025dda1528ac2ef24b Mon Sep 17 00:00:00 2001 From: Pedro Monteiro Date: Tue, 19 Aug 2014 10:41:21 -0300 Subject: [PATCH 2/5] Fixed a log in class.c --- src/jamvm/jamvm-1.5.4/src/class.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/jamvm/jamvm-1.5.4/src/class.c b/src/jamvm/jamvm-1.5.4/src/class.c index 0152ea9b..d75870fc 100644 --- a/src/jamvm/jamvm-1.5.4/src/class.c +++ b/src/jamvm/jamvm-1.5.4/src/class.c @@ -1067,8 +1067,6 @@ void prepareFields(Class *class) { fb->u.static_value.l = value; } - - len = fread(&string_length, sizeof(unsigned short), 1, statics_file_classes); } @@ -1085,7 +1083,12 @@ void prepareFields(Class *class) { fwrite(&value, sizeof(long long), 1, statics_file_classes); fclose(statics_file_classes); - printf("Added entries to field file for variable: %s\n", fb->name); + if(testing_mode_classes){ + log_level = DEBUG; + char log[100]; + sprintf(log,"Added entries to field file for variable: %s", fb->name); + log(log_level, log); + } } From d2a00fa4d52c97b1f6e627472cb256457bf69b5f Mon Sep 17 00:00:00 2001 From: Pedro Monteiro Date: Fri, 22 Aug 2014 11:32:34 -0300 Subject: [PATCH 3/5] Added support for non-primitive attributes. --- src/jamvm/jamvm-1.5.4/Hello.class | Bin 0 -> 1118 bytes src/jamvm/jamvm-1.5.4/src/Hello.class | Bin 0 -> 1128 bytes src/jamvm/jamvm-1.5.4/src/Hello.java | 19 +++++++ src/jamvm/jamvm-1.5.4/src/class.c | 70 ++++++++++++++++++++------ src/jamvm/jamvm-1.5.4/src/jam.c | 28 ++++++++--- 5 files changed, 97 insertions(+), 20 deletions(-) create mode 100644 src/jamvm/jamvm-1.5.4/Hello.class create mode 100644 src/jamvm/jamvm-1.5.4/src/Hello.class create mode 100644 src/jamvm/jamvm-1.5.4/src/Hello.java diff --git a/src/jamvm/jamvm-1.5.4/Hello.class b/src/jamvm/jamvm-1.5.4/Hello.class new file mode 100644 index 0000000000000000000000000000000000000000..f20df1f1fc6a604914ff17fe5000f181d90e3c35 GIT binary patch literal 1118 zcmaJ<+int36kUhg4AWDf6k0D-TW=kz1+`jl)!G&j2=Nk(iSfk&Ce1W+Avl=u1%8H) zJ{pH)NHkHO{V3x;Lk%jWFK4g4*FIE*eh|& zV_l$vf+DU8_nL683$!874S{Y7v?+C4nmV~9hM3i_JK`d%F-TUwY&x3AEEBb5*oOOnA*|+KGDP;A zHeE{A4O@TGvzmJMg%&&$u{6VGSWsV2YKx0X!|8Qfdf5<~N<}wKryz>tIE!ToTO9X6 zDvSRYzS}d*w%#TEN_ClI8xJ|MSm4;fu7o{~5*~3Z;)LMJ94B!~pvN4ikrSxGv4k@M zQQvHb<`9T8q{dQDn+JM}8vZNP=)ZM!i)5W15!q2whEse-6Lx8)x@OT#V_K)9+iiw* z^@z47LWj+WWx39uWo6X-L?UI(2j%^%NXzL6eUm1gJxY-Vol~om?~R3XYUy~oc0664 zPGg0>WrjX_6tdV6Az5rDu(X%J(pCaXJ0Tka6Z@xgg}f!QjBIpm2=eG}FvNa4_K)_%nR; z(KsYSqKW$Kk20P+)Sy!Oa?f|pckcbpa)18%@(sWSY6>z~jYCCV!kU6GR%Kii_EH@4 zSQn_Epoq)Dy&~MJ0&NI%O`z)nZ3=WlpqnyoNw_WH4ufp<8*bOI_ZZUkeeIoAG&Os# zIEoP;wfa@tWnk4Hx8(GircQ2&A!haKj=0Eb43gC^n~o+j%S3G%w&C7m2&?%Q43S-@ zO_!2&!`2`7tft<5t_9CTEX}YP7Sz|1+Tx>?SiP3<205f zY;oKLNiF_g{Z7v?+j^IZs8p9Z?&ASR77HBP*paZyQNlxxMH~}cnd3N42=s{KBys{( zIF@iqAZng%Q#s=b7*b=sC(V7mMXmo8YV_Z_x<%SfkBIE3J;NzJrCGZ)U0t(ix-qTO z(d{access_flags & ACC_STATIC){ fb->u.static_value.l = 0; + //XXX NVM MODIFICATION if(is_persistent_classes){ if(CLASS_CB(class)->class_loader != NULL){ @@ -1027,44 +1028,70 @@ void prepareFields(Class *class) { } // FIELD FILE STRUCTURE - // HEADER (number of chars) | VAR NAME | POINTER TO VALUE | VALUE + // HEADER (number of chars) | VAR NAME | POINTER TO VALUE | PRIMITIVE BOOL | VALUE // Reading field file statics_file_classes = fopen(file_name, "r+b"); size_t len = 0; unsigned short string_length; long long *pointer; + void *pnt; long long value = 0; int reload_variable = FALSE; + int primitive = FALSE; len = fread(&string_length, sizeof(unsigned short), 1, statics_file_classes); + if(testing_mode_classes){ + log_level = DEBUG; + char log[100]; + sprintf(log, "Variable: %s", fb->name); + log(log_level, log); + } + while (len == 1) { char *var_name = (char*)calloc(1, (string_length * sizeof(char)) + 1); fread(var_name, sizeof(char), string_length, statics_file_classes); var_name[string_length] = 0; - if(testing_mode_classes){ - log_level = DEBUG; - char log[100]; - sprintf(log, "Variable: %s", var_name); - log(log_level, log); - } if(strcmp(var_name, fb->name) == 0){ reload_variable = TRUE; pointer = &(fb->u.static_value.l); - fwrite(&pointer, sizeof(long long*), 1, statics_file_classes); - fread(&value, sizeof(long long), 1, statics_file_classes); + fwrite(&pointer, sizeof(void *), 1, statics_file_classes); + fread(&primitive, sizeof(int), 1, statics_file_classes); + if(primitive == TRUE){ + fread(&value, sizeof(long long), 1, statics_file_classes); + fb->u.static_value.l = value; + } + else{ + fread(&pnt, sizeof(void *), 1, statics_file_classes); + fb->u.static_value.p = pnt; + } if(testing_mode_classes){ log_level = DEBUG; char log[100]; - sprintf(log, "Found match in field file for variable %s. Assigning value %d", var_name, value); + if(primitive == TRUE){ + sprintf(log, "Found match in field file for variable %s. Assigning value %x", var_name, value); + } + else{ + sprintf(log, "Found match in field file for variable %s. Assigning value %x", var_name, pnt); + } log(log_level, log); } - fb->u.static_value.l = value; + break; + } + else{ + fread(&pointer, sizeof(void *), 1, statics_file_classes); + fread(&primitive, sizeof(int), 1, statics_file_classes); + if(primitive == TRUE){ + fread(&value, sizeof(long long), 1, statics_file_classes); + } + else{ + fread(&pnt, sizeof(void *), 1, statics_file_classes); + } } len = fread(&string_length, sizeof(unsigned short), 1, statics_file_classes); @@ -1072,15 +1099,30 @@ void prepareFields(Class *class) { } fclose(statics_file_classes); + // Primitive types are 1 char long + if((strlen(fb->type) == 1) && (fb->type[0] != '[')){ + primitive = TRUE; + } + else{ + primitive = FALSE; + } + + // Adding entry to field file if(reload_variable == FALSE){ - statics_file_classes = fopen(file_name, "r+b"); + statics_file_classes = fopen(file_name, "a+b"); string_length = strlen(fb->name); fwrite(&string_length, sizeof(unsigned short), 1, statics_file_classes); fwrite(fb->name, sizeof(char), string_length, statics_file_classes); pointer = &(fb->u.static_value.l); - fwrite(&pointer, sizeof(long long*), 1, statics_file_classes); - fwrite(&value, sizeof(long long), 1, statics_file_classes); + fwrite(&pointer, sizeof(void *), 1, statics_file_classes); + fwrite(&primitive, sizeof(int), 1, statics_file_classes); + if(primitive == TRUE){ + fwrite(&value, sizeof(long long), 1, statics_file_classes); + } + else{ + fwrite(&value, sizeof(void *), 1, statics_file_classes); + } fclose(statics_file_classes); if(testing_mode_classes){ diff --git a/src/jamvm/jamvm-1.5.4/src/jam.c b/src/jamvm/jamvm-1.5.4/src/jam.c index f9b982d0..00210a7f 100644 --- a/src/jamvm/jamvm-1.5.4/src/jam.c +++ b/src/jamvm/jamvm-1.5.4/src/jam.c @@ -441,8 +441,11 @@ int main(int argc, char *argv[]) { struct dirent *ep; FILE *field_file; unsigned short string_length; - long long *pointer, pointer_to_value; + void *pnt; + unsigned int pointer_to_heap; + void *pointer_to_value; long long value = 0; + int primitive = TRUE; size_t len; dp = opendir ("fields"); @@ -470,15 +473,28 @@ int main(int argc, char *argv[]) { char *var_name = (char*)calloc(1, (string_length * sizeof(char)) + 1); fread(var_name, sizeof(char), string_length, field_file); var_name[string_length] = 0; - fread(&pointer, sizeof(long long*), 1, field_file); - pointer_to_value = &value; - memcpy(pointer_to_value, pointer, sizeof(long long)); - fwrite(&value, sizeof(long long), 1, field_file); + fread(&pnt, sizeof(void *), 1, field_file); + fread(&primitive, sizeof(int), 1, field_file); + if(primitive == TRUE){ + pointer_to_value = &value; + memcpy(pointer_to_value, pnt, sizeof(void *)); + fwrite(&value, sizeof(long long), 1, field_file); + } + else{ + pointer_to_value = &pointer_to_heap; + memcpy(pointer_to_value, pnt, sizeof(long long)); + fwrite(&pointer_to_heap, sizeof(void *), 1, field_file); + } if(args.testing_mode == TRUE){ log_level = DEBUG; char log[100]; - sprintf(log, "Variable %s has value %d before exit", var_name, value); + if(primitive == TRUE){ + sprintf(log, "Variable %s has value %x before exit", var_name, value); + } + else{ + sprintf(log, "Variable %s has value %x before exit", var_name, pointer_to_heap); + } log(log_level, log); } From a08039c0ee8ca6db2c1655e40a6045e6886ea703 Mon Sep 17 00:00:00 2001 From: Pedro Monteiro Date: Mon, 25 Aug 2014 10:46:14 -0300 Subject: [PATCH 4/5] Syncing heap before exit --- src/jamvm/jamvm-1.5.4/src/alloc.c | 2 +- src/jamvm/jamvm-1.5.4/src/class.c | 17 +++++++++++++++- src/jamvm/jamvm-1.5.4/src/jam.c | 34 ++++++++++++++++++++++++++++--- src/jamvm/jamvm-1.5.4/src/jam.h | 4 +++- 4 files changed, 51 insertions(+), 6 deletions(-) diff --git a/src/jamvm/jamvm-1.5.4/src/alloc.c b/src/jamvm/jamvm-1.5.4/src/alloc.c index faae66ba..2e739623 100644 --- a/src/jamvm/jamvm-1.5.4/src/alloc.c +++ b/src/jamvm/jamvm-1.5.4/src/alloc.c @@ -108,7 +108,7 @@ static int IS_PERSISTENT = 0; static char *FL_filename = "freelist"; static char *sep = "\n"; -#define HEAPADDR 0xaf497000 + /* HEAP MEM ADDRESS */ diff --git a/src/jamvm/jamvm-1.5.4/src/class.c b/src/jamvm/jamvm-1.5.4/src/class.c index f5ae2006..72e1a22b 100644 --- a/src/jamvm/jamvm-1.5.4/src/class.c +++ b/src/jamvm/jamvm-1.5.4/src/class.c @@ -1054,12 +1054,15 @@ void prepareFields(Class *class) { fread(var_name, sizeof(char), string_length, statics_file_classes); var_name[string_length] = 0; - + // Found match, reassign value if(strcmp(var_name, fb->name) == 0){ reload_variable = TRUE; + pointer = &(fb->u.static_value.l); fwrite(&pointer, sizeof(void *), 1, statics_file_classes); + fread(&primitive, sizeof(int), 1, statics_file_classes); + if(primitive == TRUE){ fread(&value, sizeof(long long), 1, statics_file_classes); fb->u.static_value.l = value; @@ -1081,11 +1084,16 @@ void prepareFields(Class *class) { log(log_level, log); } + // Stop reading the file break; } else{ + + // Continue to advance the read pointer fread(&pointer, sizeof(void *), 1, statics_file_classes); + fread(&primitive, sizeof(int), 1, statics_file_classes); + if(primitive == TRUE){ fread(&value, sizeof(long long), 1, statics_file_classes); } @@ -1094,9 +1102,11 @@ void prepareFields(Class *class) { } } + // Read next file entry len = fread(&string_length, sizeof(unsigned short), 1, statics_file_classes); } + fclose(statics_file_classes); // Primitive types are 1 char long @@ -1111,12 +1121,17 @@ void prepareFields(Class *class) { // Adding entry to field file if(reload_variable == FALSE){ statics_file_classes = fopen(file_name, "a+b"); + string_length = strlen(fb->name); fwrite(&string_length, sizeof(unsigned short), 1, statics_file_classes); + fwrite(fb->name, sizeof(char), string_length, statics_file_classes); + pointer = &(fb->u.static_value.l); fwrite(&pointer, sizeof(void *), 1, statics_file_classes); + fwrite(&primitive, sizeof(int), 1, statics_file_classes); + if(primitive == TRUE){ fwrite(&value, sizeof(long long), 1, statics_file_classes); } diff --git a/src/jamvm/jamvm-1.5.4/src/jam.c b/src/jamvm/jamvm-1.5.4/src/jam.c index 00210a7f..41368966 100644 --- a/src/jamvm/jamvm-1.5.4/src/jam.c +++ b/src/jamvm/jamvm-1.5.4/src/jam.c @@ -25,6 +25,7 @@ #include #include #include +#include #include #include "jam.h" @@ -452,11 +453,13 @@ int main(int argc, char *argv[]) { if (dp != NULL) { while (ep = readdir (dp)) { if(strcmp(ep->d_name, ".") != 0 && strcmp(ep->d_name, "..") != 0){ - // Calloc the size of file name plus "fields/" (7) plus /0 (1) + + /* Calloc the size of file name plus "fields/" (7) plus /0 (1) */ char *file_name = (char*)calloc(1, sizeof(ep->d_name) + 8); strcat(file_name, "fields/"); strcat(file_name, ep->d_name); + /* Logging debug */ if(args.testing_mode == TRUE){ log_level = DEBUG; char log[100]; @@ -468,13 +471,16 @@ int main(int argc, char *argv[]) { len = fread(&string_length, sizeof(unsigned short), 1, field_file); - + /* Reading variables from file */ while (len == 1) { char *var_name = (char*)calloc(1, (string_length * sizeof(char)) + 1); fread(var_name, sizeof(char), string_length, field_file); var_name[string_length] = 0; + fread(&pnt, sizeof(void *), 1, field_file); + fread(&primitive, sizeof(int), 1, field_file); + if(primitive == TRUE){ pointer_to_value = &value; memcpy(pointer_to_value, pnt, sizeof(void *)); @@ -486,6 +492,7 @@ int main(int argc, char *argv[]) { fwrite(&pointer_to_heap, sizeof(void *), 1, field_file); } + /* Logging debug */ if(args.testing_mode == TRUE){ log_level = DEBUG; char log[100]; @@ -498,6 +505,7 @@ int main(int argc, char *argv[]) { log(log_level, log); } + /* Read next file entry */ len = fread(&string_length, sizeof(unsigned short), 1, field_file); } @@ -505,8 +513,28 @@ int main(int argc, char *argv[]) { } closedir (dp); - } else + } else{ printf ("Couldn't open fields folder\n"); + } + + /* Sync Heap before exit */ + int sync_success = msync(HEAPADDR, args.max_heap, MS_SYNC); + + /* Logging Info */ + if(args.testing_mode == TRUE){ + log_level = INFO; + log(log_level, "Heap synced"); + + /* Unit tests */ + if(sync_success == 0){ + log_test_results("heapSyncAtExit", TRUE); + } + else{ + log_test_results("heapSyncAtExit", FALSE); + } + + } + } /* END OF MODIFICATION */ diff --git a/src/jamvm/jamvm-1.5.4/src/jam.h b/src/jamvm/jamvm-1.5.4/src/jam.h index 92451169..bdb70c04 100644 --- a/src/jamvm/jamvm-1.5.4/src/jam.h +++ b/src/jamvm/jamvm-1.5.4/src/jam.h @@ -31,10 +31,12 @@ /* Architecture dependent definitions */ #include "arch.h" -/* NVM specific includes */ +/* NVM specific includes and defines */ #include "nvm/test/testing_utils.h" #include "nvm/utils/logger.h" +#define HEAPADDR 0xaf497000 + #ifndef TRUE #define TRUE 1 #define FALSE 0 From ed71f434228872c60f3382a75f455e41fa6799f8 Mon Sep 17 00:00:00 2001 From: Pedro Monteiro Date: Mon, 25 Aug 2014 13:34:48 -0300 Subject: [PATCH 5/5] Some little fixes on comments and functions --- src/jamvm/jamvm-1.5.4/src/alloc.c | 2 -- src/jamvm/jamvm-1.5.4/src/class.c | 8 +++++++- src/jamvm/jamvm-1.5.4/src/jam.h | 1 + src/jamvm/jamvm-1.5.4/src/utf8.c | 2 +- 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/jamvm/jamvm-1.5.4/src/alloc.c b/src/jamvm/jamvm-1.5.4/src/alloc.c index 2e739623..eae0889b 100644 --- a/src/jamvm/jamvm-1.5.4/src/alloc.c +++ b/src/jamvm/jamvm-1.5.4/src/alloc.c @@ -110,8 +110,6 @@ static char *sep = "\n"; -/* HEAP MEM ADDRESS */ - static int verbosegc; static int compact_override; static int compact_value; diff --git a/src/jamvm/jamvm-1.5.4/src/class.c b/src/jamvm/jamvm-1.5.4/src/class.c index 72e1a22b..d6ee6ead 100644 --- a/src/jamvm/jamvm-1.5.4/src/class.c +++ b/src/jamvm/jamvm-1.5.4/src/class.c @@ -314,7 +314,13 @@ Class *searchClass(char *classname, char *data, int offset, int len, Object *cla ptr += length; - CP_INFO(constant_pool,i) = (uintptr_t) (utf8 = newUtf8(buff)); + //XXX NVM MODIFICATION - save utf8 entries of classes with classloaders + if(class_to_save){ + CP_INFO(constant_pool,i) = (uintptr_t) (utf8 = newUtf8Save(buff)); + } + else{ + CP_INFO(constant_pool,i) = (uintptr_t) (utf8 = newUtf8(buff)); + } if(utf8 != buff) diff --git a/src/jamvm/jamvm-1.5.4/src/jam.h b/src/jamvm/jamvm-1.5.4/src/jam.h index bdb70c04..37670fd0 100644 --- a/src/jamvm/jamvm-1.5.4/src/jam.h +++ b/src/jamvm/jamvm-1.5.4/src/jam.h @@ -35,6 +35,7 @@ #include "nvm/test/testing_utils.h" #include "nvm/utils/logger.h" +/* HEAP MEM ADDRESS */ #define HEAPADDR 0xaf497000 #ifndef TRUE diff --git a/src/jamvm/jamvm-1.5.4/src/utf8.c b/src/jamvm/jamvm-1.5.4/src/utf8.c index e28f1eab..0f6ef54a 100644 --- a/src/jamvm/jamvm-1.5.4/src/utf8.c +++ b/src/jamvm/jamvm-1.5.4/src/utf8.c @@ -196,7 +196,7 @@ void initialiseUtf8Persistent(){ while (len == 1) { char *interned = NULL; - char *to_add = (char*)sysMalloc(string_length * sizeof(char)); + char *to_add = (char*)calloc(1, string_length * sizeof(char)); int count = fread(to_add, sizeof(char), string_length, hash_file_utf8); do { addHashEntry((*hash_table), to_add, interned);