Changeset 3377


Ignore:
Timestamp:
Feb 28, 2013, 2:34:13 AM (6 years ago)
Author:
gah
Message:

rework of stats log file.

Location:
trunk/packages/vizservers
Files:
4 added
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/packages/vizservers/nanovis/Command.cpp

    r3376 r3377  
    747747 * ClientInfoCmd --
    748748 *
    749  *      Log initial values to stats file.
    750  *       
    751  *      clientinfo path list
     749 *      Log initial values to stats file.  The first time this is called
     750 *      "render_start" is written into the stats file.  Afterwards, it
     751 *      is "render_info".
     752 *     
     753 *         clientinfo list
    752754 */
    753755static int
     
    762764    static int first = 1;
    763765
    764     if (objc != 3) {
     766    if (objc != 2) {
    765767        Tcl_AppendResult(interp, "wrong # of arguments: should be \"",
    766                 Tcl_GetString(objv[0]), " path list\"", (char *)NULL);
     768                Tcl_GetString(objv[0]), " list\"", (char *)NULL);
    767769        return TCL_ERROR;
    768770    }
    769771#ifdef KEEPSTATS
    770     const char *path;
    771 
    772     path = Tcl_GetString(objv[1]);
    773     if (NanoVis::openStatsFile(path) < 0) {
     772    /* Use the initial client key value pairs as the parts for a generating
     773     * a unique file name. */
     774    f = NanoVis::getStatsFile(objv[1]);
     775    if (f < 0) {
    774776        Tcl_AppendResult(interp, "can't open stats file: ",
    775                 Tcl_PosixError(interp), (char *)NULL);
     777                         Tcl_PosixError(interp), (char *)NULL);
    776778        return TCL_ERROR;
    777779    }
     
    806808    Tcl_DStringAppendElement(&ds, buf);
    807809    /* Client arguments. */
    808     if (Tcl_ListObjGetElements(interp, objv[2], &numElems, &elems) != TCL_OK) {
     810    if (Tcl_ListObjGetElements(interp, objv[1], &numElems, &elems) != TCL_OK) {
    809811        return TCL_ERROR;
    810812    }
     
    815817
    816818#ifdef KEEPSTATS
    817     result = NanoVis::writeToStatsFile(Tcl_DStringValue(&ds),
     819    result = NanoVis::writeToStatsFile(f, Tcl_DStringValue(&ds),
    818820                                       Tcl_DStringLength(&ds));
    819821#else
  • trunk/packages/vizservers/nanovis/Makefile.in

    r3362 r3377  
    5959LD_RUN_PATH     = $(libdir):@LD_RPATH@
    6060
     61SVN_VERSION     = $(shell svnversion)
     62
    6163LIBS            = \
    6264                $(RP_LIB_SPEC) \
     
    9193CFLAGS          = @CFLAGS@
    9294EXTRA_CFLAGS    = -Wall
    93 DEFINES         =
     95DEFINES         = -DSVN_VERSION=\"$(SVN_VERSION)\"
    9496ifdef USE_POINTSET_RENDERER
    9597DEFINES         +=-DUSE_POINTSET_RENDERER
     
    145147                dxReader.o \
    146148                dxReaderCommon.o \
    147                 nanovis.o
     149                nanovis.o \
     150                md5.o
    148151
    149152resources       = \
  • trunk/packages/vizservers/nanovis/nanovis.cpp

    r3376 r3377  
    324324
    325325int
    326 NanoVis::openStatsFile(const char *path)
     326NanoVis::getStatsFile(Tcl_Obj *objPtr)
    327327{
    328328    Tcl_DString ds;
    329     char **argv;
    330     int argc;
     329    Tcl_Obj **objv;
     330    int objc;
    331331    int i;
    332     const char *fileName;
    333     char string[200];
    334 
     332    char fileName[33];
     333    md5_state_t state;
     334    md5_byte_t digest[16];
     335    char *string;
     336
     337    if (objPtr == NULL) {
     338        return statsFile;
     339    }
     340    if (Tcl_ListObjGetElements(interp, objPtr, &objc, &objv) != TCL_OK) {
     341        return -1;
     342    }
     343    Tcl_ListObjAppendElement(interp, objPtr, Tcl_NewStringObj("pid", 3));
     344    Tcl_ListObjAppendElement(interp, objPtr, Tcl_NewIntObj(getpid()));
     345    string = Tcl_GetStringFromObj(objPtr, &length);
     346
     347    md5_init(&state);
     348    md5_append(&state, (const md5_byte_t *)string, length);
     349    md5_finish(&state, digest);
     350    for (i = 0; i < 16; i++) {
     351        sprintf(fileName + i * 2, "%02x", digest[i]);
     352    }
    335353    Tcl_DStringInit(&ds);
    336354    Tcl_DStringAppend(&ds, STATSDIR, -1);
    337     SplitPath(path, &argc, &argv);
    338     for (i = 0; i < argc; i++) {
    339         char *p;
    340 
    341         Tcl_DStringAppend(&ds, "/", 1);
    342         Tcl_DStringAppend(&ds, argv[i], -1);
    343         p = Tcl_DStringValue(&ds);
    344         if (access(p, X_OK) != 0) {
    345             mkdir(p, 0770);
    346         }
    347     }
    348355    Tcl_DStringAppend(&ds, "/", 1);
    349     sprintf(string, "%d", getpid());
    350     Tcl_DStringAppend(&ds, string, -1);
    351     fileName = Tcl_DStringValue(&ds);
    352     free(argv);
    353     statsFile = open(fileName, O_EXCL | O_CREAT | O_WRONLY, 0600);
     356    Tcl_DStringAppend(&dsm fileName, 32);
     357    path = Tcl_DStringValue(&ds);
     358
     359    statsFile = open(path, O_EXCL | O_CREAT | O_WRONLY, 0600);
    354360    Tcl_DStringFree(&ds);
    355361    if (statsFile < 0) {
     
    361367
    362368int
    363 NanoVis::writeToStatsFile(const char *s, size_t length)
    364 {
    365     ssize_t numWritten;
    366 
    367     if (statsFile >= 0) {
    368         numWritten = write(statsFile, s, length);
     369NanoVis::writeToStatsFile(int f, const char *s, size_t length)
     370{
     371    if (f >= 0) {
     372        ssize_t numWritten;
     373
     374        numWritten = write(f, s, length);
    369375        if (numWritten == (ssize_t)length) {
    370             close(dup(statsFile));
     376            close(dup(f));
    371377        }
    372378    }
     
    381387    Tcl_DString ds;
    382388    int result;
     389    int f;
    383390
    384391    {
     
    483490    }
    484491    Tcl_DStringAppend(&ds, "\n", -1);
    485     result = NanoVis::writeToStatsFile(Tcl_DStringValue(&ds),
     492    f = NanoVis::getStatsFile(NULL);
     493    result = NanoVis::writeToStatsFile(f, Tcl_DStringValue(&ds),
    486494                                       Tcl_DStringLength(&ds));
     495    close(f);
    487496    Tcl_DStringFree(&ds);
    488497    return result;
     
    20042013    NanoVis::stdin = stdin;
    20052014
    2006     fprintf(stdout, "NanoVis %s\n", NANOVIS_VERSION);
     2015    fprintf(stdout, "NanoVis %s (build %s)\n", NANOVIS_VERSION, SVN_VERSION);
    20072016    fflush(stdout);
    20082017
  • trunk/packages/vizservers/nanovis/nanovis.h

    r3376 r3377  
    1818
    1919#include <tcl.h>
    20 
     20#include <md5.h>
    2121#include <GL/glew.h>
    2222
     
    9797
    9898#ifdef KEEPSTATS
    99     static int openStatsFile(const char *path);
    100     static int writeToStatsFile(const char *s, size_t length);
     99    static int getStatsFile(Tcl_Obj *objPtr);
     100    static int writeToStatsFile(int f, const char *s, size_t length);
    101101#endif
    102102    static void ppmWrite(const char *prefix);
  • trunk/packages/vizservers/pymolproxy/Makefile.in

    r2665 r3377  
    3030
    3131FILES =         pymolproxy pymolproxy2
    32 PROXY_OBJS =    pymolproxy.o
    33 PROXY2_OBJS =   pymolproxy2.o
     32PROXY_OBJS =    pymolproxy.o md5.o
     33PROXY2_OBJS =   pymolproxy2.o md5.o
    3434LIBS =          $(TCL_LIB_SPEC) \
    3535                -Wl,-rpath,$(RP_LIB_DIR)
  • trunk/packages/vizservers/pymolproxy/pymolproxy2.c

    r3376 r3377  
    7878#include <tcl.h>
    7979#include <pthread.h>
     80#include <md5.h>
    8081
    8182#undef INLINE
     
    576577
    577578static int
    578 OpenStatsFile(const char *path)
     579GetStatsFile(const char *string)
    579580{
    580581    Tcl_DString ds;
    581     char **argv;
    582     int argc;
    583582    int i;
    584     const char *fileName;
    585     char string[200];
    586 
    587     if (access(STATSDIR, X_OK) != 0) {
    588         mkdir(STATSDIR, 0770);
    589     }
    590     SplitPath(path, &argc, &argv);
     583    char fileName[33];
     584    const char *path;
     585    int length;
     586    char pidstr[200];
     587    md5_state_t state;
     588    md5_byte_t digest[16];
     589
     590    if (string == NULL) {
     591        return statsFile;
     592    }
     593    /* By itself the client's key/value pairs aren't unique.  Add in the
     594     * process id of this render server. */
    591595    Tcl_DStringInit(&ds);
     596    Tcl_DStringAppend(&ds, string, -1);
     597    Tcl_DStringAppendElement(&ds, "pid", 3);
     598    sprintf(pidstr, "%d", getpid());
     599    Tcl_DStringAppendElement(&ds, pidstr, -1);
     600
     601    /* Create a md5 hash of the key/value pairs and use it as the file name. */
     602    string = Tcl_DStringValue(&ds);
     603    length = strlen(string);
     604    md5_init(&state);
     605    md5_append(&state, (const md5_byte_t *)string, length);
     606    md5_finish(&state, digest);
     607    for (i = 0; i < 16; i++) {
     608        sprintf(fileName + i * 2, "%02x", digest[i]);
     609    }
     610    Tcl_DStringLength(&ds, 0);
    592611    Tcl_DStringAppend(&ds, STATSDIR, -1);
    593     for (i = 0; i < argc; i++) {
    594         char *p;
    595 
    596         Tcl_DStringAppend(&ds, "/", 1);
    597         Tcl_DStringAppend(&ds, argv[i], -1);
    598         p = Tcl_DStringValue(&ds);
    599         if (access(p, X_OK) != 0) {
    600             mkdir(p, 0770);
    601         }
    602     }
    603612    Tcl_DStringAppend(&ds, "/", 1);
    604     sprintf(string, "%d", getpid());
    605     Tcl_DStringAppend(&ds, string, -1);
    606     fileName = Tcl_DStringValue(&ds);
    607     free(argv);
    608     statsFile = open(fileName, O_CREAT | O_EXCL | O_WRONLY, 0600);
     613    Tcl_DStringAppend(&ds, fileName, 32);
     614    path = Tcl_DStringValue(&ds);
     615
     616    statsFile = open(path, O_EXCL | O_CREAT | O_WRONLY, 0600);
    609617    Tcl_DStringFree(&ds);
    610618    if (statsFile < 0) {
     
    616624
    617625static int
    618 WriteToStatsFile(const char *s, size_t length)
    619 {
    620     ssize_t numWritten;
    621 
    622     if (statsFile >= 0) {
    623         numWritten = write(statsFile, s, length);
     626WriteToStatsFile(int f, const char *s, size_t length)
     627{
     628
     629    if (f >= 0) {
     630        ssize_t numWritten;
     631
     632        numWritten = write(f, s, length);
    624633        if (numWritten == (ssize_t)length) {
    625             close(dup(statsFile));
     634            close(dup(f));
    626635        }
    627636    }
     
    738747    }
    739748    Tcl_DStringAppend(&ds, "\n", -1);
    740     result = WriteToStatsFile(Tcl_DStringValue(&ds), Tcl_DStringLength(&ds));
     749    f = GetStatsFile(NULL);
     750    result = WriteToStatsFile(f, Tcl_DStringValue(&ds), Tcl_DStringLength(&ds));
    741751    Tcl_DStringFree(&ds);
     752    close(f);
    742753    return result;
    743754}
     
    934945    char buf[BUFSIZ];
    935946    static int first = 1;
    936 
    937     if (argc != 3) {
     947    int f;
     948
     949    if (argc != 2) {
    938950        Tcl_AppendResult(interp, "wrong # of arguments: should be \"", argv[0],
    939                 " path list\"", (char *)NULL);
     951                " list\"", (char *)NULL);
    940952        return TCL_ERROR;
    941953    }
    942     if ((statsFile == -1) && (OpenStatsFile(argv[1]) < 0)) {
     954    /* Use the initial client key value pairs as the parts for a generating
     955     * a unique file name. */
     956    f = GetStatsFile(argv[1]);
     957    if (f < 0) {
    943958        Tcl_AppendResult(interp, "can't open stats file: ",
    944                         Tcl_PosixError(interp), (char *)NULL);
     959                        Tcl_PosixError(interp), (char *)NULL);
    945960        return TCL_ERROR;
    946961    }
     
    983998    free(elems);
    984999    Tcl_DStringAppend(&ds, "\n", 1);
    985     result = WriteToStatsFile(Tcl_DStringValue(&ds), Tcl_DStringLength(&ds));
     1000    result = WriteToStatsFile(f, Tcl_DStringValue(&ds), Tcl_DStringLength(&ds));
    9861001    Tcl_DStringFree(&ds);
    9871002    return result;
Note: See TracChangeset for help on using the changeset viewer.