static long msgProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) { MprThread *tp; char buf[ME_MAX_FNAME]; switch (msg) { case WM_DESTROY: case WM_QUIT: mprShutdown(0, -1, 0); break; case APPWEB_MONITOR_MESSAGE: return monitorEvent(hwnd, wp, lp); case WM_COMMAND: switch (LOWORD(wp)) { case MA_MENU_STATUS: break; case MA_MENU_DOC: runBrowser("http://embedthis.com/appweb/doc/index.html"); break; #if UNUSED case MA_MENU_MANAGE: runBrowser("/index.html"); break; #endif case MA_MENU_START: tp = mprCreateThread("startService", startService, 0, 0); mprStartThread(tp); break; case MA_MENU_STOP: tp = mprCreateThread("stopService", stopService, 0, 0); mprStartThread(tp); break; case MA_MENU_ABOUT: /* Single-threaded users beware. This blocks !! */ fmt(buf, sizeof(buf), "%s %s", ME_TITLE, ME_VERSION); MessageBoxEx(hwnd, buf, mprGetAppTitle(), MB_OK, 0); break; case MA_MENU_EXIT: PostMessage(hwnd, WM_QUIT, 0, 0L); break; default: return (long) DefWindowProc(hwnd, msg, wp, lp); } break; default: return (long) DefWindowProc(hwnd, msg, wp, lp); } return 0; }
static long msgProc(HWND hwnd, UINT msg, UINT wp, LPARAM lp) { MprThread *tp; char buf[MPR_MAX_FNAME]; switch (msg) { case WM_DESTROY: case WM_QUIT: mprTerminate(MPR_EXIT_GRACEFUL, -1); break; case APPWEB_MONITOR_MESSAGE: return monitorEvent(hwnd, wp, lp); case WM_COMMAND: switch (LOWORD(wp)) { case MA_MENU_STATUS: break; case MA_MENU_DOC: runBrowser("/doc/index.html"); break; case MA_MENU_MANAGE: runBrowser("/index.html"); break; case MA_MENU_START: tp = mprCreateThread("startService", startService, 0, 0); mprStartThread(tp); break; case MA_MENU_STOP: tp = mprCreateThread("stopService", stopService, 0, 0); mprStartThread(tp); break; case MA_MENU_ABOUT: /* Single-threaded users beware. This blocks !! */ mprSprintf(buf, sizeof(buf), "%s %s-%s", BIT_TITLE, BIT_VERSION, BIT_BUILD_NUMBER); MessageBoxEx(hwnd, buf, mprGetAppTitle(), MB_OK, 0); break; case MA_MENU_EXIT: PostMessage(hwnd, WM_QUIT, 0, 0L); break; default: return (long) DefWindowProc(hwnd, msg, wp, lp); } break; default: return (long) DefWindowProc(hwnd, msg, wp, lp); } return 0; }
static void processing() { MprThread *tp; ThreadData *data; int j; if (app->chunkSize > 0) { mprAddItem(app->headers, mprCreateKeyPair("X-Appweb-Chunk-Size", sfmt("%d", app->chunkSize))); } app->activeLoadThreads = app->loadThreads; app->threadData = mprCreateList(app->loadThreads, 0); for (j = 0; j < app->loadThreads; j++) { char name[64]; if ((data = mprAllocObj(ThreadData, manageThreadData)) == 0) { return; } mprAddItem(app->threadData, data); mprSprintf(name, sizeof(name), "http.%d", j); tp = mprCreateThread(name, threadMain, NULL, 0); tp->data = data; mprStartThread(tp); } }
MAIN(benchMpr, int argc, char **argv, char **envp) { MprThread *thread; Mpr *mpr; char *argp; int err, nextArg; if ((mpr = mprCreate(argc, argv, MPR_USER_EVENTS_THREAD)) == 0) { return MPR_ERR_MEMORY; } if ((app = mprAllocObj(App, manageApp)) == 0) { return MPR_ERR_MEMORY; } mprAddRoot(app); app->mutex = mprCreateLock(mpr); app->complete = mprCreateCond(); app->iterations = 5; err = 0; for (nextArg = 1; nextArg < argc; nextArg++) { argp = argv[nextArg]; if (*argp != '-') { break; } if (strcmp(argp, "--iterations") == 0 || strcmp(argp, "-i") == 0) { if (nextArg >= argc) { err++; } else { app->iterations = atoi(argv[++nextArg]); } } else if (strcmp(argp, "--alloc") == 0 || strcmp(argp, "-a") == 0) { app->testAllocOnly++; } else { err++; } } if (err) { mprEprintf("usage: bench [-a] [-i iterations]\n"); mprEprintf("usage: %s [options]\n" " -a # Alloc test only\n" " --iterations count # Number of iterations to run the test\n", mprGetAppName(mpr)); exit(2); } mprStart(mpr); thread = mprCreateThread("bench", (MprThreadProc) doBenchmark, (void*) MPR, 0); mprStartThread(thread); while (!testComplete) { mprServiceEvents(250, 0); } mprPrintMem("Memory Report", 0); mprDestroy(); return 0; }
/* * Thread to service the event queue. Used if the user does not have their own main event loop. */ int mprStartEventsThread(Mpr *mpr) { MprThread *tp; mprLog(mpr, MPR_CONFIG, "Starting service thread"); if ((tp = mprCreateThread(mpr, "events", serviceEvents, 0, MPR_NORMAL_PRIORITY, 0)) == 0) { return MPR_ERR_CANT_CREATE; } mpr->hasDedicatedService = 1; mprStartThread(tp); return 0; }
/* * Process the requests */ static void processing() { if (chunkSize) { mprAddItem(headers, mprCreateKeyPair(headers, "X-Appweb-Chunk-Size", chunkSize)); } #if BLD_FEATURE_MULTITHREAD { MprThread *tp; int j; activeLoadThreads = loadThreads; for (j = 0; j < loadThreads; j++) { char name[64]; mprSprintf(name, sizeof(name), "http.%d", j); tp = mprCreateThread(mpr, name, threadMain, mpr, MPR_NORMAL_PRIORITY, 0); mprStartThread(tp); } } #else threadMain(mpr, NULL); #endif }
MAIN(benchMain, int argc, char *argv[]) { Mpr *mpr; char *argp; int err, i, nextArg; #if BLD_FEATURE_MULTITHREAD MprThread *tp; #endif mpr = mprCreate(argc, argv, 0); #if VXWORKS || WINCE /* * These platforms pass an arg string in via the argc value. Assumes 32-bit. */ mprMakeArgv(mpr, "http", (char*) argc, &argc, &argv); #endif err = 0; for (nextArg = 1; nextArg < argc; nextArg++) { argp = argv[nextArg]; if (*argp != '-') { break; } if (strcmp(argp, "--iterations") == 0 || strcmp(argp, "-i") == 0) { if (nextArg >= argc) { err++; } else { iterations = atoi(argv[++nextArg]); } } else if (strcmp(argp, "--workers") == 0 || strcmp(argp, "-w") == 0) { if (nextArg >= argc) { err++; } else { i = atoi(argv[++nextArg]); if (i <= 0 || i > 100) { mprError(mpr, "%s: Bad number of worker threads (0-100)", mprGetAppName(mpr)); exit(2); } workers = i; } } else { err++; } } if (err) { mprPrintf(mpr, "usage: bench [-em] [-i iterations] [-t workers]\n"); mprRawLog(mpr, 0, "usage: %s [options]\n" " --iterations count # Number of iterations to run the test\n" " --workers count # Set maximum worker threads\n", mprGetAppName(mpr)); exit(2); } #if BLD_FEATURE_MULTITHREAD mutex = mprCreateLock(mpr); mprSetMaxWorkers(mpr, workers); #endif mprStart(mpr, 0); #if BLD_FEATURE_MULTITHREAD tp = mprCreateThread(mpr, "bench", (MprThreadProc) doBenchmark, (void*) mpr, MPR_NORMAL_PRIORITY, 0); mprStartThread(tp); while (!testComplete) { mprServiceEvents(mprGetDispatcher(mpr), 250, MPR_SERVICE_EVENTS | MPR_SERVICE_IO); } #else doBenchmark(mpr, NULL); #endif mprPrintf(mpr, "\n\n"); // mprFree(mpr); return 0; }