int main(int argc, char* argv[]) { properties[0] = "IsMobile"; properties[1] = "PlatformName"; properties[2] = "PlatformVersion"; int propertiesCount = 3; const char* fileName = argc > 1 ? argv[1] : "../../../data/51Degrees-LiteV3.2.dat"; const char* inputFile = argc > 2 ? argv[2] : "../../../data/20000 User Agents.csv"; #ifdef _DEBUG #ifndef _MSC_VER dmalloc_debug_setup("log-stats,log-non-free,check-fence,log=dmalloc.log"); #endif #endif // Create a pool of 4 worksets with a cache for 1000 items. fiftyoneDegreesDataSetInitStatus status = fiftyoneDegreesInitProviderWithPropertyArray( fileName, &provider, (const char**)properties, propertiesCount, 4, 1000); if (status != DATA_SET_INIT_STATUS_SUCCESS) { reportDatasetInitStatus(status, fileName); fgetc(stdin); return 1; } run(&provider, properties, propertiesCount, inputFile); // Free the pool, dataset and cache. fiftyoneDegreesProviderFree(&provider); #ifdef _DEBUG #ifdef _MSC_VER _CrtDumpMemoryLeaks(); #else printf("Log file is %s\r\n", dmalloc_logpath); #endif #endif // Wait for a character to be pressed. fgetc(stdin); return 0; }
int main(int argc, char* argv[]) { // Required properties. Empty string initializes all properties. const char* requiredProperties = "IsMobile,BrowserName"; // Path to 51Degrees data files. Or use default paths. const char* fileName = argc > 1 ? argv[1] : "../../../data/51Degrees-LiteV3.2.dat"; // Path to file containing HTTP User-Agent strings. const char* inputFile = argc > 2 ? argv[2] : "../../../data/20000 User Agents.csv"; #ifdef _DEBUG #ifndef _MSC_VER dmalloc_debug_setup("log-stats,log-non-free,check-fence,log=dmalloc.log"); #else _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE); _CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDERR); #endif #endif // How many times the dataset was reloaded. int numberOfReloads = 0; #ifndef FIFTYONEDEGREES_NO_THREADING printf("** Multi Threaded Reload Example **\r\n"); #else printf("** Single Threaded Reload Example **\r\n"); #endif // Create a pool of 4 worksets with a cache for 1000 items. fiftyoneDegreesDataSetInitStatus status = fiftyoneDegreesInitProviderWithPropertyString( fileName, &provider, requiredProperties, 4, 1000); if (status != DATA_SET_INIT_STATUS_SUCCESS) { reportDatasetInitStatus(status, fileName); fgetc(stdin); return 1; } #ifndef FIFTYONEDEGREES_NO_THREADING FIFTYONEDEGREES_MUTEX_CREATE(lock); if (FIFTYONEDEGREES_MUTEX_VALID(&lock)) { startThreads(inputFile); char *fileInMemory; long currentFileSize; while (threadsFinished < numberOfThreads) { // Load file into memory. currentFileSize = loadFile(fileName, &fileInMemory); // Refresh the current dataset. fiftyoneDegreesProviderReloadFromMemory(&provider, (void*)fileInMemory, currentFileSize); fiftyoneDegreesDataSet *ds = (fiftyoneDegreesDataSet*)provider.activePool->dataSet; // Tell the API to free the memory occupied by the data file when the dataset is freed. ds->memoryToFree = (void*)fileInMemory; numberOfReloads++; #ifdef _MSC_VER Sleep(1000); // milliseconds #else sleep(1); // seconds #endif } stopThreads(); FIFTYONEDEGREES_MUTEX_CLOSE(lock); } #else numberOfReloads = runRequest(inputFile); #endif // Free the pool, dataset and cache. fiftyoneDegreesProviderFree(&provider); // Finish execution. printf("Reloaded '%i' times.\r\n", numberOfReloads); #ifdef _DEBUG #ifdef _MSC_VER _CrtDumpMemoryLeaks(); #else printf("Log file is %s\r\n", dmalloc_logpath); #endif #endif printf("Program execution complete. Press any Return to exit."); fgetc(stdin); return 0; }