/** * Verify port library management. * * The port library allocates resources as part of it's normal running. Thus * prior to terminating the application the port library must free all it's * resource via the port library table function * @ref omrport.c::omrport_shutdown_library "omrport_shutdown_library()" * * @note self allocated port libraries de-allocate their memory as part of this * function. */ TEST(PortTest, port_test6) { OMRPORT_ACCESS_FROM_OMRPORT(portTestEnv->getPortLibrary()); const char *testName = "omrport_test6"; OMRPortLibrary *fakePtr; int32_t rc; omrthread_t attachedThread = NULL; reportTestEntry(OMRPORTLIB, testName); if (0 != omrthread_attach_ex(&attachedThread, J9THREAD_ATTR_DEFAULT)) { outputErrorMessage(PORTTEST_ERROR_ARGS, "Failed to attach to omrthread\n"); goto exit; } memset(&portLibraryToTest, '0', sizeof(OMRPortLibrary)); fakePtr = &portLibraryToTest; rc = omrport_init_library(fakePtr, sizeof(OMRPortLibrary)); if (0 != rc) { outputErrorMessage(PORTTEST_ERROR_ARGS, "omrport_init_library() returned %d expected 0\n", rc); } /* Shut it down */ portLibraryToTest.port_shutdown_library(fakePtr); omrthread_detach(attachedThread); /* Global pointer should be NULL */ if (NULL != fakePtr->portGlobals) { outputErrorMessage(PORTTEST_ERROR_ARGS, "port_shutdown_library() portGlobal pointer is not NULL\n"); } /* Shutdown again, should be ok, nothing to check ... * TODO support this? portLibraryToTest.port_shutdown_library(fakePtr); */ /* Let's do it all over again, this time self allocated * Note a self allocated library does not startup, so there are no * port globals etc. Verifies the shutdown routines are safe */ fakePtr = NULL; rc = omrport_allocate_library(&fakePtr); if (0 != rc) { outputErrorMessage(PORTTEST_ERROR_ARGS, "omrport_allocate_library() returned %d expected 0\n", rc); goto exit; } /* TODO library not started, fair to shut it down ? fakePtr->port_shutdown_library(fakePtr); */ fakePtr = NULL; exit: reportTestExit(OMRPORTLIB, testName); }
int main(void) { int32_t totalFiles = 0; intptr_t rc = 0; char resultBuffer[128]; uintptr_t rcFile; uintptr_t handle; OMRPortLibrary portLibrary; rc = omrthread_attach_ex(NULL, J9THREAD_ATTR_DEFAULT); if (0 != rc) { fprintf(stderr, "omrthread_attach_ex(NULL, J9THREAD_ATTR_DEFAULT) failed, rc=%d\n", (int)rc); return -1; } rc = omrport_init_library(&portLibrary, sizeof(OMRPortLibrary)); if (0 != rc) { fprintf(stderr, "omrport_init_library(&portLibrary, sizeof(OMRPortLibrary)), rc=%d\n", (int)rc); return -1; } OMRPORT_ACCESS_FROM_OMRPORT(&portLibrary); rcFile = handle = omrfile_findfirst(SRC_DIR, resultBuffer); if(rcFile == (uintptr_t)-1) { fprintf(stderr, "omrfile_findfirst(SRC_DIR, resultBuffer), return code=%d\n", (int)rcFile); return -1; } while ((uintptr_t)-1 != rcFile) { if (strncmp(resultBuffer, VERBOSE_GC_FILE_PREFIX, strlen(VERBOSE_GC_FILE_PREFIX)) == 0) { analyze(resultBuffer, portLibrary); totalFiles++; /* Clean up verbose log file */ omrfile_unlink(resultBuffer); } rcFile = omrfile_findnext(handle, resultBuffer); } if (handle != (uintptr_t)-1) { omrfile_findclose(handle); } if(totalFiles < 1) { omrtty_printf("Failed to find any verbose GC file to process!\n\n"); } portLibrary.port_shutdown_library(&portLibrary); omrthread_detach(NULL); }
int main(int argc, char *argv[]) { omrthread_attach(NULL); OMRPortLibrary portLibrary; omrport_init_library(&portLibrary, sizeof(portLibrary)); DDR_RC rc = DDR_RC_OK; /* Get options. */ const char *macroFile = "src/macros/test/macroList"; const char *supersetFile = "superset.out"; const char *blobFile = "blob.dat"; const char *overrideFile = NULL; vector<string> debugFiles; rc = getOptions(&portLibrary, argc, argv, ¯oFile, &supersetFile, &blobFile, &overrideFile, &debugFiles); /* Create IR from input. */ #if defined(_MSC_VER) PdbScanner scanner; #else /* defined(_MSC_VER) */ DwarfScanner scanner; #endif /* defined(_MSC_VER) */ Symbol_IR ir; if ((DDR_RC_OK == rc) && !debugFiles.empty()) { rc = scanner.startScan(&portLibrary, &ir, &debugFiles); } /* Compute field offsets for UDTs. */ if (DDR_RC_OK == rc) { rc = ir.computeOffsets(); } /* Remove duplicate types. */ if (DDR_RC_OK == rc) { rc = ir.removeDuplicates(); } MacroTool macroTool; /* Read macros. */ if ((DDR_RC_OK == rc) && (NULL != macroFile)) { rc = macroTool.getMacros(macroFile); } /* Add Macros to IR. */ if (DDR_RC_OK == rc) { rc = macroTool.addMacrosToIR(&ir); } /* Apply Type Overrides; must be after scanning and loading macros. */ if ((DDR_RC_OK == rc) && (NULL != overrideFile)) { rc = ir.applyOverrideList(&portLibrary, overrideFile); } /* Generate output. */ if ((DDR_RC_OK == rc) && !ir._types.empty()) { rc = genBlob(&portLibrary, &ir, supersetFile, blobFile); } portLibrary.port_shutdown_library(&portLibrary); omrthread_detach(NULL); omrthread_shutdown_library(); return 0; }
/** * Verify port library management. * * The port library requires a region of memory for it's function table pointer. * This table must not be declared on a stack that is torn down prior to the application * running to completion and tearing down the port library. It can either be * created as a global variable to the program, or if a running port library is * present it can be allocated on behalf of the application. Self allocating * port libraries use the exported function * @ref omrport.c::omrport_allocate_library "omrport_allocate_library()". * This function allocates, initializes and starts the port library. * The port library is responsible for deallocation of this memory * as part of it's shutdown. */ TEST(PortTest, port_test5) { OMRPORT_ACCESS_FROM_OMRPORT(portTestEnv->getPortLibrary()); const char *testName = "omrport_test5"; OMRPortLibrary *fakePortLibrary = NULL; int32_t rc; omrthread_t attachedThread = NULL; reportTestEntry(OMRPORTLIB, testName); if (0 != omrthread_attach_ex(&attachedThread, J9THREAD_ATTR_DEFAULT)) { outputErrorMessage(PORTTEST_ERROR_ARGS, "Failed to attach to omrthread\n"); goto exit; } /* Pass */ fakePortLibrary = NULL; rc = omrport_allocate_library(&fakePortLibrary); if (0 != rc) { outputErrorMessage(PORTTEST_ERROR_ARGS, "omrport_allocate_library() returned %d expected 0\n", rc); goto exit; } /* Verify we have a pointer */ if (NULL == fakePortLibrary) { outputErrorMessage(PORTTEST_ERROR_ARGS, "omrport_allocate_library() returned NULL pointer\n"); goto exit; } /* Verify not started */ if (NULL != fakePortLibrary->portGlobals) { outputErrorMessage(PORTTEST_ERROR_ARGS, "omrport_allocate_library() portGlobals pointer is not NULL\n"); } /* Verify self allocated */ if (NULL == fakePortLibrary->self_handle) { outputErrorMessage(PORTTEST_ERROR_ARGS, "omrport_allocate_library() self_handle pointer is NULL\n"); } /* Verify it will start */ rc = omrport_startup_library(fakePortLibrary); if (0 != rc) { outputErrorMessage(PORTTEST_ERROR_ARGS, "omrport_startup_library() returned %d expected 0\n", rc); } /* Take this port library down */ fakePortLibrary->port_shutdown_library(fakePortLibrary); /* Try again, but force failure during startup by over riding one of the startup functions */ fakePortLibrary = NULL; rc = omrport_allocate_library(&fakePortLibrary); if (0 != rc) { outputErrorMessage(PORTTEST_ERROR_ARGS, "omrport_allocate_library() returned %d expected 0\n", rc); goto exit; } /* Override omrmem_startup */ fakePortLibrary->mem_startup = fake_mem_startup; rc = omrport_startup_library(fakePortLibrary); if (failMemStartup != rc) { outputErrorMessage(PORTTEST_ERROR_ARGS, "omrport_startup_library() returned %d expected %d\n", rc, failMemStartup); } /* No way to tell if it freed the memory properly. The pointer we have to the port library is * not updated as part of omrport_startup_library(), so we are now pointing at dead memory. * * NULL our pointer to exit can clean-up if required */ fakePortLibrary = NULL; exit: if (NULL != fakePortLibrary) { fakePortLibrary->port_shutdown_library(fakePortLibrary); } if (NULL != attachedThread) { omrthread_detach(attachedThread); } reportTestExit(OMRPORTLIB, testName); }
/** * Verify port library management. * * The second stage in starting a port library. Once a port library table has * been created via * @ref omrport.c::omrport_create_library "omrport_create_library()" * it is started via the exported function * @ref omrport.c::omrport_startup_library "omrport_startup_library()". * * @see omrport.c::omrport_create_library "omrport_create_library()" * @see omrport.c::omrport_init_library "omrport_init_library()" */ TEST(PortTest, port_test3) { OMRPORT_ACCESS_FROM_OMRPORT(portTestEnv->getPortLibrary()); const char *testName = "omrport_test3"; OMRPortLibrary *fakePtr = &portLibraryToTest; int32_t rc; omrthread_t attachedThread = NULL; reportTestEntry(OMRPORTLIB, testName); if (0 != omrthread_attach_ex(&attachedThread, J9THREAD_ATTR_DEFAULT)) { outputErrorMessage(PORTTEST_ERROR_ARGS, "Failed to attach to omrthread\n"); goto exit; } /* create a library and ensure the port globals is non NULL, what else can we do? */ memset(&portLibraryToTest, '0', sizeof(OMRPortLibrary)); rc = omrport_create_library(fakePtr, sizeof(OMRPortLibrary)); if (0 != rc) { outputErrorMessage(PORTTEST_ERROR_ARGS, "omrport_create_library() returned %d expected 0\n", rc); goto exit; } /* check the rc */ rc = omrport_startup_library(fakePtr); if (0 != rc) { outputErrorMessage(PORTTEST_ERROR_ARGS, "omrport_startup_library() returned %d expected 0\n", rc); } /* check portGlobals were allocated */ if (NULL == fakePtr->portGlobals) { outputErrorMessage(PORTTEST_ERROR_ARGS, "omrport_startup_library() portGlobals not allocated\n"); } if (NULL != fakePtr->self_handle) { outputErrorMessage(PORTTEST_ERROR_ARGS, "omrport_startup_library() self_handle pointer not NULL\n"); } /* Clean this port library up */ portLibraryToTest.port_shutdown_library(fakePtr); /* Do it again, but before starting override memory (first startup function) and * ensure everything is ok */ memset(&portLibraryToTest, '0', sizeof(OMRPortLibrary)); rc = omrport_create_library(fakePtr, sizeof(OMRPortLibrary)); if (0 != rc) { outputErrorMessage(PORTTEST_ERROR_ARGS, "omrport_create_library() returned %d expected 0\n", rc); goto exit; } /* override time_startup */ fakePtr->time_startup = fake_time_startup; rc = omrport_startup_library(fakePtr); if (failMemStartup != rc) { outputErrorMessage(PORTTEST_ERROR_ARGS, "omrport_startup_library() returned %d expected %d\n", rc, failMemStartup); } exit: portLibraryToTest.port_shutdown_library(fakePtr); if (NULL != attachedThread) { omrthread_detach(attachedThread); } reportTestExit(OMRPORTLIB, testName); }