Changeset 3376 for trunk/packages/vizservers/nanovis
- Timestamp:
- Feb 27, 2013, 9:39:10 PM (12 years ago)
- Location:
- trunk/packages/vizservers/nanovis
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/packages/vizservers/nanovis/Command.cpp
r3362 r3376 749 749 * Log initial values to stats file. 750 750 * 751 * clientinfo path list 751 752 */ 752 753 static int … … 756 757 Tcl_DString ds; 757 758 int result; 758 int i; 759 int i, numElems; 760 Tcl_Obj **elems; 759 761 char buf[BUFSIZ]; 760 762 static int first = 1; 763 764 if (objc != 3) { 765 Tcl_AppendResult(interp, "wrong # of arguments: should be \"", 766 Tcl_GetString(objv[0]), " path list\"", (char *)NULL); 767 return TCL_ERROR; 768 } 769 #ifdef KEEPSTATS 770 const char *path; 771 772 path = Tcl_GetString(objv[1]); 773 if (NanoVis::openStatsFile(path) < 0) { 774 Tcl_AppendResult(interp, "can't open stats file: ", 775 Tcl_PosixError(interp), (char *)NULL); 776 return TCL_ERROR; 777 } 778 #endif 761 779 Tcl_DStringInit(&ds); 762 Tcl_DStringAppendElement(&ds, "render_start"); 780 if (first) { 781 Tcl_DStringAppendElement(&ds, "render_start"); 782 first = 0; 783 } else { 784 Tcl_DStringAppendElement(&ds, "render_info"); 785 } 763 786 /* renderer */ 764 787 Tcl_DStringAppendElement(&ds, "renderer"); … … 783 806 Tcl_DStringAppendElement(&ds, buf); 784 807 /* Client arguments. */ 785 for (i = 1; i < objc; i++) { 786 Tcl_DStringAppendElement(&ds, Tcl_GetString(objv[i])); 808 if (Tcl_ListObjGetElements(interp, objv[2], &numElems, &elems) != TCL_OK) { 809 return TCL_ERROR; 810 } 811 for (i = 0; i < numElems; i++) { 812 Tcl_DStringAppendElement(&ds, Tcl_GetString(elems[i])); 787 813 } 788 814 Tcl_DStringAppend(&ds, "\n", 1); 815 789 816 #ifdef KEEPSTATS 790 817 result = NanoVis::writeToStatsFile(Tcl_DStringValue(&ds), -
trunk/packages/vizservers/nanovis/nanovis.cpp
r3362 r3376 143 143 FILE *NanoVis::recfile = NULL; 144 144 145 int NanoVis::statsFile = -1; 146 145 147 bool NanoVis::axisOn = true; 146 148 bool NanoVis::debugFlag = false; … … 293 295 294 296 #define STATSDIR "/var/tmp/visservers" 295 #define STATSFILE STATSDIR "/" "nanovis_log.tcl"296 #define LOCKFILE STATSDIR "/" "LCK..nanovis"297 297 298 298 static int 299 getFileLock() 300 { 301 int numTries; 302 303 for (numTries = 0; numTries < 10; numTries++) { 304 int f; 305 306 f = open(LOCKFILE, O_TRUNC | O_CREAT | O_EXCL | O_WRONLY, 0600); 307 if (f >= 0) { 308 char buf[200]; 309 ssize_t numWritten; 310 size_t numBytes; 311 312 sprintf(buf, "%d\n", getpid()); 313 numBytes = strlen(buf); 314 numWritten = write(f, buf, numBytes); 315 if (numWritten != (ssize_t)numBytes) { 316 ERROR("Wrote short lock file"); 317 } 318 close(f); 319 return 0; 320 } 321 sleep(1); /* Wait for lock to release. */ 322 } 323 ERROR("Failed to open lock file"); 324 return -1; 325 } 326 327 static void 328 releaseFileLock() 329 { 330 unlink(LOCKFILE); 299 SplitPath(const char *path, int *argcPtr, char ***argvPtr) 300 { 301 char **array; 302 int count; 303 char *p; 304 char *s; 305 size_t addrsize; 306 307 count = 0; 308 for (p = strchr((char *)path, '/'); p != NULL; p = strchr(p+1, '/')) { 309 count++; 310 } 311 addrsize = (count + 1) * sizeof(char *); 312 array = (char **)malloc(addrsize + strlen(path) + 1); 313 s = (char *)array + addrsize; 314 strcpy(s, path); 315 316 count = 0; 317 for (p = strtok(s, "/"); p != NULL; p = strtok(NULL, "/")) { 318 array[count++] = p; 319 } 320 *argcPtr = count; 321 *argvPtr = array; 322 return count; 323 } 324 325 int 326 NanoVis::openStatsFile(const char *path) 327 { 328 Tcl_DString ds; 329 char **argv; 330 int argc; 331 int i; 332 const char *fileName; 333 char string[200]; 334 335 Tcl_DStringInit(&ds); 336 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 } 348 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); 354 Tcl_DStringFree(&ds); 355 if (statsFile < 0) { 356 ERROR("can't open \"%s\": %s", fileName, strerror(errno)); 357 return -1; 358 } 359 return statsFile; 331 360 } 332 361 … … 334 363 NanoVis::writeToStatsFile(const char *s, size_t length) 335 364 { 336 int f;337 365 ssize_t numWritten; 338 if (access(STATSDIR, X_OK) != 0) { 339 mkdir(STATSDIR, 0770); 340 } 341 if (getFileLock() < 0) { 342 return -1; 343 } 344 f = open(STATSFILE, O_APPEND | O_CREAT | O_WRONLY, 0600); 345 releaseFileLock(); 346 if (f < 0) { 347 return -1; 348 } 349 numWritten = write(f, s, length); 350 if (numWritten != (ssize_t)length) { 351 close(f); 352 return -1; 353 } 354 close(f); 366 367 if (statsFile >= 0) { 368 numWritten = write(statsFile, s, length); 369 if (numWritten == (ssize_t)length) { 370 close(dup(statsFile)); 371 } 372 } 355 373 return 0; 356 374 } -
trunk/packages/vizservers/nanovis/nanovis.h
r3362 r3376 97 97 98 98 #ifdef KEEPSTATS 99 static int openStatsFile(const char *path); 99 100 static int writeToStatsFile(const char *s, size_t length); 100 101 #endif … … 152 153 153 154 static FILE *stdin, *logfile, *recfile; 154 155 static int statsFile; 155 156 static unsigned int flags; 156 157 static bool debugFlag;
Note: See TracChangeset
for help on using the changeset viewer.