Patch is attached, works great

Zoran Vasiljevic wrote:

Am 30.12.2005 um 16:02 schrieb Vlad Seryakov:

Is it worth trying?


Yesterday!
Zoran


-------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc. Do you grep through log files
for problems?  Stop!  Download the new AJAX search engine that makes
searching your log files as easy as surfing the  web.  DOWNLOAD SPLUNK!
http://ads.osdn.com/?ad_id=7637&alloc_id=16865&op=click
_______________________________________________
naviserver-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/naviserver-devel


--
Vlad Seryakov
571 262-8608 office
[EMAIL PROTECTED]
http://www.crystalballinc.com/vlad/

*** ../../naviserver/nsd/driver.c	2005-11-14 11:00:11.000000000 -0500
--- driver.c	2005-12-30 12:18:05.000000000 -0500
***************
*** 78,83 ****
--- 78,95 ----
  } ServerMap;
  
  /*
+  * Support for upload statistics
+  */
+ 
+ typedef struct UploadMap {
+     unsigned long length;
+     unsigned long size;
+ } UploadMap;
+ 
+ static Tcl_HashTable uploadTable; /* Hash table of uploads. */
+ static Ns_Mutex uploadLock;       /* Lock around upload table. */
+ 
+ /*
   * Static functions defined in this file.
   */
  
***************
*** 93,98 ****
--- 105,114 ----
  static void SockTimeout(Sock *sockPtr, Ns_Time *nowPtr, int timeout);
  static int  SetServer(Sock *sockPtr);
  
+ static void UploadDelete(char *url);
+ static void UploadUpdate(char *url, unsigned long length, unsigned long size);
+ static void UploadStats(char *url, unsigned long *length, unsigned long *size);
+ 
  /*
   * Static variables defined in this file.
   */
***************
*** 134,139 ****
--- 150,158 ----
  NsInitDrivers(void)
  {
      Tcl_InitHashTable(&hosts, TCL_STRING_KEYS);
+     Ns_MutexInit(&uploadLock);
+     Ns_MutexSetName(&lock, "ns:upload");
+     Tcl_InitHashTable(&uploadTable, TCL_STRING_KEYS);
  }
  
  
***************
*** 1454,1459 ****
--- 1473,1482 ----
      reqPtr->woff  += n;
      reqPtr->avail += n;
  
+     if (reqPtr->length > 0 && reqPtr->request) {
+         UploadUpdate(reqPtr->request->url, reqPtr->length, reqPtr->avail);
+     }
+ 
      return SockParse(sockPtr);
  }
  
***************
*** 1627,1632 ****
--- 1650,1663 ----
          
          if (reqPtr->length > 0) {
              reqPtr->content[reqPtr->length] = '\0';
+ 
+             /*
+              * Cleanup upload statistics hash table on upload finish
+              */
+ 
+             if (reqPtr->request) {
+                 UploadDelete(reqPtr->request->url);
+             }
          }
          return (reqPtr->request ? SOCK_READY : SOCK_ERROR);
      }
***************
*** 1688,1690 ****
--- 1719,1792 ----
          }
      }
  }
+ 
+ static void UploadDelete(char *url)
+ {
+     Tcl_HashEntry *hPtr;
+ 
+     if (url != NULL) {
+         Ns_MutexLock(&uploadLock);
+         hPtr = Tcl_FindHashEntry(&uploadTable, url);
+         if (hPtr != NULL) {
+             ns_free(Tcl_GetHashValue(hPtr));
+             Tcl_DeleteHashEntry(hPtr);
+         }
+         Ns_MutexUnlock(&uploadLock);
+     }
+ }
+ 
+ static void UploadUpdate(char *url, unsigned long length, unsigned long size)
+ {
+     int new;
+     Tcl_HashEntry *hPtr;
+     UploadMap *stats;
+ 
+     if (url != NULL) {
+         Ns_MutexLock(&uploadLock);
+         hPtr = Tcl_CreateHashEntry(&uploadTable, url, &new);
+         if (!new) {
+             stats = Tcl_GetHashValue(hPtr);
+         } else {
+             stats = ns_malloc(sizeof(UploadMap));
+             Tcl_SetHashValue(hPtr, stats);
+         }
+         stats->length = length;
+         stats->size = size;
+         Ns_Log(Notice, "UploadUpdate: %s: length=%lu size=%lu", url, length, size);
+         Ns_MutexUnlock(&uploadLock);
+     }
+ }
+ 
+ static void UploadStats(char *url, unsigned long *length, unsigned long *size)
+ {
+     Tcl_HashEntry *hPtr;
+     UploadMap *stats;
+ 
+     Ns_MutexLock(&uploadLock);
+     hPtr = Tcl_FindHashEntry(&uploadTable, url);
+     if (hPtr != NULL) {
+         stats = Tcl_GetHashValue(hPtr);
+         *length = stats->length;
+         *size = stats->size;
+     }
+     Ns_MutexUnlock(&uploadLock);
+ }
+ 
+ 
+ int
+ NsTclUploadStatsObjCmd(ClientData arg, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
+ {
+     char buf[64];
+     UploadMap stats = { 0, 0 };
+ 
+     if (objc != 2) {
+         Tcl_WrongNumArgs(interp, 1, objv, "url");
+         return TCL_ERROR;
+     }
+ 
+     UploadStats(Tcl_GetString(objv[1]), &stats.length, &stats.size);
+     sprintf(buf, "%lu %lu", stats.length, stats.size);
+     Tcl_AppendResult(interp, buf, NULL);
+     return NS_OK;
+ }
+ 
*** ../../naviserver/nsd/tclcmds.c	2005-12-30 09:35:03.000000000 -0500
--- tclcmds.c	2005-12-30 12:01:59.000000000 -0500
***************
*** 195,201 ****
      NsTclVarObjCmd,
      NsTclWriteContentObjCmd,
      NsTclWriteFpObjCmd,
!     NsTclWriteObjCmd;
  
  extern Tcl_CmdProc
      NsTclAdpDebugCmd,
--- 195,202 ----
      NsTclVarObjCmd,
      NsTclWriteContentObjCmd,
      NsTclWriteFpObjCmd,
!     NsTclWriteObjCmd,
!     NsTclUploadStatsObjCmd;
  
  extern Tcl_CmdProc
      NsTclAdpDebugCmd,
***************
*** 341,346 ****
--- 342,348 ----
      {"ns_uudecode", NULL, NsTclHTUUDecodeObjCmd},
      {"ns_uuencode", NULL, NsTclHTUUEncodeObjCmd},
      {"ns_writefp", NULL, NsTclWriteFpObjCmd},
+     {"ns_upload_stats", NULL, NsTclUploadStatsObjCmd},
  
      /*
       * Add more basic Tcl commands here.

Reply via email to