/* SIGINFO will dump memory stats For detailed memory stats, use: ./configure --set memoryCheck=true */ static void statusCheck(void *ignored, MprSignal *sp) { mprRequestGC(MPR_GC_COMPLETE); mprRawLog(0, "%s", httpStatsReport(0)); if (MPR->heap->track) { mprPrintMem("", 1); } }
/* Trace output received from the cgi process */ static void traceCGIData(MprCmd *cmd, char *src, int size) { char dest[512]; int index, i; mprRawLog(cmd, 5, "@@@ CGI process wrote => \n"); for (index = 0; index < size; ) { for (i = 0; i < (sizeof(dest) - 1) && index < size; i++) { dest[i] = src[index]; index++; } dest[i] = '\0'; mprRawLog(cmd, 5, "%s", dest); } mprRawLog(cmd, 5, "\n"); }
/* Trace output first part of output received from the cgi process */ static void traceCGIData(MprCmd *cmd, char *src, ssize size) { char dest[512]; int index, i; if (mprGetLogLevel() >= 5) { mprRawLog(5, "CGI: process wrote (leading %d bytes) => \n", min(sizeof(dest), size)); for (index = 0; index < size; ) { for (i = 0; i < (sizeof(dest) - 1) && index < size; i++) { dest[i] = src[index]; index++; } dest[i] = '\0'; mprRawLog(5, "%s", dest); } mprRawLog(5, "\n"); } }
static void traceBuf(MaConn *conn, cchar *buf, int len, int mask) { cchar *cp, *tag, *digits; char *data, *dp; int level, i, printable; level = conn->host->traceLevel; for (printable = 1, i = 0; i < len; i++) { if (!isascii(buf[i])) { printable = 0; } } tag = (mask & MA_TRACE_RESPONSE) ? "Response" : "Request"; if (printable) { data = mprAlloc(conn, len + 1); memcpy(data, buf, len); data[len] = '\0'; mprRawLog(conn, level, "%s packet, conn %d, len %d >>>>>>>>>>\n%s", tag, conn->seqno, len, data); mprFree(data); } else { mprRawLog(conn, level, "%s packet, conn %d, len %d >>>>>>>>>> (binary)\n", tag, conn->seqno, len); data = mprAlloc(conn, len * 3 + ((len / 16) + 1) + 1); digits = "0123456789ABCDEF"; for (i = 0, cp = buf, dp = data; cp < &buf[len]; cp++) { *dp++ = digits[(*cp >> 4) & 0x0f]; *dp++ = digits[*cp++ & 0x0f]; *dp++ = ' '; if ((++i % 16) == 0) { *dp++ = '\n'; } } *dp++ = '\n'; *dp = '\0'; mprRawLog(conn, level, "%s", data); } mprRawLog(conn, level, "<<<<<<<<<< %s packet end, conn %d\n\n", tag, conn->seqno); }
/* function emit(level: Number, ...data): Number */ static EjsNumber *lf_emit(Ejs *ejs, EjsObj *unused, int argc, EjsObj **argv) { EjsArray *args; EjsByteArray *ap; EjsObj *vp; EjsString *str; char *msg, *arg; ssize len, written; int i, level, paused; assure(argc >= 2 && ejsIs(ejs, argv[1], Array)); level = ejsGetInt(ejs, argv[0]); args = (EjsArray*) argv[1]; written = 0; msg = 0; paused = ejsBlockGC(ejs); for (i = 0; i < args->length; i++) { vp = ejsGetProperty(ejs, args, i); assure(vp); switch (TYPE(vp)->sid) { case S_ByteArray: ap = (EjsByteArray*) vp; // TODO ENCODING arg = (char*) &ap->value[ap->readPosition]; len = ap->writePosition - ap->readPosition; break; case S_String: // MOB - use NULL instead of &len arg = awtom(((EjsString*) vp)->value, &len); break; default: str = ejsToString(ejs, vp); // MOB - use NULL instead of &len arg = awtom(((EjsString*) str)->value, &len); break; } msg = srejoin(msg, arg, NULL); } if (msg) { mprRawLog(level, "%s", msg); written += slen(msg); } ejsUnblockGC(ejs, paused); return ejsCreateNumber(ejs, (MprNumber) slen(msg)); }
/* Interpret from the console or from a literal command */ static int interpretCommands(EcCompiler *cp, cchar *cmd) { Ejs *ejs; EjsString *result; char *tmpArgv[1]; int err; ejs = cp->ejs; cp->interactive = 1; if (ecOpenConsoleStream(cp, (cmd) ? commandGets: consoleGets, cmd) < 0) { mprError("Cannot open input"); return EJS_ERR; } tmpArgv[0] = EC_INPUT_STREAM; while (!cp->stream->eof && !mprIsStopping()) { err = 0; cp->uid = 0; ejs->result = ESV(undefined); if (ecCompile(cp, 1, tmpArgv) < 0) { mprRawLog(0, "%s", cp->errorMsg); ejs->result = ESV(undefined); err++; } if (!err && cp->errorCount == 0) { if (ejsRunProgram(ejs, NULL, NULL) < 0) { ejsReportError(ejs, "Error in script"); } } if (!ejs->exception && ejs->result != ESV(undefined)) { if (ejsIs(ejs, ejs->result, Date) /* MOB || ejsIsType(ejs, ejs->result) */) { if ((result = (EjsString*) ejsToString(ejs, ejs->result)) != 0) { mprPrintf("%@\n", result); } } else if (ejs->result != ESV(null)) { if ((result = (EjsString*) ejsSerialize(ejs, ejs->result, EJS_JSON_SHOW_PRETTY)) != 0) { mprPrintf("%@\n", result); } } } ecResetInput(cp); cp->errorCount = 0; cp->fatalError = 0; } ecCloseStream(cp); return 0; }
/* Compile the source files supplied on the command line. This will compile in-memory and optionally also save to module files. */ static int interpretFiles(EcCompiler *cp, MprList *files, int argc, char **argv, cchar *className, cchar *method) { Ejs *ejs; assure(files); MPR_VERIFY_MEM(); ejs = cp->ejs; if (ecCompile(cp, files->length, (char**) files->items) < 0) { mprRawLog(0, "%s\n", cp->errorMsg); return EJS_ERR; } assure(ejs->result == 0 || (MPR_GET_GEN(MPR_GET_MEM(ejs->result)) != MPR->heap->dead)); if (cp->errorCount == 0) { if (ejsRunProgram(ejs, className, method) < 0) { ejsReportError(ejs, "Error in program"); return EJS_ERR; } } return 0; }
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; }