You can subscribe to this list here.
2005 |
Jan
|
Feb
(32) |
Mar
(56) |
Apr
(92) |
May
(39) |
Jun
(226) |
Jul
(98) |
Aug
(66) |
Sep
|
Oct
(153) |
Nov
(43) |
Dec
(42) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2006 |
Jan
(97) |
Feb
(141) |
Mar
(147) |
Apr
(80) |
May
(51) |
Jun
(93) |
Jul
(88) |
Aug
(50) |
Sep
(179) |
Oct
(48) |
Nov
(82) |
Dec
(71) |
2007 |
Jan
(42) |
Feb
(46) |
Mar
(123) |
Apr
(21) |
May
(139) |
Jun
(59) |
Jul
(34) |
Aug
(57) |
Sep
(47) |
Oct
(137) |
Nov
(49) |
Dec
(12) |
2008 |
Jan
(10) |
Feb
(8) |
Mar
(63) |
Apr
(17) |
May
(34) |
Jun
(38) |
Jul
(16) |
Aug
(62) |
Sep
(9) |
Oct
(121) |
Nov
(38) |
Dec
(4) |
2009 |
Jan
|
Feb
(11) |
Mar
(9) |
Apr
|
May
|
Jun
|
Jul
(1) |
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2010 |
Jan
|
Feb
|
Mar
(4) |
Apr
(10) |
May
(1) |
Jun
(1) |
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2011 |
Jan
(1) |
Feb
(1) |
Mar
(3) |
Apr
(2) |
May
|
Jun
|
Jul
|
Aug
(3) |
Sep
(2) |
Oct
(1) |
Nov
|
Dec
(12) |
2012 |
Jan
(26) |
Feb
(1) |
Mar
(15) |
Apr
(1) |
May
(1) |
Jun
(7) |
Jul
(2) |
Aug
|
Sep
(1) |
Oct
(52) |
Nov
(8) |
Dec
(25) |
2013 |
Jan
(35) |
Feb
(14) |
Mar
(10) |
Apr
(10) |
May
(29) |
Jun
(16) |
Jul
(5) |
Aug
(8) |
Sep
(8) |
Oct
(6) |
Nov
(1) |
Dec
(3) |
2014 |
Jan
(16) |
Feb
(13) |
Mar
(5) |
Apr
(9) |
May
(21) |
Jun
(6) |
Jul
(5) |
Aug
(2) |
Sep
(59) |
Oct
(115) |
Nov
(122) |
Dec
(45) |
2015 |
Jan
(31) |
Feb
(32) |
Mar
(19) |
Apr
(25) |
May
(3) |
Jun
(4) |
Jul
(18) |
Aug
(3) |
Sep
(23) |
Oct
(11) |
Nov
(17) |
Dec
(12) |
2016 |
Jan
(20) |
Feb
(27) |
Mar
(20) |
Apr
(40) |
May
(35) |
Jun
(48) |
Jul
(44) |
Aug
(51) |
Sep
(18) |
Oct
(42) |
Nov
(39) |
Dec
(29) |
2017 |
Jan
(37) |
Feb
(34) |
Mar
(20) |
Apr
(37) |
May
(10) |
Jun
(2) |
Jul
(14) |
Aug
(15) |
Sep
(25) |
Oct
(29) |
Nov
(15) |
Dec
(29) |
2018 |
Jan
(5) |
Feb
(15) |
Mar
(6) |
Apr
(20) |
May
(39) |
Jun
(39) |
Jul
(17) |
Aug
(20) |
Sep
(10) |
Oct
(17) |
Nov
(20) |
Dec
(8) |
2019 |
Jan
(28) |
Feb
(21) |
Mar
(13) |
Apr
(44) |
May
(44) |
Jun
(28) |
Jul
(51) |
Aug
(30) |
Sep
(7) |
Oct
(20) |
Nov
(8) |
Dec
(21) |
2020 |
Jan
(27) |
Feb
(5) |
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: Vlad S. <ser...@us...> - 2006-01-18 02:55:49
|
Update of /cvsroot/naviserver/modules/nsdns In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv24574/modules/nsdns Modified Files: nsdns.c Log Message: Index: nsdns.c =================================================================== RCS file: /cvsroot/naviserver/modules/nsdns/nsdns.c,v retrieving revision 1.20 retrieving revision 1.21 diff -C2 -d -r1.20 -r1.21 *** nsdns.c 17 Jan 2006 23:21:06 -0000 1.20 --- nsdns.c 18 Jan 2006 02:55:41 -0000 1.21 *************** *** 922,928 **** // First item deleted, update cache entry value if(qcache == qstart) { ! qstart = next; ! qstart->prev = 0; ! Tcl_SetHashValue(hrec,qstart); } qcache = next; --- 922,929 ---- // First item deleted, update cache entry value if(qcache == qstart) { ! if((qstart = next)) { ! qstart->prev = 0; ! Tcl_SetHashValue(hrec,qstart); ! } } qcache = next; |
From: Vlad S. <ser...@us...> - 2006-01-18 02:27:04
|
Update of /cvsroot/naviserver/naviserver/nsthread In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv16652/nsthread Modified Files: thread.c Log Message: See ChangeLog Index: thread.c =================================================================== RCS file: /cvsroot/naviserver/naviserver/nsthread/thread.c,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** thread.c 10 Jun 2005 17:58:59 -0000 1.2 --- thread.c 18 Jan 2006 02:26:54 -0000 1.3 *************** *** 268,277 **** void ! Ns_ThreadSetName(char *name) { Thread *thisPtr = GetThread(); Ns_MasterLock(); ! strncpy(thisPtr->name, name, NS_THREAD_NAMESIZE); Ns_MasterUnlock(); } --- 268,280 ---- void ! Ns_ThreadSetName(char *name,...) { Thread *thisPtr = GetThread(); + va_list ap; Ns_MasterLock(); ! va_start(ap, name); ! vsnprintf(thisPtr->name, NS_THREAD_NAMESIZE, name, ap); ! va_end(ap); Ns_MasterUnlock(); } |
From: Vlad S. <ser...@us...> - 2006-01-18 02:27:03
|
Update of /cvsroot/naviserver/naviserver/nsd In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv16652/nsd Modified Files: driver.c nsd.h queue.c sched.c task.c tcljob.c Log Message: See ChangeLog Index: sched.c =================================================================== RCS file: /cvsroot/naviserver/naviserver/nsd/sched.c,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** sched.c 10 Jun 2005 17:58:39 -0000 1.2 --- sched.c 18 Jan 2006 02:26:53 -0000 1.3 *************** *** 657,661 **** { Event *ePtr; ! char name[20], idle[20]; time_t now; --- 657,661 ---- { Event *ePtr; ! char idle[20]; time_t now; *************** *** 678,683 **** --nIdleThreads; Ns_MutexUnlock(&lock); ! sprintf(name, "-sched:%u-", ePtr->id); ! Ns_ThreadSetName(name); (*ePtr->proc) (ePtr->arg, (int)ePtr->id); Ns_ThreadSetName(idle); --- 678,682 ---- --nIdleThreads; Ns_MutexUnlock(&lock); ! Ns_ThreadSetName("-sched:%u-", ePtr->id); (*ePtr->proc) (ePtr->arg, (int)ePtr->id); Ns_ThreadSetName(idle); Index: nsd.h =================================================================== RCS file: /cvsroot/naviserver/naviserver/nsd/nsd.h,v retrieving revision 1.45 retrieving revision 1.46 diff -C2 -d -r1.45 -r1.46 *** nsd.h 16 Jan 2006 04:29:57 -0000 1.45 --- nsd.h 18 Jan 2006 02:26:53 -0000 1.46 *************** *** 364,368 **** int writersize; /* Maximum content size when to use writer thread. */ unsigned int loggingFlags; /* Logging control flags */ - } Driver; --- 364,367 ---- Index: tcljob.c =================================================================== RCS file: /cvsroot/naviserver/naviserver/nsd/tcljob.c,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** tcljob.c 12 Jun 2005 14:42:44 -0000 1.6 --- tcljob.c 18 Jan 2006 02:26:53 -0000 1.7 *************** *** 1057,1061 **** Tcl_Interp *interp; Job *jobPtr; - char buf[100]; CONST char *err; Queue *queuePtr; --- 1057,1060 ---- *************** *** 1064,1070 **** Ns_WaitForStartup(); Ns_MutexLock(&tp.queuelock); ! snprintf(buf, 100, "-ns_job_%x-", tp.nextThreadId++); ! Ns_ThreadSetName(buf); ! Ns_Log(Notice, "Starting thread: %s", buf); while (1) { ++tp.nidle; --- 1063,1068 ---- Ns_WaitForStartup(); Ns_MutexLock(&tp.queuelock); ! Ns_ThreadSetName("-ns_job_%x-", tp.nextThreadId++); ! Ns_Log(Notice, "Starting thread: -ns_job_%x-", tp.nextThreadId); while (1) { ++tp.nidle; Index: task.c =================================================================== RCS file: /cvsroot/naviserver/naviserver/nsd/task.c,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** task.c 4 Jan 2006 10:15:52 -0000 1.1 --- task.c 18 Jan 2006 02:26:53 -0000 1.2 *************** *** 781,788 **** struct pollfd *pfds; Ns_Time now, *timeoutPtr; - char name[NAME_SIZE+10]; ! sprintf(name, "task:%s", queuePtr->name); ! Ns_ThreadSetName(name); Ns_Log(Notice, "starting"); --- 781,786 ---- struct pollfd *pfds; Ns_Time now, *timeoutPtr; ! Ns_ThreadSetName("task:%s", queuePtr->name); Ns_Log(Notice, "starting"); Index: queue.c =================================================================== RCS file: /cvsroot/naviserver/naviserver/nsd/queue.c,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** queue.c 2 Oct 2005 22:39:06 -0000 1.7 --- queue.c 18 Jan 2006 02:26:53 -0000 1.8 *************** *** 522,526 **** Ns_Time wait, *timePtr; unsigned int id; - Ns_DString ds; int status, cpt, ncons; char *p, *path; --- 522,525 ---- *************** *** 535,546 **** id = poolPtr->threads.nextid++; Ns_MutexUnlock(&servPtr->pools.lock); ! Ns_DStringInit(&ds); ! Ns_DStringVarAppend(&ds, "-conn:", servPtr->server, NULL); ! if (poolPtr->pool != NULL) { ! Ns_DStringVarAppend(&ds, ":", poolPtr->pool, NULL); ! } ! Ns_DStringPrintf(&ds, ":%d", id); ! Ns_ThreadSetName(ds.string); ! Ns_DStringFree(&ds); /* --- 534,540 ---- id = poolPtr->threads.nextid++; Ns_MutexUnlock(&servPtr->pools.lock); ! ! p = (poolPtr->pool != NULL && *poolPtr->pool ? poolPtr->pool : 0); ! Ns_ThreadSetName("-conn:%s%s%s:%d", servPtr->server, p ? ":" : "", p ? p : "", id); /* Index: driver.c =================================================================== RCS file: /cvsroot/naviserver/naviserver/nsd/driver.c,v retrieving revision 1.33 retrieving revision 1.34 diff -C2 -d -r1.33 -r1.34 *** driver.c 17 Jan 2006 23:21:06 -0000 1.33 --- driver.c 18 Jan 2006 02:26:53 -0000 1.34 *************** *** 166,171 **** static Sock *spoolerSockPtr = NULL; /* List of spooled Sock structures. */ - static int writerThreads = 1; /* Number of writer threads to run. */ static Ns_Mutex writerLock; /* Lock around writer queues. */ static WriterQueue *firstQueuePtr = NULL; /* List of writer threads. */ static WriterQueue *curQueuePtr = NULL; /* Current writer thread */ --- 166,171 ---- static Sock *spoolerSockPtr = NULL; /* List of spooled Sock structures. */ static Ns_Mutex writerLock; /* Lock around writer queues. */ + static int writerThreads = 0; /* Number of writer threads to run. */ static WriterQueue *firstQueuePtr = NULL; /* List of writer threads. */ static WriterQueue *curQueuePtr = NULL; /* Current writer thread */ *************** *** 407,410 **** --- 407,412 ---- if (!Ns_ConfigBool(path, "spooler", NS_TRUE)) { spoolerDisabled = 1; + } else { + Ns_Log(Notice, "%s: enable spooler thread for uploads >= %d bytes", module, drvPtr->uploadsize); } *************** *** 416,419 **** --- 418,422 ---- if (writerThreads > 0) { drvPtr->writersize = Ns_ConfigIntRange(path, "writersize", 1024*1024, 1024*1024, INT_MAX); + Ns_Log(Notice, "%s: enable %d writer thread(s) for downloads >= %d bytes", module, writerThreads, drvPtr->writersize); for (i = 0; i < writerThreads; i++) { WriterQueue *queuePtr = ns_calloc(1, sizeof(WriterQueue)); *************** *** 690,696 **** Ns_MutexUnlock(&queuePtr->lock); if (status != NS_OK) { ! Ns_Log(Warning, "writer: %d: timeout waiting for shutdown", queuePtr->id); } else { ! Ns_Log(Notice, "writer: %d: shutdown complete", queuePtr->id); queuePtr->thread = NULL; ns_sockclose(queuePtr->pipe[0]); --- 693,699 ---- Ns_MutexUnlock(&queuePtr->lock); if (status != NS_OK) { ! Ns_Log(Warning, "writer%d: timeout waiting for shutdown", queuePtr->id); } else { ! Ns_Log(Notice, "writer%d: shutdown complete", queuePtr->id); queuePtr->thread = NULL; ns_sockclose(queuePtr->pipe[0]); *************** *** 2258,2262 **** struct iovec vbuf; ! Ns_ThreadSetName("-writer-"); /* --- 2261,2265 ---- struct iovec vbuf; ! Ns_ThreadSetName("-writer%d-", queuePtr->id); /* *************** *** 2265,2272 **** */ ! Ns_Log(Notice, "writer: %d: accepting connections", queuePtr->id); ! writePtr = NULL; Ns_GetTime(&now); stopping = 0; pfds[0].fd = queuePtr->pipe[0]; pfds[0].events = POLLIN; --- 2268,2275 ---- */ ! Ns_Log(Notice, "writer%d: accepting connections", queuePtr->id); Ns_GetTime(&now); stopping = 0; + writePtr = NULL; pfds[0].fd = queuePtr->pipe[0]; pfds[0].events = POLLIN; *************** *** 2418,2421 **** --- 2421,2426 ---- int trigger = 0; + Ns_Log(Notice, "Writer: check %d %d %d %d", writerThreads, nsend,connPtr->drvPtr->writersize,(conn->flags & NS_CONN_WRITE_CHUNKED)); + if (writerThreads == 0 || nsend < connPtr->drvPtr->writersize || |
From: Vlad S. <ser...@us...> - 2006-01-18 02:27:03
|
Update of /cvsroot/naviserver/naviserver In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv16652 Modified Files: ChangeLog Log Message: See ChangeLog Index: ChangeLog =================================================================== RCS file: /cvsroot/naviserver/naviserver/ChangeLog,v retrieving revision 1.276 retrieving revision 1.277 diff -C2 -d -r1.276 -r1.277 *** ChangeLog 17 Jan 2006 23:21:06 -0000 1.276 --- ChangeLog 18 Jan 2006 02:26:53 -0000 1.277 *************** *** 3,6 **** --- 3,13 ---- * nsd/driver.c: Improved Writer thread support, now it is possible to have multiple writer thread for better performance. + * nstread/thread.c: Make Ns_ThreadSetName to accept sprintf-like + variable list of arguments + * nsd/sched.c: + * nsd/tcljob.c + * nsd/queue.c: + * nsd/task.c: Changed setting thread name using new sprintf-like + arguments 2006-01-16 Bernd Eidenschink <ei...@us...> |
From: Vlad S. <ser...@us...> - 2006-01-18 02:27:03
|
Update of /cvsroot/naviserver/naviserver/include In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv16652/include Modified Files: nsthread.h Log Message: See ChangeLog Index: nsthread.h =================================================================== RCS file: /cvsroot/naviserver/naviserver/include/nsthread.h,v retrieving revision 1.11 retrieving revision 1.12 diff -C2 -d -r1.11 -r1.12 *** nsthread.h 15 Oct 2005 16:01:02 -0000 1.11 --- nsthread.h 18 Jan 2006 02:26:53 -0000 1.12 *************** *** 305,309 **** NS_EXTERN void Ns_ThreadJoin(Ns_Thread *threadPtr, void **argPtr); NS_EXTERN void Ns_ThreadYield(void); ! NS_EXTERN void Ns_ThreadSetName(char *name); NS_EXTERN int Ns_ThreadId(void); NS_EXTERN void Ns_ThreadSelf(Ns_Thread *threadPtr); --- 305,309 ---- NS_EXTERN void Ns_ThreadJoin(Ns_Thread *threadPtr, void **argPtr); NS_EXTERN void Ns_ThreadYield(void); ! NS_EXTERN void Ns_ThreadSetName(char *name, ...); NS_EXTERN int Ns_ThreadId(void); NS_EXTERN void Ns_ThreadSelf(Ns_Thread *threadPtr); |
From: Vlad S. <ser...@us...> - 2006-01-17 23:21:15
|
Update of /cvsroot/naviserver/naviserver/nsd In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv9809/nsd Modified Files: connio.c driver.c Log Message: Writer support improved Index: driver.c =================================================================== RCS file: /cvsroot/naviserver/naviserver/nsd/driver.c,v retrieving revision 1.32 retrieving revision 1.33 diff -C2 -d -r1.32 -r1.33 *** driver.c 16 Jan 2006 04:29:57 -0000 1.32 --- driver.c 17 Jan 2006 23:21:06 -0000 1.33 *************** *** 59,63 **** Reason_WriteTimeout, Reason_ServerReject, ! Reason_SockError, Reason_SockShutError } ReleaseReasons; --- 59,64 ---- Reason_WriteTimeout, Reason_ServerReject, ! Reason_SockReadError, ! Reason_SockWriteError, Reason_SockShutError } ReleaseReasons; *************** *** 85,89 **** /* ! * The following maintains files to be written to the clients */ --- 86,90 ---- /* ! * The following maintains writer threads and sockets to be written to the clients */ *************** *** 92,99 **** --- 93,115 ---- Sock *sockPtr; int fd; + int nread; int nsend; int flags; + int bufsize; + char buf[2048]; } WriterSock; + typedef struct WriterQueue { + struct WriterQueue *nextPtr; + WriterSock *sockPtr; /* List of spooled Sock structures. */ + SOCKET pipe[2]; /* Trigger to wakeup SpoolThread. */ + Ns_Mutex lock; /* Lock around spooled list. */ + Ns_Cond cond; /* Cond for stopped flag. */ + Ns_Thread thread; /* Running SpoolThread. */ + int stopped; /* Flag to indicate writer thread stopped. */ + int shutdown; /* Flag to indicate shutdown. */ + int id; + } WriterQueue; + /* * Static functions defined in this file. *************** *** 105,109 **** static int SetServer(Sock *sockPtr); static Sock *SockAccept(Driver *drvPtr); ! static void SockRelease(Sock *sockPtr, ReleaseReasons reason); static void SockTrigger(SOCKET sock); static void SockPoll(Sock *sockPtr, int type, struct pollfd **pfds, unsigned int *nfds, --- 121,125 ---- static int SetServer(Sock *sockPtr); static Sock *SockAccept(Driver *drvPtr); ! static void SockRelease(Sock *sockPtr, ReleaseReasons reason, int err); static void SockTrigger(SOCKET sock); static void SockPoll(Sock *sockPtr, int type, struct pollfd **pfds, unsigned int *nfds, *************** *** 117,121 **** static Sock *SockSpoolerPop(void); ! static void SockWriterRelease(WriterSock *sockPtr, ReleaseReasons reason); /* --- 133,137 ---- static Sock *SockSpoolerPop(void); ! static void SockWriterRelease(WriterSock *sockPtr, ReleaseReasons reason, int err); /* *************** *** 150,161 **** static Sock *spoolerSockPtr = NULL; /* List of spooled Sock structures. */ ! static SOCKET writerPipe[2]; /* Trigger to wakeup SpoolThread. */ ! static Ns_Mutex writerLock; /* Lock around spooled list. */ ! static Ns_Cond writerCond; /* Cond for stopped flag. */ ! static Ns_Thread writerThread; /* Running SpoolThread. */ ! static int writerStopped = 0; /* Flag to indicate writer thread stopped. */ ! static int writerShutdown = 0; /* Flag to indicate shutdown. */ ! static int writerDisabled = 1; /* Flag to enable/disable the upload writer. */ ! static WriterSock *writerSockPtr = NULL; /* List of spooled Sock structures. */ #define Push(x, xs) ((x)->nextPtr = (xs), (xs) = (x)) --- 166,173 ---- static Sock *spoolerSockPtr = NULL; /* List of spooled Sock structures. */ ! static int writerThreads = 1; /* Number of writer threads to run. */ ! static Ns_Mutex writerLock; /* Lock around writer queues. */ ! static WriterQueue *firstQueuePtr = NULL; /* List of writer threads. */ ! static WriterQueue *curQueuePtr = NULL; /* Current writer thread */ #define Push(x, xs) ((x)->nextPtr = (xs), (xs) = (x)) *************** *** 328,332 **** drvPtr->bufsize, drvPtr->maxinput); drvPtr->uploadsize = Ns_ConfigIntRange(path, "uploadsize", 2048, 1024, INT_MAX); - drvPtr->writersize = Ns_ConfigIntRange(path, "writer", 1024*1024, 1024*1024*10, INT_MAX); drvPtr->sndbuf = Ns_ConfigIntRange(path, "sndbuf", 0, 0, INT_MAX); drvPtr->rcvbuf = Ns_ConfigIntRange(path, "rcvbuf", 0, 0, INT_MAX); --- 340,343 ---- *************** *** 391,394 **** --- 402,427 ---- /* + * Check if upload spooler has been disabled + */ + + if (!Ns_ConfigBool(path, "spooler", NS_TRUE)) { + spoolerDisabled = 1; + } + + /* + * Number of writer threads + */ + + writerThreads = Ns_ConfigIntRange(path, "writerthreads", 0, 0, 32); + if (writerThreads > 0) { + drvPtr->writersize = Ns_ConfigIntRange(path, "writersize", 1024*1024, 1024*1024, INT_MAX); + for (i = 0; i < writerThreads; i++) { + WriterQueue *queuePtr = ns_calloc(1, sizeof(WriterQueue)); + queuePtr->id = i; + Push(queuePtr, firstQueuePtr); + } + } + + /* * Map Host headers for drivers not bound to servers. */ *************** *** 432,447 **** } - /* - * Check if upload spooler has been disabled - */ - - if (!Ns_ConfigBool(path, "spooler", NS_TRUE)) { - spoolerDisabled = 1; - } - - if (Ns_ConfigBool(path, "writer", NS_FALSE)) { - writerDisabled = 0; - } - return NS_OK; } --- 465,468 ---- *************** *** 468,471 **** --- 489,493 ---- { Driver *drvPtr; + WriterQueue *queuePtr; /* *************** *** 522,534 **** /* ! * Create the writer thread. */ ! if (writerDisabled == 0) { ! if (ns_sockpair(writerPipe) != 0) { Ns_Fatal("driver: ns_sockpair() failed: %s", ns_sockstrerror(ns_sockerrno)); } ! Ns_ThreadCreate(WriterThread, NULL, 0, &writerThread); } } --- 544,558 ---- /* ! * Create the writer thread(s) */ ! queuePtr = firstQueuePtr; ! while (queuePtr) { ! if (ns_sockpair(queuePtr->pipe) != 0) { Ns_Fatal("driver: ns_sockpair() failed: %s", ns_sockstrerror(ns_sockerrno)); } ! Ns_ThreadCreate(WriterThread, queuePtr, 0, &queuePtr->thread); ! queuePtr = queuePtr->nextPtr; } } *************** *** 555,558 **** --- 579,584 ---- NsStopDrivers(void) { + WriterQueue *queuePtr; + Ns_MutexLock(&drvLock); if (!drvStopped && !driverShutdown) { *************** *** 572,575 **** --- 598,613 ---- Ns_MutexUnlock(&spoolerLock); } + + queuePtr = firstQueuePtr; + while (queuePtr) { + Ns_MutexLock(&queuePtr->lock); + if (!queuePtr->stopped && !queuePtr->shutdown) { + Ns_Log(Notice, "writer: %d: triggering shutdown", queuePtr->id); + queuePtr->shutdown = 1; + SockTrigger(queuePtr->pipe[1]); + } + Ns_MutexUnlock(&queuePtr->lock); + queuePtr = queuePtr->nextPtr; + } } *************** *** 598,601 **** --- 636,640 ---- Tcl_HashEntry *hPtr; Tcl_HashSearch search; + WriterQueue *queuePtr; Ns_MutexLock(&drvLock); *************** *** 619,622 **** --- 658,662 ---- if (!spoolerDisabled) { + status = NS_OK; Ns_MutexLock(&spoolerLock); while (!spoolerStopped && status == NS_OK) { *************** *** 640,643 **** --- 680,702 ---- } } + + queuePtr = firstQueuePtr; + while (queuePtr) { + status = NS_OK; + Ns_MutexLock(&queuePtr->lock); + while (!queuePtr->stopped && status == NS_OK) { + status = Ns_CondTimedWait(&queuePtr->cond, &queuePtr->lock, toPtr); + } + Ns_MutexUnlock(&queuePtr->lock); + if (status != NS_OK) { + Ns_Log(Warning, "writer: %d: timeout waiting for shutdown", queuePtr->id); + } else { + Ns_Log(Notice, "writer: %d: shutdown complete", queuePtr->id); + queuePtr->thread = NULL; + ns_sockclose(queuePtr->pipe[0]); + ns_sockclose(queuePtr->pipe[1]); + } + queuePtr = queuePtr->nextPtr; + } } *************** *** 933,937 **** } if (Ns_DiffTime(&sockPtr->timeout, &now, &diff) <= 0) { ! SockRelease(sockPtr, Reason_CloseTimeout); } else { Push(sockPtr, closePtr); --- 992,996 ---- } if (Ns_DiffTime(&sockPtr->timeout, &now, &diff) <= 0) { ! SockRelease(sockPtr, Reason_CloseTimeout, 0); } else { Push(sockPtr, closePtr); *************** *** 951,955 **** if (!(pfds[sockPtr->pidx].revents & POLLIN)) { if (Ns_DiffTime(&sockPtr->timeout, &now, &diff) <= 0) { ! SockRelease(sockPtr, Reason_ReadTimeout); } else { Push(sockPtr, readPtr); --- 1010,1014 ---- if (!(pfds[sockPtr->pidx].revents & POLLIN)) { if (Ns_DiffTime(&sockPtr->timeout, &now, &diff) <= 0) { ! SockRelease(sockPtr, Reason_ReadTimeout, 0); } else { Push(sockPtr, readPtr); *************** *** 984,988 **** case SOCK_READY: if (!SetServer(sockPtr)) { ! SockRelease(sockPtr, Reason_ServerReject); } else { Push(sockPtr, waitPtr); --- 1043,1047 ---- case SOCK_READY: if (!SetServer(sockPtr)) { ! SockRelease(sockPtr, Reason_ServerReject, 0); } else { Push(sockPtr, waitPtr); *************** *** 990,994 **** break; default: ! SockRelease(sockPtr, Reason_SockError); break; } --- 1049,1053 ---- break; default: ! SockRelease(sockPtr, Reason_SockReadError, errno); break; } *************** *** 1062,1066 **** if (n == NS_OK && sockPtr->reqPtr) { if (!SetServer(sockPtr)) { ! SockRelease(sockPtr, Reason_ServerReject); } else { if (!NsQueueConn(sockPtr, &now)) { --- 1121,1125 ---- if (n == NS_OK && sockPtr->reqPtr) { if (!SetServer(sockPtr)) { ! SockRelease(sockPtr, Reason_ServerReject, 0); } else { if (!NsQueueConn(sockPtr, &now)) { *************** *** 1120,1124 **** } else { if (shutdown(sockPtr->sock, 1) != 0) { ! SockRelease(sockPtr, Reason_SockShutError); } else { SockTimeout(sockPtr, &now, sockPtr->drvPtr->closewait); --- 1179,1183 ---- } else { if (shutdown(sockPtr->sock, 1) != 0) { ! SockRelease(sockPtr, Reason_SockShutError, errno); } else { SockTimeout(sockPtr, &now, sockPtr->drvPtr->closewait); *************** *** 1377,1381 **** static void ! SockRelease(Sock *sockPtr, ReleaseReasons reason) { char *errMsg = NULL; --- 1436,1440 ---- static void ! SockRelease(Sock *sockPtr, ReleaseReasons reason, int err) { char *errMsg = NULL; *************** *** 1403,1411 **** } break; ! case Reason_SockError: if (sockPtr->drvPtr->loggingFlags & LOGGING_SOCKERROR) { errMsg = "Unable to read request"; } break; case Reason_SockShutError: if (sockPtr->drvPtr->loggingFlags & LOGGING_SOCKSHUTERROR) { --- 1462,1475 ---- } break; ! case Reason_SockReadError: if (sockPtr->drvPtr->loggingFlags & LOGGING_SOCKERROR) { errMsg = "Unable to read request"; } break; + case Reason_SockWriteError: + if (sockPtr->drvPtr->loggingFlags & LOGGING_SOCKERROR) { + errMsg = "Unable to write request"; + } + break; case Reason_SockShutError: if (sockPtr->drvPtr->loggingFlags & LOGGING_SOCKSHUTERROR) { *************** *** 1415,1421 **** } if (errMsg != NULL) { ! Ns_Log( Error, "Releasing Socket; %s, Peer = %s:%d", ! errMsg, ns_inet_ntoa(sockPtr->sa.sin_addr), ! ntohs(sockPtr->sa.sin_port) ); } --- 1479,1486 ---- } if (errMsg != NULL) { ! Ns_Log( Error, "Releasing Socket; %s %s, FD = %d, Peer = %s:%d", ! errMsg, (err ? strerror(err) : ""), sockPtr->sock, ! ns_inet_ntoa(sockPtr->sa.sin_addr), ! ntohs(sockPtr->sa.sin_port)); } *************** *** 2030,2034 **** } if ((pfds[0].revents & POLLIN) && recv(spoolerPipe[0], &c, 1, 0) != 1) { ! Ns_Fatal("driver: trigger recv() failed: %s", ns_sockstrerror(ns_sockerrno)); } --- 2095,2099 ---- } if ((pfds[0].revents & POLLIN) && recv(spoolerPipe[0], &c, 1, 0) != 1) { ! Ns_Fatal("spooler: trigger recv() failed: %s", ns_sockstrerror(ns_sockerrno)); } *************** *** 2044,2048 **** if (!(pfds[sockPtr->pidx].revents & POLLIN)) { if (Ns_DiffTime(&sockPtr->timeout, &now, &diff) <= 0) { ! SockRelease(sockPtr, Reason_ReadTimeout); } else { Push(sockPtr, readPtr); --- 2109,2113 ---- if (!(pfds[sockPtr->pidx].revents & POLLIN)) { if (Ns_DiffTime(&sockPtr->timeout, &now, &diff) <= 0) { ! SockRelease(sockPtr, Reason_ReadTimeout, 0); } else { Push(sockPtr, readPtr); *************** *** 2072,2076 **** case SOCK_READY: if (!SetServer(sockPtr)) { ! SockRelease(sockPtr, Reason_ServerReject); } else { Push(sockPtr, waitPtr); --- 2137,2141 ---- case SOCK_READY: if (!SetServer(sockPtr)) { ! SockRelease(sockPtr, Reason_ServerReject, 0); } else { Push(sockPtr, waitPtr); *************** *** 2078,2082 **** break; default: ! SockRelease(sockPtr, Reason_SockError); break; } --- 2143,2147 ---- break; default: ! SockRelease(sockPtr, Reason_SockReadError, errno); break; } *************** *** 2183,2194 **** static void ! WriterThread(void *ignored) { ! char c; Ns_Time now; ! int n, stopping, pollto, toread, nread, status; ! WriterSock *sockPtr, *nextPtr, *writePtr; struct pollfd pfds[1]; ! char buf[2048]; Ns_ThreadSetName("-writer-"); --- 2248,2260 ---- static void ! WriterThread(void *arg) { ! WriterQueue *queuePtr = (WriterQueue*)arg; Ns_Time now; ! char c, *bufPtr; ! int n, err, stopping, pollto, toread, maxsize, status; ! WriterSock *curPtr, *nextPtr, *writePtr; struct pollfd pfds[1]; ! struct iovec vbuf; Ns_ThreadSetName("-writer-"); *************** *** 2199,2207 **** */ ! Ns_Log(Notice, "writer: accepting connections"); writePtr = NULL; Ns_GetTime(&now); stopping = 0; ! pfds[0].fd = writerPipe[0]; pfds[0].events = POLLIN; --- 2265,2273 ---- */ ! Ns_Log(Notice, "writer: %d: accepting connections", queuePtr->id); writePtr = NULL; Ns_GetTime(&now); stopping = 0; ! pfds[0].fd = queuePtr->pipe[0]; pfds[0].events = POLLIN; *************** *** 2221,2225 **** Ns_Fatal("driver: poll() failed: %s", ns_sockstrerror(ns_sockerrno)); } ! if ((pfds[0].revents & POLLIN) && recv(writerPipe[0], &c, 1, 0) != 1) { Ns_Fatal("driver: trigger recv() failed: %s", ns_sockstrerror(ns_sockerrno)); } --- 2287,2291 ---- Ns_Fatal("driver: poll() failed: %s", ns_sockstrerror(ns_sockerrno)); } ! if ((pfds[0].revents & POLLIN) && recv(queuePtr->pipe[0], &c, 1, 0) != 1) { Ns_Fatal("driver: trigger recv() failed: %s", ns_sockstrerror(ns_sockerrno)); } *************** *** 2230,2237 **** */ ! sockPtr = writePtr; writePtr = NULL; ! while (sockPtr != NULL) { ! nextPtr = sockPtr->nextPtr; /* --- 2296,2303 ---- */ ! curPtr = writePtr; writePtr = NULL; ! while (curPtr != NULL) { ! nextPtr = curPtr->nextPtr; /* *************** *** 2239,2258 **** */ ! status = NS_OK; ! if (sockPtr->nsend > 0) { ! toread = sockPtr->nsend; ! if (toread > sizeof(buf)) { ! toread = sizeof(buf); ! } ! nread = read(sockPtr->fd, buf, (size_t)toread); ! if (nread == -1) { ! status = NS_ERROR; ! } else if (nread == 0) { ! sockPtr->nsend = 0; /* NB: Silently ignore a truncated file. */ } else { ! n = Ns_SockSend(sockPtr->sockPtr->sock, buf, nread, 0); ! if (n == nread) { ! sockPtr->nsend -= n; } else { status = NS_ERROR; } --- 2305,2360 ---- */ ! n = err = status = NS_OK; ! ! if (curPtr->nsend > 0) { ! ! /* ! * Case when bufsize > 0 means that we have leftover ! * from previous send, fill up the rest of the buffer ! * and retransmit it with new portion from the file ! */ ! ! if (curPtr->bufsize > 0) { ! bufPtr = curPtr->buf + (sizeof(curPtr->buf) - curPtr->bufsize); ! memmove(curPtr->buf, bufPtr, curPtr->bufsize); ! bufPtr = curPtr->buf + curPtr->bufsize; ! maxsize = sizeof(curPtr->buf) - curPtr->bufsize; } else { ! bufPtr = curPtr->buf; ! maxsize = sizeof(curPtr->buf); ! } ! toread = curPtr->nread; ! if (toread > maxsize) { ! toread = maxsize; ! } ! ! /* ! * Read whatever we have left in the file ! */ ! ! if (toread > 0) { ! n = read(curPtr->fd, bufPtr, (size_t)toread); ! if (n <= 0) { ! status = NS_ERROR; ! } else { ! curPtr->nread -= n; ! curPtr->bufsize += n; ! } ! } ! ! /* ! * If actual amount sent is less than requested, keep ! * that data for the next iteration ! */ ! ! if (status == NS_OK) { ! vbuf.iov_base = (void *) curPtr->buf; ! vbuf.iov_len = curPtr->bufsize; ! n = NsSockSend(curPtr->sockPtr, &vbuf, 1); ! if (n > 0) { ! curPtr->nsend -= n; ! curPtr->bufsize -= n; } else { + err = errno; status = NS_ERROR; } *************** *** 2260,2272 **** } if (status != NS_OK) { ! SockWriterRelease(sockPtr, Reason_SockError); } else { ! if (sockPtr->nsend > 0) { ! Push(sockPtr, writePtr); } else { ! SockWriterRelease(sockPtr, 0); } } ! sockPtr = nextPtr; } --- 2362,2374 ---- } if (status != NS_OK) { ! SockWriterRelease(curPtr, Reason_SockWriteError, err); } else { ! if (curPtr->nsend > 0) { ! Push(curPtr, writePtr); } else { ! SockWriterRelease(curPtr, 0, 0); } } ! curPtr = nextPtr; } *************** *** 2275,2286 **** */ ! Ns_MutexLock(&writerLock); ! sockPtr = writerSockPtr; ! writerSockPtr = NULL; ! while (sockPtr != NULL) { ! nextPtr = sockPtr->nextPtr; ! SockTimeout(sockPtr->sockPtr, &now, sockPtr->sockPtr->drvPtr->sendwait); ! Push(sockPtr, writePtr); ! sockPtr = nextPtr; } --- 2377,2388 ---- */ ! Ns_MutexLock(&queuePtr->lock); ! curPtr = queuePtr->sockPtr; ! queuePtr->sockPtr = NULL; ! while (curPtr != NULL) { ! nextPtr = curPtr->nextPtr; ! SockTimeout(curPtr->sockPtr, &now, curPtr->sockPtr->drvPtr->sendwait); ! Push(curPtr, writePtr); ! curPtr = nextPtr; } *************** *** 2289,2307 **** */ ! stopping = writerShutdown; ! Ns_MutexUnlock(&writerLock); } Ns_Log(Notice, "exiting"); ! Ns_MutexLock(&writerLock); ! writerStopped = 1; ! Ns_CondBroadcast(&writerCond); ! Ns_MutexUnlock(&writerLock); } static void ! SockWriterRelease(WriterSock *sockPtr, ReleaseReasons reason) { ! Ns_Log(Notice, "Writer: stop fd=%d", sockPtr->fd); ! SockRelease(sockPtr->sockPtr, reason); close(sockPtr->fd); ns_free(sockPtr); --- 2391,2409 ---- */ ! stopping = queuePtr->shutdown; ! Ns_MutexUnlock(&queuePtr->lock); } Ns_Log(Notice, "exiting"); ! Ns_MutexLock(&queuePtr->lock); ! queuePtr->stopped = 1; ! Ns_CondBroadcast(&queuePtr->cond); ! Ns_MutexUnlock(&queuePtr->lock); } static void ! SockWriterRelease(WriterSock *sockPtr, ReleaseReasons reason, int err) { ! Ns_Log(Notice, "Writer: closed fd=%d, error=%d", sockPtr->fd, err); ! SockRelease(sockPtr->sockPtr, reason, err); close(sockPtr->fd); ns_free(sockPtr); *************** *** 2313,2319 **** Conn *connPtr = (Conn*)conn; WriterSock *sockPtr; int trigger = 0; ! if (writerDisabled || nsend < connPtr->drvPtr->writersize || (conn->flags & NS_CONN_WRITE_CHUNKED)) { --- 2415,2422 ---- Conn *connPtr = (Conn*)conn; WriterSock *sockPtr; + WriterQueue *queuePtr; int trigger = 0; ! if (writerThreads == 0 || nsend < connPtr->drvPtr->writersize || (conn->flags & NS_CONN_WRITE_CHUNKED)) { *************** *** 2337,2363 **** } else if (fp != NULL) { sockPtr->fd = fileno(fp); } sockPtr->fd = ns_sockdup(sockPtr->fd); sockPtr->nsend = nsend; connPtr->sockPtr = NULL; ! // To keep nslog happy about content size sent connPtr->nContentSent = nsend; Ns_SockSetBlocking(sockPtr->sockPtr->sock); ! Ns_Log(Notice, "Writer: start fd=%d: %d bytes: %s", sockPtr->fd, nsend, connPtr->reqPtr->request->url); Ns_MutexLock(&writerLock); ! if (writerSockPtr == NULL) { ! trigger = 1; } ! Push(sockPtr, writerSockPtr); Ns_MutexUnlock(&writerLock); /* * Wake up writer thread */ if (trigger) { ! SockTrigger(writerPipe[1]); } return NS_OK; } --- 2440,2487 ---- } else if (fp != NULL) { sockPtr->fd = fileno(fp); + } else { + sockPtr->fd = fd; } sockPtr->fd = ns_sockdup(sockPtr->fd); sockPtr->nsend = nsend; + sockPtr->nread = nsend; connPtr->sockPtr = NULL; ! // To keep nslog happy about content size returned connPtr->nContentSent = nsend; Ns_SockSetBlocking(sockPtr->sockPtr->sock); ! ! /* ! * Get the next writer thread from the list, all writer requests are ! * rotated between all writer threads ! */ Ns_MutexLock(&writerLock); ! if (curQueuePtr == NULL) { ! curQueuePtr = firstQueuePtr; } ! queuePtr = curQueuePtr; ! curQueuePtr = curQueuePtr->nextPtr; Ns_MutexUnlock(&writerLock); /* + * Now add new writer socket to the writer thread's queue + */ + + Ns_MutexLock(&queuePtr->lock); + if (queuePtr->sockPtr == NULL) { + trigger = 1; + } + Push(sockPtr, queuePtr->sockPtr); + Ns_MutexUnlock(&queuePtr->lock); + + /* * Wake up writer thread */ if (trigger) { ! SockTrigger(queuePtr->pipe[1]); } + + Ns_Log(Notice, "Writer: %d: started fd=%d: %d bytes: %s", queuePtr->id, sockPtr->fd, nsend, connPtr->reqPtr->request->url); return NS_OK; } Index: connio.c =================================================================== RCS file: /cvsroot/naviserver/naviserver/nsd/connio.c,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -d -r1.10 -r1.11 *** connio.c 16 Jan 2006 04:29:57 -0000 1.10 --- connio.c 17 Jan 2006 23:21:06 -0000 1.11 *************** *** 115,123 **** connPtr->sockPtr = NULL; connPtr->flags |= NS_CONN_CLOSED; - if (connPtr->itPtr != NULL) { - NsTclRunAtClose(connPtr->itPtr); - } } return NS_OK; } --- 115,123 ---- connPtr->sockPtr = NULL; connPtr->flags |= NS_CONN_CLOSED; } + if (connPtr->itPtr != NULL) { + NsTclRunAtClose(connPtr->itPtr); + } return NS_OK; } |
From: Vlad S. <ser...@us...> - 2006-01-17 23:21:14
|
Update of /cvsroot/naviserver/naviserver In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv9809 Modified Files: ChangeLog Log Message: Writer support improved Index: ChangeLog =================================================================== RCS file: /cvsroot/naviserver/naviserver/ChangeLog,v retrieving revision 1.275 retrieving revision 1.276 diff -C2 -d -r1.275 -r1.276 *** ChangeLog 16 Jan 2006 08:12:54 -0000 1.275 --- ChangeLog 17 Jan 2006 23:21:06 -0000 1.276 *************** *** 1,2 **** --- 1,7 ---- + 2006-01-17 Vlad Seryakov <ser...@us...> + + * nsd/driver.c: Improved Writer thread support, now it is + possible to have multiple writer thread for better performance. + 2006-01-16 Bernd Eidenschink <ei...@us...> |
From: Vlad S. <ser...@us...> - 2006-01-17 23:21:14
|
Update of /cvsroot/naviserver/modules/nsdns In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv9809/modules/nsdns Modified Files: nsdns.c Log Message: Writer support improved Index: nsdns.c =================================================================== RCS file: /cvsroot/naviserver/modules/nsdns/nsdns.c,v retrieving revision 1.19 retrieving revision 1.20 diff -C2 -d -r1.19 -r1.20 *** nsdns.c 3 Nov 2005 14:46:01 -0000 1.19 --- nsdns.c 17 Jan 2006 23:21:06 -0000 1.20 *************** *** 553,557 **** while(1) { if ((buf.size = recvfrom(dnsUdpSock,buf.buffer,DNS_BUF_SIZE-1,0,(struct sockaddr*)&buf.addr,&len)) <= 0) { ! Ns_Log(Error,"nsdns: recvfrom error: %s",strerror(errno)); continue; } --- 553,559 ---- while(1) { if ((buf.size = recvfrom(dnsUdpSock,buf.buffer,DNS_BUF_SIZE-1,0,(struct sockaddr*)&buf.addr,&len)) <= 0) { ! if(dnsDebug > 1) { ! Ns_Log(Error,"nsdns: recvfrom error: %s",strerror(errno)); ! } continue; } |
From: Vlad S. <ser...@us...> - 2006-01-16 19:30:57
|
Update of /cvsroot/naviserver/modules/nsffmpeg In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv17984 Modified Files: nsffmpeg.c Log Message: connection streaming fixes Index: nsffmpeg.c =================================================================== RCS file: /cvsroot/naviserver/modules/nsffmpeg/nsffmpeg.c,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** nsffmpeg.c 16 Jan 2006 16:13:40 -0000 1.2 --- nsffmpeg.c 16 Jan 2006 19:30:49 -0000 1.3 *************** *** 425,430 **** }; - static int conn_timeout = 5; - NS_EXPORT int Ns_ModuleVersion = 1; --- 425,428 ---- *************** *** 554,560 **** #ifndef TCL_STANDALONE static int conn_open(URLContext *h, const char *filename, int flags) { ! h->priv_data = (void *)Ns_ConnSock(Ns_GetConn()); return 0; } --- 552,559 ---- #ifndef TCL_STANDALONE + static int conn_open(URLContext *h, const char *filename, int flags) { ! h->priv_data = (void*)Ns_GetConn(); return 0; } *************** *** 562,579 **** static int conn_read(URLContext *h, unsigned char *buf, int size) { ! int fd = (size_t)h->priv_data; ! return Ns_SockRecv(fd, buf, size, conn_timeout); } static int conn_write(URLContext *h, unsigned char *buf, int size) { ! int fd = (size_t)h->priv_data; ! return Ns_SockSend(fd, buf, size, conn_timeout); } ! static int conn_close(URLContext *h) { - int fd = (size_t)h->priv_data; - close(fd); return 0; } --- 561,575 ---- static int conn_read(URLContext *h, unsigned char *buf, int size) { ! return -1; } static int conn_write(URLContext *h, unsigned char *buf, int size) { ! Ns_Conn *conn = (Ns_Conn*)h->priv_data; ! return Ns_ConnWrite(conn, buf, size); } ! static int conn_close(URLContext *h) { return 0; } |
From: Vlad S. <ser...@us...> - 2006-01-16 16:13:48
|
Update of /cvsroot/naviserver/modules/nsffmpeg In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv31697 Modified Files: nsffmpeg.c Log Message: acodec fixed Index: nsffmpeg.c =================================================================== RCS file: /cvsroot/naviserver/modules/nsffmpeg/nsffmpeg.c,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -C2 -d -r1.1.1.1 -r1.2 *** nsffmpeg.c 16 Jan 2006 03:44:30 -0000 1.1.1.1 --- nsffmpeg.c 16 Jan 2006 16:13:40 -0000 1.2 *************** *** 3804,3808 **** // force audio codec ('copy' to copy stream), codec if (!strcmp(key, "-acodec")) { ! if (av_set_codec(avt, CODEC_TYPE_AUDIO, "mp2") != NS_OK) { return NS_ERROR; } --- 3804,3808 ---- // force audio codec ('copy' to copy stream), codec if (!strcmp(key, "-acodec")) { ! if (av_set_codec(avt, CODEC_TYPE_AUDIO, arg) != NS_OK) { return NS_ERROR; } |
From: Bernd E. <ei...@us...> - 2006-01-16 08:13:12
|
Update of /cvsroot/naviserver/naviserver/nsd In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv28819/nsd Modified Files: uuencode.c Log Message: See Changelog Index: uuencode.c =================================================================== RCS file: /cvsroot/naviserver/naviserver/nsd/uuencode.c,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** uuencode.c 20 Oct 2005 15:03:50 -0000 1.5 --- uuencode.c 16 Jan 2006 08:12:54 -0000 1.6 *************** *** 113,130 **** q = (unsigned char *) output; for (n = len / 3; n > 0; --n) { - *q++ = ENC(p[0] >> 2); - *q++ = ENC(((p[0] << 4) & 060) | ((p[1] >> 4) & 017)); - *q++ = ENC(((p[1] << 2) & 074) | ((p[2] >> 6) & 03)); - *q++ = ENC(p[2] & 077); - p += 3; - line += 4; /* * Add wrapping newline to be compatible with GNU uuencode */ ! ! if (line == 60) { *q++ = '\n'; line = 0; } } --- 113,131 ---- q = (unsigned char *) output; for (n = len / 3; n > 0; --n) { /* * Add wrapping newline to be compatible with GNU uuencode + * if line length exceeds max line length - without adding + * extra newline character */ ! if (line >= 60) { *q++ = '\n'; line = 0; } + *q++ = ENC(p[0] >> 2); + *q++ = ENC(((p[0] << 4) & 060) | ((p[1] >> 4) & 017)); + *q++ = ENC(((p[1] << 2) & 074) | ((p[2] >> 6) & 03)); + *q++ = ENC(p[2] & 077); + p += 3; + line += 4; } |
From: Bernd E. <ei...@us...> - 2006-01-16 08:13:06
|
Update of /cvsroot/naviserver/naviserver In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv28819 Modified Files: ChangeLog Log Message: See Changelog Index: ChangeLog =================================================================== RCS file: /cvsroot/naviserver/naviserver/ChangeLog,v retrieving revision 1.274 retrieving revision 1.275 diff -C2 -d -r1.274 -r1.275 *** ChangeLog 16 Jan 2006 04:29:56 -0000 1.274 --- ChangeLog 16 Jan 2006 08:12:54 -0000 1.275 *************** *** 1,2 **** --- 1,9 ---- + 2006-01-16 Bernd Eidenschink <ei...@us...> + + * tests/ns_base64encode.test: Basic tests for ns_base64encode + and ns_base64decode + * nsd/uuencode.c: Fixed appending of extra newline in certain + line break situations. Fixes Bug #1407112. + 2006-01-15 Vlad Seryakov <ser...@us...> |
From: Bernd E. <ei...@us...> - 2006-01-16 08:13:06
|
Update of /cvsroot/naviserver/naviserver/tests In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv28819/tests Added Files: ns_base64encode.test Log Message: See Changelog --- NEW FILE: ns_base64encode.test --- # # $Id: ns_base64encode.test,v 1.1 2006/01/16 08:12:54 eide Exp $ # if {[lsearch [namespace children] ::tcltest] == -1} { package require tcltest 2.2 namespace import -force ::tcltest::* } eval configure $argv test ns_base64encoding-1.1 {ns_base64encode basic functionality} -body { ns_base64encode "this is a test\n" } -result "dGhpcyBpcyBhIHRlc3QK" test ns_base64encoding-1.2 {ns_base64encode wraps lines at 60 characters} -body { set str "The short red fox ran quickly through the green field " append str "and jumped over the tall brown bear\n" ns_base64encode $str } -result "VGhlIHNob3J0IHJlZCBmb3ggcmFuIHF1aWNrbHkgdGhyb3VnaCB0aGUgZ3Jl ZW4gZmllbGQgYW5kIGp1bXBlZCBvdmVyIHRoZSB0YWxsIGJyb3duIGJlYXIK" test ns_base64encoding-1.6 {ns_base64encode call w/out args, error} -body { list [catch {ns_base64encode} msg] $msg } -result [list 1 "wrong # args: should be \"ns_base64encode string\""] test ns_base64encoding-2.1 {ns_base64decode basic functionality} -body { ns_base64decode "dGhpcyBpcyBhIHRlc3QK" } -result "this is a test\n" test ns_base64encoding-2.2 {ns_base64decode ignores newlines} -body { set str "VGhlIHNob3J0IHJlZCBmb3ggcmFuIHF1aWNrbHkgdGhyb3VnaCB0aGUgZ3Jl\n" append str "ZW4gZmllbGQgYW5kIGp1bXBlZCBvdmVyIHRoZSB0YWxsIGJyb3duIGJlYXIK" ns_base64decode $str } -result "The short red fox ran quickly through the green field and jumped over the tall brown bear\n" test ns_base64encoding-2.3 {ns_base64decode handles equal sign padding} -body { # decode the encoding of a string that will be padded in the encoding with # one padding char ns_base64decode [ns_base64encode "01234"] } -result "01234" test ns_base64encoding-2.4 {ns_base64decode handles equal sign padding} -body { # decode the encoding of a string that will be padded in the encoding with # two padding chars ns_base64decode [ns_base64encode "0123"] } -result "0123" test ns_base64encoding-2.5 {ns_base64decode empty string} -body { ns_base64decode "" } -result "" test ns_base64encoding-2.6 {ns_base64decode space} -body { ns_base64decode " " } -result "" test ns_base64encoding-3.1 {ns_base64decode identity test} -body { ns_base64decode [ns_base64encode "this is a test"] } -result "this is a test" test ns_base64encoding-4.1 {ns_base64encode embedded nulls} -body { ns_base64encode "test\0test\0testpass" } -result "dGVzdAB0ZXN0AHRlc3RwYXNz" test ns_base64encoding-4.2 {ns_base64encode embedded nulls with range} -body { set l [list] for { set i -1 } { $i < 33 } { incr i +1 } { lappend l [ns_base64encode "$i\0$i\0"] } set l } -result [list "LTEALTEA" "MAAwAA==" "MQAxAA==" "MgAyAA==" "MwAzAA==" "NAA0AA==" "NQA1AA==" "NgA2AA==" "NwA3AA==" "OAA4AA==" "OQA5AA==" "MTAAMTAA" "MTEAMTEA" "MTIAMTIA" "MTMAMTMA" "MTQAMTQA" "MTUAMTUA" "MTYAMTYA" "MTcAMTcA" "MTgAMTgA" "MTkAMTkA" "MjAAMjAA" "MjEAMjEA" "MjIAMjIA" "MjMAMjMA" "MjQAMjQA" "MjUAMjUA" "MjYAMjYA" "MjcAMjcA" "MjgAMjgA" "MjkAMjkA" "MzAAMzAA" "MzEAMzEA" "MzIAMzIA"] test ns_base64encoding-5.1 {ns_base64encode mass encoding} -body { string length [ns_base64encode [string repeat "x\0\n" 100000]] } -result 406666 test ns_base64encoding-5.2 {ns_base64encode identity mass encoding} -body { string length [ns_base64decode [ns_base64encode [string repeat "x\0\n" 100000]]] } -result 300000 cleanupTests |
From: Vlad S. <ser...@us...> - 2006-01-16 04:30:06
|
Update of /cvsroot/naviserver/naviserver/nsd In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv25346/nsd Modified Files: connio.c driver.c nsd.h Log Message: See ChangeLog, this is experimental feature Index: driver.c =================================================================== RCS file: /cvsroot/naviserver/naviserver/nsd/driver.c,v retrieving revision 1.31 retrieving revision 1.32 diff -C2 -d -r1.31 -r1.32 *** driver.c 14 Jan 2006 18:45:21 -0000 1.31 --- driver.c 16 Jan 2006 04:29:57 -0000 1.32 *************** *** 54,59 **** --- 54,61 ---- typedef enum { + Reason_Close, Reason_CloseTimeout, Reason_ReadTimeout, + Reason_WriteTimeout, Reason_ServerReject, Reason_SockError, *************** *** 83,86 **** --- 85,100 ---- /* + * The following maintains files to be written to the clients + */ + + typedef struct WriterSock { + struct WriterSock *nextPtr; + Sock *sockPtr; + int fd; + int nsend; + int flags; + } WriterSock; + + /* * Static functions defined in this file. */ *************** *** 88,96 **** static Ns_ThreadProc DriverThread; static Ns_ThreadProc SpoolThread; static int SetServer(Sock *sockPtr); static Sock *SockAccept(Driver *drvPtr); static void SockRelease(Sock *sockPtr, ReleaseReasons reason); static void SockTrigger(SOCKET sock); ! static void SockPoll(Sock *sockPtr, struct pollfd **pfds, unsigned int *nfds, unsigned int *maxfds, Ns_Time *timeoutPtr); static void SockTimeout(Sock *sockPtr, Ns_Time *nowPtr, int timeout); --- 102,111 ---- static Ns_ThreadProc DriverThread; static Ns_ThreadProc SpoolThread; + static Ns_ThreadProc WriterThread; static int SetServer(Sock *sockPtr); static Sock *SockAccept(Driver *drvPtr); static void SockRelease(Sock *sockPtr, ReleaseReasons reason); static void SockTrigger(SOCKET sock); ! static void SockPoll(Sock *sockPtr, int type, struct pollfd **pfds, unsigned int *nfds, unsigned int *maxfds, Ns_Time *timeoutPtr); static void SockTimeout(Sock *sockPtr, Ns_Time *nowPtr, int timeout); *************** *** 99,104 **** static int SockParse(Sock *sockPtr, int spooler); ! static int SockSpoolPush(Sock *sockPtr); ! static Sock *SockSpoolPop(void); /* --- 114,121 ---- static int SockParse(Sock *sockPtr, int spooler); ! static int SockSpoolerPush(Sock *sockPtr); ! static Sock *SockSpoolerPop(void); ! ! static void SockWriterRelease(WriterSock *sockPtr, ReleaseReasons reason); /* *************** *** 133,136 **** --- 150,162 ---- static Sock *spoolerSockPtr = NULL; /* List of spooled Sock structures. */ + static SOCKET writerPipe[2]; /* Trigger to wakeup SpoolThread. */ + static Ns_Mutex writerLock; /* Lock around spooled list. */ + static Ns_Cond writerCond; /* Cond for stopped flag. */ + static Ns_Thread writerThread; /* Running SpoolThread. */ + static int writerStopped = 0; /* Flag to indicate writer thread stopped. */ + static int writerShutdown = 0; /* Flag to indicate shutdown. */ + static int writerDisabled = 1; /* Flag to enable/disable the upload writer. */ + static WriterSock *writerSockPtr = NULL; /* List of spooled Sock structures. */ + #define Push(x, xs) ((x)->nextPtr = (xs), (xs) = (x)) *************** *** 302,305 **** --- 328,332 ---- drvPtr->bufsize, drvPtr->maxinput); drvPtr->uploadsize = Ns_ConfigIntRange(path, "uploadsize", 2048, 1024, INT_MAX); + drvPtr->writersize = Ns_ConfigIntRange(path, "writer", 1024*1024, 1024*1024*10, INT_MAX); drvPtr->sndbuf = Ns_ConfigIntRange(path, "sndbuf", 0, 0, INT_MAX); drvPtr->rcvbuf = Ns_ConfigIntRange(path, "rcvbuf", 0, 0, INT_MAX); *************** *** 413,416 **** --- 440,447 ---- } + if (Ns_ConfigBool(path, "writer", NS_FALSE)) { + writerDisabled = 0; + } + return NS_OK; } *************** *** 489,492 **** --- 520,535 ---- Ns_ThreadCreate(SpoolThread, NULL, 0, &spoolerThread); } + + /* + * Create the writer thread. + */ + + if (writerDisabled == 0) { + if (ns_sockpair(writerPipe) != 0) { + Ns_Fatal("driver: ns_sockpair() failed: %s", + ns_sockstrerror(ns_sockerrno)); + } + Ns_ThreadCreate(WriterThread, NULL, 0, &writerThread); + } } *************** *** 834,838 **** if (readPtr == NULL && closePtr == NULL) { ! pollto = -1; } else { timeout.sec = INT_MAX; --- 877,881 ---- if (readPtr == NULL && closePtr == NULL) { ! pollto = 60 * 1000; } else { timeout.sec = INT_MAX; *************** *** 840,849 **** sockPtr = readPtr; while (sockPtr != NULL) { ! SockPoll(sockPtr, &pfds, &nfds, &maxfds, &timeout); sockPtr = sockPtr->nextPtr; } sockPtr = closePtr; while (sockPtr != NULL) { ! SockPoll(sockPtr, &pfds, &nfds, &maxfds, &timeout); sockPtr = sockPtr->nextPtr; } --- 883,892 ---- sockPtr = readPtr; while (sockPtr != NULL) { ! SockPoll(sockPtr, POLLIN, &pfds, &nfds, &maxfds, &timeout); sockPtr = sockPtr->nextPtr; } sockPtr = closePtr; while (sockPtr != NULL) { ! SockPoll(sockPtr, POLLIN, &pfds, &nfds, &maxfds, &timeout); sockPtr = sockPtr->nextPtr; } *************** *** 931,937 **** switch (n) { case SOCK_SPOOL: ! if (!SockSpoolPush(sockPtr)) { ! sockPtr->nextPtr = readPtr; ! readPtr = sockPtr; } break; --- 974,979 ---- switch (n) { case SOCK_SPOOL: ! if (!SockSpoolerPush(sockPtr)) { ! Push(sockPtr, readPtr); } break; *************** *** 965,970 **** while ((nextPtr = waitPtr) != NULL) { waitPtr = nextPtr->nextPtr; ! nextPtr->nextPtr = sockPtr; ! sockPtr = nextPtr; } --- 1007,1011 ---- while ((nextPtr = waitPtr) != NULL) { waitPtr = nextPtr->nextPtr; ! Push(nextPtr, sockPtr); } *************** *** 1190,1194 **** static void ! SockPoll(Sock *sockPtr, struct pollfd **pfds, unsigned int *nfds, unsigned int *maxfds, Ns_Time *timeoutPtr) { /* --- 1231,1235 ---- static void ! SockPoll(Sock *sockPtr, int type, struct pollfd **pfds, unsigned int *nfds, unsigned int *maxfds, Ns_Time *timeoutPtr) { /* *************** *** 1206,1210 **** (*pfds)[*nfds].fd = sockPtr->sock; ! (*pfds)[*nfds].events = POLLIN; (*pfds)[*nfds].revents = 0; sockPtr->pidx = (*nfds)++; --- 1247,1251 ---- (*pfds)[*nfds].fd = sockPtr->sock; ! (*pfds)[*nfds].events = type; (*pfds)[*nfds].revents = 0; sockPtr->pidx = (*nfds)++; *************** *** 1341,1348 **** --- 1382,1391 ---- switch (reason) { + case Reason_Close: case Reason_CloseTimeout: /* This is normal, never log. */ break; case Reason_ReadTimeout: + case Reason_WriteTimeout: /* * For this case, whether this is acceptable or not *************** *** 1901,1905 **** *---------------------------------------------------------------------- * ! * SpoolThread -- * * Spooling socket driver thread. --- 1944,1948 ---- *---------------------------------------------------------------------- * ! * SpoolerThread -- * * Spooling socket driver thread. *************** *** 1920,1926 **** SpoolThread(void *ignored) { ! char c; ! int n, stopping, pollto; ! Sock *sockPtr, *nextPtr, *waitPtr, *readPtr; Ns_Time timeout, now, diff; unsigned int nfds, maxfds; --- 1963,1969 ---- SpoolThread(void *ignored) { ! char c; ! int n, stopping, pollto; ! Sock *sockPtr, *nextPtr, *waitPtr, *readPtr; Ns_Time timeout, now, diff; unsigned int nfds, maxfds; *************** *** 1958,1962 **** if (readPtr == NULL) { ! pollto = -1; } else { timeout.sec = INT_MAX; --- 2001,2005 ---- if (readPtr == NULL) { ! pollto = 60 * 1000; } else { timeout.sec = INT_MAX; *************** *** 1964,1968 **** sockPtr = readPtr; while (sockPtr != NULL) { ! SockPoll(sockPtr, &pfds, &nfds, &maxfds, &timeout); sockPtr = sockPtr->nextPtr; } --- 2007,2011 ---- sockPtr = readPtr; while (sockPtr != NULL) { ! SockPoll(sockPtr, POLLIN, &pfds, &nfds, &maxfds, &timeout); sockPtr = sockPtr->nextPtr; } *************** *** 2067,2071 **** */ ! if (waitPtr == NULL && ((sockPtr = SockSpoolPop()))) { SockTimeout(sockPtr, &now, sockPtr->drvPtr->recvwait); Push(sockPtr, readPtr); --- 2110,2114 ---- */ ! if (waitPtr == NULL && ((sockPtr = SockSpoolerPop()))) { SockTimeout(sockPtr, &now, sockPtr->drvPtr->recvwait); Push(sockPtr, readPtr); *************** *** 2088,2092 **** static int ! SockSpoolPush(Sock *sockPtr) { int trigger = 0; --- 2131,2135 ---- static int ! SockSpoolerPush(Sock *sockPtr) { int trigger = 0; *************** *** 2109,2113 **** } ! Sock *SockSpoolPop(void) { Sock *sockPtr = 0; --- 2152,2156 ---- } ! Sock *SockSpoolerPop(void) { Sock *sockPtr = 0; *************** *** 2121,2122 **** --- 2164,2363 ---- return sockPtr; } + + /* + *---------------------------------------------------------------------- + * + * WriterThread -- + * + * Thread that writes files to clients + * + * Results: + * None. + * + * Side effects: + * Connections are accepted and their SockPtr is set to NULL + * so closing actual connection does not close the socket + * + *---------------------------------------------------------------------- + */ + + static void + WriterThread(void *ignored) + { + char c; + Ns_Time now; + int n, stopping, pollto, toread, nread, status; + WriterSock *sockPtr, *nextPtr, *writePtr; + struct pollfd pfds[1]; + char buf[2048]; + + Ns_ThreadSetName("-writer-"); + + /* + * Loop forever until signalled to shutdown and all + * connections are complete and gracefully closed. + */ + + Ns_Log(Notice, "writer: accepting connections"); + writePtr = NULL; + Ns_GetTime(&now); + stopping = 0; + pfds[0].fd = writerPipe[0]; + pfds[0].events = POLLIN; + + while (!stopping || nactive) { + + /* + * Select and drain the trigger pipe if necessary. + */ + + if (writePtr == NULL) { + pfds[0].revents = 0; + pollto = 30 * 1000; // Wake up every 30 seconds just in case + do { + n = poll(pfds, 1, pollto); + } while (n < 0 && errno == EINTR); + if (n < 0) { + Ns_Fatal("driver: poll() failed: %s", ns_sockstrerror(ns_sockerrno)); + } + if ((pfds[0].revents & POLLIN) && recv(writerPipe[0], &c, 1, 0) != 1) { + Ns_Fatal("driver: trigger recv() failed: %s", ns_sockstrerror(ns_sockerrno)); + } + } + + /* + * Attempt write to all available sockets + */ + + sockPtr = writePtr; + writePtr = NULL; + while (sockPtr != NULL) { + nextPtr = sockPtr->nextPtr; + + /* + * Read block from the file and send it to the socket + */ + + status = NS_OK; + if (sockPtr->nsend > 0) { + toread = sockPtr->nsend; + if (toread > sizeof(buf)) { + toread = sizeof(buf); + } + nread = read(sockPtr->fd, buf, (size_t)toread); + if (nread == -1) { + status = NS_ERROR; + } else if (nread == 0) { + sockPtr->nsend = 0; /* NB: Silently ignore a truncated file. */ + } else { + n = Ns_SockSend(sockPtr->sockPtr->sock, buf, nread, 0); + if (n == nread) { + sockPtr->nsend -= n; + } else { + status = NS_ERROR; + } + } + } + if (status != NS_OK) { + SockWriterRelease(sockPtr, Reason_SockError); + } else { + if (sockPtr->nsend > 0) { + Push(sockPtr, writePtr); + } else { + SockWriterRelease(sockPtr, 0); + } + } + sockPtr = nextPtr; + } + + /* + * Add more sockets to the writer queue + */ + + Ns_MutexLock(&writerLock); + sockPtr = writerSockPtr; + writerSockPtr = NULL; + while (sockPtr != NULL) { + nextPtr = sockPtr->nextPtr; + SockTimeout(sockPtr->sockPtr, &now, sockPtr->sockPtr->drvPtr->sendwait); + Push(sockPtr, writePtr); + sockPtr = nextPtr; + } + + /* + * Check for shutdown + */ + + stopping = writerShutdown; + Ns_MutexUnlock(&writerLock); + } + Ns_Log(Notice, "exiting"); + Ns_MutexLock(&writerLock); + writerStopped = 1; + Ns_CondBroadcast(&writerCond); + Ns_MutexUnlock(&writerLock); + } + + static void + SockWriterRelease(WriterSock *sockPtr, ReleaseReasons reason) + { + Ns_Log(Notice, "Writer: stop fd=%d", sockPtr->fd); + SockRelease(sockPtr->sockPtr, reason); + close(sockPtr->fd); + ns_free(sockPtr); + } + + int + NsQueueWriter(Ns_Conn *conn, int nsend, Tcl_Channel chan, FILE *fp, int fd) + { + Conn *connPtr = (Conn*)conn; + WriterSock *sockPtr; + int trigger = 0; + + if (writerDisabled || + nsend < connPtr->drvPtr->writersize || + (conn->flags & NS_CONN_WRITE_CHUNKED)) { + return NS_ERROR; + } + + /* + * Flush the headers + */ + + Ns_WriteConn(conn, NULL, 0); + + sockPtr = (WriterSock*)ns_calloc(1, sizeof(WriterSock)); + sockPtr->sockPtr = connPtr->sockPtr; + sockPtr->flags = connPtr->flags; + if (chan != NULL) { + if (Tcl_GetChannelHandle(chan, TCL_READABLE, (ClientData)&sockPtr->fd) != TCL_OK) { + ns_free(sockPtr); + return NS_ERROR; + } + } else if (fp != NULL) { + sockPtr->fd = fileno(fp); + } + sockPtr->fd = ns_sockdup(sockPtr->fd); + sockPtr->nsend = nsend; + connPtr->sockPtr = NULL; + // To keep nslog happy about content size sent + connPtr->nContentSent = nsend; + Ns_SockSetBlocking(sockPtr->sockPtr->sock); + Ns_Log(Notice, "Writer: start fd=%d: %d bytes: %s", sockPtr->fd, nsend, connPtr->reqPtr->request->url); + + Ns_MutexLock(&writerLock); + if (writerSockPtr == NULL) { + trigger = 1; + } + Push(sockPtr, writerSockPtr); + Ns_MutexUnlock(&writerLock); + + /* + * Wake up writer thread + */ + + if (trigger) { + SockTrigger(writerPipe[1]); + } + return NS_OK; + } Index: nsd.h =================================================================== RCS file: /cvsroot/naviserver/naviserver/nsd/nsd.h,v retrieving revision 1.44 retrieving revision 1.45 diff -C2 -d -r1.44 -r1.45 *** nsd.h 12 Jan 2006 01:17:57 -0000 1.44 --- nsd.h 16 Jan 2006 04:29:57 -0000 1.45 *************** *** 362,365 **** --- 362,366 ---- int readahead; /* Maximum request size in memory. */ int uploadsize; /* Minimum upload size for statistics tracking. */ + int writersize; /* Maximum content size when to use writer thread. */ unsigned int loggingFlags; /* Logging control flags */ *************** *** 863,866 **** --- 864,869 ---- extern void NsFreeRequest(Request *reqPtr); + extern int NsQueueWriter(Ns_Conn *conn, int nsend, Tcl_Channel chan, FILE *fp, int fd); + extern NsServer *NsGetServer(CONST char *server); extern NsServer *NsGetInitServer(void); *************** *** 949,953 **** extern void NsStartTaskQueueShutdown(void); extern void NsWaitTaskQueueShutdown(Ns_Time *toPtr); - extern void NsStartJobsShutdown(void); extern void NsWaitJobsShutdown(Ns_Time *toPtr); --- 952,955 ---- Index: connio.c =================================================================== RCS file: /cvsroot/naviserver/naviserver/nsd/connio.c,v retrieving revision 1.9 retrieving revision 1.10 diff -C2 -d -r1.9 -r1.10 *** connio.c 2 Oct 2005 22:23:09 -0000 1.9 --- connio.c 16 Jan 2006 04:29:57 -0000 1.10 *************** *** 846,850 **** Ns_WriteConn(conn, NULL, 0); } ! status = NS_OK; while (status == NS_OK && nsend > 0) { --- 846,858 ---- Ns_WriteConn(conn, NULL, 0); } ! ! /* ! * Check for submision into writer queue ! */ ! ! if (NsQueueWriter(conn, nsend, chan, fp, fd) == NS_OK) { ! return NS_OK; ! } ! status = NS_OK; while (status == NS_OK && nsend > 0) { |
From: Vlad S. <ser...@us...> - 2006-01-16 04:30:05
|
Update of /cvsroot/naviserver/naviserver In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv25346 Modified Files: ChangeLog Log Message: See ChangeLog, this is experimental feature Index: ChangeLog =================================================================== RCS file: /cvsroot/naviserver/naviserver/ChangeLog,v retrieving revision 1.273 retrieving revision 1.274 diff -C2 -d -r1.273 -r1.274 *** ChangeLog 14 Jan 2006 18:40:06 -0000 1.273 --- ChangeLog 16 Jan 2006 04:29:56 -0000 1.274 *************** *** 1,2 **** --- 1,17 ---- + 2006-01-15 Vlad Seryakov <ser...@us...> + + * nsd/driver.c: + * nsd/connio.c: + * nsd.nsd.h: This is experimental feature to use separate writer + thread for sending large files to multiple clients. By default it + is disabled so nobody should be affected by this feature. Still need + more testing but can be very usefull, keeping it in CVS makes it easier + to track then in local copy, i keep loosing local modifications + all the time. + + * nsd/driver.c: Changes poolto from -1 to 60 seconds in DriverThread and + SpolerThread to wake up from pool. Once a minute will not kill the server + but will ensure it will never get into race condition. + 2006-01-14 Zoran Vasiljevic <vas...@us...> |
From: Zoran V. <vas...@us...> - 2006-01-14 18:45:29
|
Update of /cvsroot/naviserver/naviserver/nsd In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv4469/nsd Modified Files: driver.c Log Message: Made all places related to spooler shutdown conditional on spoolerDisabled Index: driver.c =================================================================== RCS file: /cvsroot/naviserver/naviserver/nsd/driver.c,v retrieving revision 1.30 retrieving revision 1.31 diff -C2 -d -r1.30 -r1.31 *** driver.c 14 Jan 2006 18:40:07 -0000 1.30 --- driver.c 14 Jan 2006 18:45:21 -0000 1.31 *************** *** 520,530 **** Ns_MutexUnlock(&drvLock); ! Ns_MutexLock(&spoolerLock); ! if (!spoolerDisabled && !spoolerStopped && !spoolerShutdown) { ! Ns_Log(Notice, "spooler: triggering shutdown"); ! spoolerShutdown = 1; ! SockTrigger(spoolerPipe[1]); } - Ns_MutexUnlock(&spoolerLock); } --- 520,532 ---- Ns_MutexUnlock(&drvLock); ! if (!spoolerDisabled) { ! Ns_MutexLock(&spoolerLock); ! if (!spoolerStopped && !spoolerShutdown) { ! Ns_Log(Notice, "spooler: triggering shutdown"); ! spoolerShutdown = 1; ! SockTrigger(spoolerPipe[1]); ! } ! Ns_MutexUnlock(&spoolerLock); } } *************** *** 573,595 **** } ! Ns_MutexLock(&spoolerLock); ! while (!spoolerStopped && status == NS_OK) { ! status = Ns_CondTimedWait(&spoolerCond, &spoolerLock, toPtr); ! } ! Ns_MutexUnlock(&spoolerLock); ! if (status != NS_OK) { ! Ns_Log(Warning, "spooler: timeout waiting for shutdown"); ! } else { ! Ns_Log(Notice, "spooler: shutdown complete"); ! spoolerThread = NULL; ! ns_sockclose(spoolerPipe[0]); ! ns_sockclose(spoolerPipe[1]); ! Ns_MutexLock(&uploadLock); ! hPtr = Tcl_FirstHashEntry(&uploadTable, &search); ! while (hPtr != NULL) { ! Tcl_DeleteHashEntry(hPtr); ! hPtr = Tcl_NextHashEntry(&search); } - Ns_MutexUnlock(&uploadLock); } } --- 575,599 ---- } ! if (!spoolerDisabled) { ! Ns_MutexLock(&spoolerLock); ! while (!spoolerStopped && status == NS_OK) { ! status = Ns_CondTimedWait(&spoolerCond, &spoolerLock, toPtr); ! } ! Ns_MutexUnlock(&spoolerLock); ! if (status != NS_OK) { ! Ns_Log(Warning, "spooler: timeout waiting for shutdown"); ! } else { ! Ns_Log(Notice, "spooler: shutdown complete"); ! spoolerThread = NULL; ! ns_sockclose(spoolerPipe[0]); ! ns_sockclose(spoolerPipe[1]); ! Ns_MutexLock(&uploadLock); ! hPtr = Tcl_FirstHashEntry(&uploadTable, &search); ! while (hPtr != NULL) { ! Tcl_DeleteHashEntry(hPtr); ! hPtr = Tcl_NextHashEntry(&search); ! } ! Ns_MutexUnlock(&uploadLock); } } } |
From: Zoran V. <vas...@us...> - 2006-01-14 18:40:15
|
Update of /cvsroot/naviserver/naviserver/nsd In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv3150/nsd Modified Files: driver.c Log Message: Do not trigger spooler pipe on NsStopDrivers if spooler thread disabled. Index: driver.c =================================================================== RCS file: /cvsroot/naviserver/naviserver/nsd/driver.c,v retrieving revision 1.29 retrieving revision 1.30 diff -C2 -d -r1.29 -r1.30 *** driver.c 12 Jan 2006 01:17:57 -0000 1.29 --- driver.c 14 Jan 2006 18:40:07 -0000 1.30 *************** *** 521,525 **** Ns_MutexLock(&spoolerLock); ! if (!spoolerStopped && !spoolerShutdown) { Ns_Log(Notice, "spooler: triggering shutdown"); spoolerShutdown = 1; --- 521,525 ---- Ns_MutexLock(&spoolerLock); ! if (!spoolerDisabled && !spoolerStopped && !spoolerShutdown) { Ns_Log(Notice, "spooler: triggering shutdown"); spoolerShutdown = 1; |
From: Zoran V. <vas...@us...> - 2006-01-14 18:40:15
|
Update of /cvsroot/naviserver/naviserver In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv3150 Modified Files: ChangeLog Log Message: Do not trigger spooler pipe on NsStopDrivers if spooler thread disabled. Index: ChangeLog =================================================================== RCS file: /cvsroot/naviserver/naviserver/ChangeLog,v retrieving revision 1.272 retrieving revision 1.273 diff -C2 -d -r1.272 -r1.273 *** ChangeLog 14 Jan 2006 17:45:41 -0000 1.272 --- ChangeLog 14 Jan 2006 18:40:06 -0000 1.273 *************** *** 4,7 **** --- 4,10 ---- binary strings. Fixes Bug #1405988. + * nsd/driver.c (NsStopDrivers): does not attempt to trigger + spooler pipe if spooler thread disabled. + 2006-01-13 Zoran Vasiljevic <vas...@us...> |
From: Zoran V. <vas...@us...> - 2006-01-14 18:07:53
|
Update of /cvsroot/naviserver/naviserver/nsd In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv27097/nsd Modified Files: tclmisc.c Log Message: Indented. Index: tclmisc.c =================================================================== RCS file: /cvsroot/naviserver/naviserver/nsd/tclmisc.c,v retrieving revision 1.16 retrieving revision 1.17 diff -C2 -d -r1.16 -r1.17 *** tclmisc.c 14 Jan 2006 17:45:41 -0000 1.16 --- tclmisc.c 14 Jan 2006 18:07:44 -0000 1.17 *************** *** 1,7 **** /* ! * The contents of this file are subject to the AOLserver Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at ! * http://aolserver.com/. * * Software distributed under the License is distributed on an "AS IS" --- 1,7 ---- /* ! * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at ! * http://mozilla.org/. * * Software distributed under the License is distributed on an "AS IS" *************** *** 65,70 **** Ns_TclPrintfResult(Tcl_Interp *interp, char *fmt, ...) { ! va_list ap; ! Tcl_DString ds; Tcl_DStringInit(&ds); --- 65,70 ---- Ns_TclPrintfResult(Tcl_Interp *interp, char *fmt, ...) { ! va_list ap; ! Tcl_DString ds; Tcl_DStringInit(&ds); *************** *** 93,97 **** int ! NsTclRunOnceObjCmd(ClientData arg, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { NsInterp *itPtr = arg; --- 93,98 ---- int ! NsTclRunOnceObjCmd(ClientData arg, Tcl_Interp *interp, int objc, ! Tcl_Obj *CONST objv[]) { NsInterp *itPtr = arg; *************** *** 119,124 **** initialized = NS_TRUE; } ! (void) Tcl_CreateHashEntry(global ? &runTable : &itPtr->servPtr->tcl.runTable, ! script, &new); Ns_MasterUnlock(); --- 120,125 ---- initialized = NS_TRUE; } ! (void) Tcl_CreateHashEntry(global ? &runTable : ! &itPtr->servPtr->tcl.runTable, script, &new); Ns_MasterUnlock(); *************** *** 239,249 **** * NsTclStripHtmlCmd -- * ! * Implements ns_striphtml. * * Results: ! * Tcl result. * * Side effects: ! * See docs. * *---------------------------------------------------------------------- --- 240,250 ---- * NsTclStripHtmlCmd -- * ! * Implements ns_striphtml. * * Results: ! * Tcl result. * * Side effects: ! * See docs. * *---------------------------------------------------------------------- *************** *** 254,258 **** { int intag; /* flag to see if are we inside a tag */ ! int intspec; /* flag to see if we are inside a special char */ char *inString; /* copy of input string */ char *inPtr; /* moving pointer to input string */ --- 255,259 ---- { int intag; /* flag to see if are we inside a tag */ ! int intspec; /* flag to see if we are inside a special char */ char *inString; /* copy of input string */ char *inPtr; /* moving pointer to input string */ *************** *** 280,302 **** } else if (intag && (*inPtr == '>')) { ! /* inside a tag that closes */ intag = 0; } else if (intspec && (*inPtr == ';')) { ! /* inside a special character that closes */ ! intspec = 0; } else if (!intag && !intspec) { ! /* regular text */ if (*inPtr == '&') { ! /* starting a new special character */ intspec=WordEndsInSemi(inPtr); ! } if (!intspec) { ! /* incr pointer only if we're not in something htmlish */ *outPtr++ = *inPtr; ! } } ++inPtr; --- 281,303 ---- } else if (intag && (*inPtr == '>')) { ! /* inside a tag that closes */ intag = 0; } else if (intspec && (*inPtr == ';')) { ! /* inside a special character that closes */ ! intspec = 0; } else if (!intag && !intspec) { ! /* regular text */ if (*inPtr == '&') { ! /* starting a new special character */ intspec=WordEndsInSemi(inPtr); ! } if (!intspec) { ! /* incr pointer only if we're not in something htmlish */ *outPtr++ = *inPtr; ! } } ++inPtr; *************** *** 319,329 **** * NsTclCryptObjCmd -- * ! * Implements ns_crypt as ObjCommand. * * Results: ! * Tcl result. * * Side effects: ! * See docs. * *---------------------------------------------------------------------- --- 320,330 ---- * NsTclCryptObjCmd -- * ! * Implements ns_crypt as ObjCommand. * * Results: ! * Tcl result. * * Side effects: ! * See docs. * *---------------------------------------------------------------------- *************** *** 331,335 **** int ! NsTclCryptObjCmd(ClientData arg, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { char buf[NS_ENCRYPT_BUFSIZE]; --- 332,337 ---- int ! NsTclCryptObjCmd(ClientData arg, Tcl_Interp *interp, int objc, ! Tcl_Obj *CONST objv[]) { char buf[NS_ENCRYPT_BUFSIZE]; *************** *** 339,343 **** return TCL_ERROR; } ! Tcl_SetResult(interp, Ns_Encrypt(Tcl_GetString(objv[1]), Tcl_GetString(objv[2]), buf), TCL_VOLATILE); return TCL_OK; --- 341,347 ---- return TCL_ERROR; } ! Tcl_SetResult(interp, ! Ns_Encrypt(Tcl_GetString(objv[1]), ! Tcl_GetString(objv[2]), buf), TCL_VOLATILE); return TCL_OK; *************** *** 350,360 **** * NsTclHrefsCmd -- * ! * Implements ns_hrefs. * * Results: ! * Tcl result. * * Side effects: ! * See docs. * *---------------------------------------------------------------------- --- 354,364 ---- * NsTclHrefsCmd -- * ! * Implements ns_hrefs. * * Results: ! * Tcl result. * * Side effects: ! * See docs. * *---------------------------------------------------------------------- *************** *** 371,385 **** return TCL_ERROR; } ! p = argv[1]; while ((s = strchr(p, '<')) && (e = strchr(s, '>'))) { ! ++s; ! *e = '\0'; ! while (*s && isspace(UCHAR(*s))) { ! ++s; ! } ! if ((*s == 'a' || *s == 'A') && isspace(UCHAR(s[1]))) { ! ++s; ! while (*s) { if (!strncasecmp(s, "href", 4)) { s += 4; --- 375,389 ---- return TCL_ERROR; } ! p = argv[1]; while ((s = strchr(p, '<')) && (e = strchr(s, '>'))) { ! ++s; ! *e = '\0'; ! while (*s && isspace(UCHAR(*s))) { ! ++s; ! } ! if ((*s == 'a' || *s == 'A') && isspace(UCHAR(s[1]))) { ! ++s; ! while (*s) { if (!strncasecmp(s, "href", 4)) { s += 4; *************** *** 418,424 **** ++s; } ! } ! *e++ = '>'; ! p = e; } --- 422,428 ---- ++s; } ! } ! *e++ = '>'; ! p = e; } *************** *** 432,442 **** * NsTclHTUUEncodeObjCmd -- * ! * Implements ns_uuencode as obj command. * * Results: ! * Tcl result. * * Side effects: ! * See docs. * *---------------------------------------------------------------------- --- 436,446 ---- * NsTclHTUUEncodeObjCmd -- * ! * Implements ns_uuencode as obj command. * * Results: ! * Tcl result. * * Side effects: ! * See docs. * *---------------------------------------------------------------------- *************** *** 444,452 **** int ! NsTclHTUUEncodeObjCmd(ClientData dummy, Tcl_Interp *interp, int objc, Tcl_Obj **objv) { unsigned char *string; ! char *result; ! int nbytes; if (objc != 2) { --- 448,457 ---- int ! NsTclHTUUEncodeObjCmd(ClientData dummy, Tcl_Interp *interp, int objc, ! Tcl_Obj **objv) { unsigned char *string; ! char *result; ! int nbytes; if (objc != 2) { *************** *** 454,461 **** --- 459,468 ---- return TCL_ERROR; } + string = Tcl_GetByteArrayFromObj(objv[1], &nbytes); result = ns_malloc((size_t) 1 + (4 * MAX(nbytes,2)) / 2); Ns_HtuuEncode(string, (size_t)nbytes, result); Tcl_SetResult(interp, result, (Tcl_FreeProc *) ns_free); + return TCL_OK; } *************** *** 467,477 **** * HTUUDecodeObjcmd -- * ! * Implements ns_uudecode as obj command. * * Results: ! * Tcl result. * * Side effects: ! * See docs. * *---------------------------------------------------------------------- --- 474,484 ---- * HTUUDecodeObjcmd -- * ! * Implements ns_uudecode as obj command. * * Results: ! * Tcl result. * * Side effects: ! * See docs. * *---------------------------------------------------------------------- *************** *** 479,483 **** int ! NsTclHTUUDecodeObjCmd(ClientData dummy, Tcl_Interp *interp, int objc, Tcl_Obj **objv) { int size; --- 486,491 ---- int ! NsTclHTUUDecodeObjCmd(ClientData dummy, Tcl_Interp *interp, int objc, ! Tcl_Obj **objv) { int size; *************** *** 489,492 **** --- 497,501 ---- return TCL_ERROR; } + string = Tcl_GetStringFromObj(objv[1], &size); size += 3; *************** *** 496,499 **** --- 505,509 ---- Tcl_SetObjResult(interp, Tcl_NewByteArrayObj(decoded, size)); ns_free(decoded); + return TCL_OK; } *************** *** 505,515 **** * NsTclCrashCmd -- * ! * Crash the server to test exception handling. * * Results: ! * None. * * Side effects: ! * Server will segfault. * *---------------------------------------------------------------------- --- 515,525 ---- * NsTclCrashCmd -- * ! * Crash the server to test exception handling. * * Results: ! * None. * * Side effects: ! * Server will segfault. * *---------------------------------------------------------------------- *************** *** 519,523 **** NsTclCrashCmd(ClientData dummy, Tcl_Interp *interp, int argc, char **argv) { ! char *death; death = NULL; --- 529,533 ---- NsTclCrashCmd(ClientData dummy, Tcl_Interp *interp, int argc, char **argv) { ! char *death; death = NULL; *************** *** 567,590 **** /* ! * The SHA1 routines are borrowed from libmd, which contains the following header: * ! * * sha.c - NIST Secure Hash Algorithm, FIPS PUB 180 and 180.1. ! * * The algorithm is by spook(s) unknown at the U.S. National Security Agency. ! * * ! * * Written 2 September 1992, Peter C. Gutmann. ! * * This implementation placed in the public domain. ! * * ! * * Modified 1 June 1993, Colin Plumb. ! * * Modified for the new SHS based on Peter Gutmann's work, ! * * 18 July 1994, Colin Plumb. ! * * ! * * Renamed to SHA and comments updated a bit 1 November 1995, Colin Plumb. ! * * These modifications placed in the public domain. ! * * ! * * Comments to pg...@cs... ! * * ! * * Hacked for use in libmd by Martin Hinner <mh...@pe...> * ! * This Tcl library was hacked by Jon Salz <js...@mi...>. * */ --- 577,600 ---- /* ! * The SHA1 routines are borrowed from libmd: * ! * * sha.c - NIST Secure Hash Algorithm, FIPS PUB 180 and 180.1. ! * * The algorithm is by spook(s) unknown at the U.S. National Security Agency. ! * * ! * * Written 2 September 1992, Peter C. Gutmann. ! * * This implementation placed in the public domain. ! * * ! * * Modified 1 June 1993, Colin Plumb. ! * * Modified for the new SHS based on Peter Gutmann's work, ! * * 18 July 1994, Colin Plumb. ! * * ! * * Renamed to SHA and comments updated a bit 1 November 1995, Colin Plumb. ! * * These modifications placed in the public domain. ! * * ! * * Comments to pg...@cs... ! * * ! * * Hacked for use in libmd by Martin Hinner <mh...@pe...> * ! * This Tcl library was hacked by Jon Salz <js...@mi...>. * */ *************** *** 982,986 **** int ! NsTclSHA1ObjCmd(ClientData arg, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { SHA_CTX ctx; --- 992,997 ---- int ! NsTclSHA1ObjCmd(ClientData arg, Tcl_Interp *interp, int objc, ! Tcl_Obj *CONST objv[]) { SHA_CTX ctx; *************** *** 993,997 **** if (objc != 2) { Tcl_WrongNumArgs(interp, 1, objv, "string"); ! return TCL_ERROR; } --- 1004,1008 ---- if (objc != 2) { Tcl_WrongNumArgs(interp, 1, objv, "string"); ! return TCL_ERROR; } *************** *** 1002,1012 **** for (i = 0; i < 20; ++i) { ! digestChars[i * 2] = hexChars[digest[i] >> 4]; ! digestChars[i * 2 + 1] = hexChars[digest[i] & 0xF]; } - digestChars[40] = '\0'; Tcl_AppendResult(interp, digestChars, NULL); ! return NS_OK; } --- 1013,1023 ---- for (i = 0; i < 20; ++i) { ! digestChars[i * 2] = hexChars[digest[i] >> 4]; ! digestChars[i * 2 + 1] = hexChars[digest[i] & 0xF]; } + digestChars[40] = '\0'; Tcl_AppendResult(interp, digestChars, NULL); ! return NS_OK; } |
From: Zoran V. <vas...@us...> - 2006-01-14 17:45:53
|
Update of /cvsroot/naviserver/naviserver/nsd In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv19785/nsd Modified Files: tclmisc.c Log Message: Fixes Bug #1405988. Index: tclmisc.c =================================================================== RCS file: /cvsroot/naviserver/naviserver/nsd/tclmisc.c,v retrieving revision 1.15 retrieving revision 1.16 diff -C2 -d -r1.15 -r1.16 *** tclmisc.c 22 Oct 2005 09:32:14 -0000 1.15 --- tclmisc.c 14 Jan 2006 17:45:41 -0000 1.16 *************** *** 446,450 **** NsTclHTUUEncodeObjCmd(ClientData dummy, Tcl_Interp *interp, int objc, Tcl_Obj **objv) { ! char *string; char *result; int nbytes; --- 446,450 ---- NsTclHTUUEncodeObjCmd(ClientData dummy, Tcl_Interp *interp, int objc, Tcl_Obj **objv) { ! unsigned char *string; char *result; int nbytes; *************** *** 454,460 **** return TCL_ERROR; } ! string = Tcl_GetStringFromObj(objv[1], &nbytes); result = ns_malloc((size_t) 1 + (4 * MAX(nbytes,2)) / 2); ! Ns_HtuuEncode((unsigned char *) string, (size_t)nbytes, result); Tcl_SetResult(interp, result, (Tcl_FreeProc *) ns_free); return TCL_OK; --- 454,460 ---- return TCL_ERROR; } ! string = Tcl_GetByteArrayFromObj(objv[1], &nbytes); result = ns_malloc((size_t) 1 + (4 * MAX(nbytes,2)) / 2); ! Ns_HtuuEncode(string, (size_t)nbytes, result); Tcl_SetResult(interp, result, (Tcl_FreeProc *) ns_free); return TCL_OK; |
From: Zoran V. <vas...@us...> - 2006-01-14 17:45:49
|
Update of /cvsroot/naviserver/naviserver In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv19785 Modified Files: ChangeLog Log Message: Fixes Bug #1405988. Index: ChangeLog =================================================================== RCS file: /cvsroot/naviserver/naviserver/ChangeLog,v retrieving revision 1.271 retrieving revision 1.272 diff -C2 -d -r1.271 -r1.272 *** ChangeLog 13 Jan 2006 15:49:10 -0000 1.271 --- ChangeLog 14 Jan 2006 17:45:41 -0000 1.272 *************** *** 1,2 **** --- 1,7 ---- + 2006-01-14 Zoran Vasiljevic <vas...@us...> + + * nsd/tclmisc.c (NsTclHTUUEncodeObjCmd): properly handles + binary strings. Fixes Bug #1405988. + 2006-01-13 Zoran Vasiljevic <vas...@us...> |
From: Zoran V. <vas...@us...> - 2006-01-13 15:49:28
|
Update of /cvsroot/naviserver/naviserver In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv26664 Modified Files: ChangeLog Log Message: Implemented RFE #1404901 Index: ChangeLog =================================================================== RCS file: /cvsroot/naviserver/naviserver/ChangeLog,v retrieving revision 1.270 retrieving revision 1.271 diff -C2 -d -r1.270 -r1.271 *** ChangeLog 12 Jan 2006 01:17:56 -0000 1.270 --- ChangeLog 13 Jan 2006 15:49:10 -0000 1.271 *************** *** 1,2 **** --- 1,18 ---- + 2006-01-13 Zoran Vasiljevic <vas...@us...> + + ATTENTION: Tcl compatibility affected. + + * include/ns.h: + * nsd/conn.c: + * nsd/pathname.c: + * nsd/tclcallbacks.c: + * nsd/tclinit.c: + * nsd/tclrequest.c: + * nsd/tclsched.c: + * nsd/url2file.c: + * tests/ns_register_filter.test: + * tests/ns_register_proc.test: + * tests/url2file.test: Implemented RFE #1404901. + 2006-01-11 Vlad Seryakov <ser...@us...> |
From: Zoran V. <vas...@us...> - 2006-01-13 15:49:23
|
Update of /cvsroot/naviserver/naviserver/tests In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv26664/tests Modified Files: ns_register_filter.test ns_register_proc.test url2file.test Log Message: Implemented RFE #1404901 Index: url2file.test =================================================================== RCS file: /cvsroot/naviserver/naviserver/tests/url2file.test,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** url2file.test 30 Dec 2005 11:26:42 -0000 1.2 --- url2file.test 13 Jan 2006 15:49:12 -0000 1.3 *************** *** 17,21 **** test ns_log-1.2 {basic syntax} -body { ns_register_url2file ! } -returnCodes error -result {wrong # args: should be "ns_register_url2file ?-noinherit? ?--? url script ?arg?"} test url2file-1.3 {basic syntax} -body { --- 17,21 ---- test ns_log-1.2 {basic syntax} -body { ns_register_url2file ! } -returnCodes error -result {wrong # args: should be "ns_register_url2file ?-noinherit? ?--? url script ?args?"} test url2file-1.3 {basic syntax} -body { Index: ns_register_filter.test =================================================================== RCS file: /cvsroot/naviserver/naviserver/tests/ns_register_filter.test,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** ns_register_filter.test 23 Dec 2005 04:27:22 -0000 1.3 --- ns_register_filter.test 13 Jan 2006 15:49:11 -0000 1.4 *************** *** 13,17 **** test filter-1.1 {basic syntax} -body { ns_register_filter ! } -returnCodes error -result {wrong # args: should be "ns_register_filter ?-first? ?--? when method urlPattern script ?arg?"} test filter-1.2 {basic syntax} -body { --- 13,17 ---- test filter-1.1 {basic syntax} -body { ns_register_filter ! } -returnCodes error -result {wrong # args: should be "ns_register_filter ?-first? ?--? when method urlPattern script ?args?"} test filter-1.2 {basic syntax} -body { *************** *** 21,25 **** test filter-1.3 {basic syntax} -body { ns_register_trace ! } -returnCodes error -result {wrong # args: should be "ns_register_trace method urlPattern script ?arg?"} --- 21,25 ---- test filter-1.3 {basic syntax} -body { ns_register_trace ! } -returnCodes error -result {wrong # args: should be "ns_register_trace method urlPattern script ?args?"} *************** *** 180,186 **** } -result {preauth} ! test filter-6.2 {filter scriptarg} -setup { ns_register_filter preauth GET /filter-6.2 { ! nsv_lappend . . } x } -body { ns_logctl severity Error off --- 180,186 ---- } -result {preauth} ! test filter-6.2 {filter scriptargs} -setup { ns_register_filter preauth GET /filter-6.2 { ! nsv_lappend . . } x y z } -body { ns_logctl severity Error off *************** *** 190,196 **** } -cleanup { nsv_unset -nocomplain . . ! } -result {x preauth} ! test filter-6.3 {no trace scriptarg} -setup { ns_register_trace GET /trace-6.3 { nsv_lappend . . ignore } --- 190,196 ---- } -cleanup { nsv_unset -nocomplain . . ! } -result {preauth x y z} ! test filter-6.3 {no trace scriptargs} -setup { ns_register_trace GET /trace-6.3 { nsv_lappend . . ignore } *************** *** 205,211 **** } -result {ignore} ! test filter-6.4 {trace scriptarg} -setup { ns_register_trace GET /trace-6.4 { ! nsv_lappend . . ignore } x } -body { ns_logctl severity Error on --- 205,211 ---- } -result {ignore} ! test filter-6.4 {trace scriptargs} -setup { ns_register_trace GET /trace-6.4 { ! nsv_lappend . . ignore } x y z } -body { ns_logctl severity Error on *************** *** 216,220 **** } -cleanup { nsv_unset -nocomplain . . ! } -result {ignore x} --- 216,220 ---- } -cleanup { nsv_unset -nocomplain . . ! } -result {ignore x y z} Index: ns_register_proc.test =================================================================== RCS file: /cvsroot/naviserver/naviserver/tests/ns_register_proc.test,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** ns_register_proc.test 11 Dec 2005 04:44:05 -0000 1.2 --- ns_register_proc.test 13 Jan 2006 15:49:11 -0000 1.3 *************** *** 13,17 **** test proc-1.1 {basic syntax} -body { ns_register_proc ! } -returnCodes error -result {wrong # args: should be "ns_register_proc ?-noinherit? ?--? method url script ?arg?"} test proc-1.2 {basic syntax} -body { --- 13,17 ---- test proc-1.1 {basic syntax} -body { ns_register_proc ! } -returnCodes error -result {wrong # args: should be "ns_register_proc ?-noinherit? ?--? method url script ?args?"} test proc-1.2 {basic syntax} -body { |
From: Zoran V. <vas...@us...> - 2006-01-13 15:49:22
|
Update of /cvsroot/naviserver/naviserver/nsd In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv26664/nsd Modified Files: conn.c pathname.c tclcallbacks.c tclinit.c tclrequest.c tclsched.c url2file.c Log Message: Implemented RFE #1404901 Index: tclinit.c =================================================================== RCS file: /cvsroot/naviserver/naviserver/nsd/tclinit.c,v retrieving revision 1.16 retrieving revision 1.17 diff -C2 -d -r1.16 -r1.17 *** tclinit.c 24 Nov 2005 19:01:20 -0000 1.16 --- tclinit.c 13 Jan 2006 15:49:11 -0000 1.17 *************** *** 775,780 **** Defer *deferPtr; Ns_TclCallback *cbPtr; ! char *script, *scriptArg = NULL; ! int opt, length, when = 0, result = TCL_OK; static CONST char *opts[] = { --- 775,781 ---- Defer *deferPtr; Ns_TclCallback *cbPtr; ! Tcl_Obj *scriptObj; ! char *script; ! int remain = 0, opt, length, when = 0, result = TCL_OK; static CONST char *opts[] = { *************** *** 799,804 **** Ns_ObjvSpec traceArgs[] = { {"when", Ns_ObjvFlags, &when, traceWhen}, ! {"script", Ns_ObjvString, &script, NULL}, ! {"?scriptArg", Ns_ObjvString, &scriptArg, NULL}, {NULL, NULL, NULL, NULL} }; --- 800,805 ---- Ns_ObjvSpec traceArgs[] = { {"when", Ns_ObjvFlags, &when, traceWhen}, ! {"script", Ns_ObjvObj, &scriptObj, NULL}, ! {"?args", Ns_ObjvArgs, &remain, NULL}, {NULL, NULL, NULL, NULL} }; *************** *** 980,985 **** return TCL_ERROR; } ! cbPtr = Ns_TclNewCallback(itPtr->interp, NsTclTraceProc, ! script, scriptArg); (void) Ns_TclRegisterTrace(servPtr->server, NsTclTraceProc, cbPtr, when); break; --- 981,986 ---- return TCL_ERROR; } ! cbPtr = Ns_TclNewCallback(itPtr->interp, NsTclTraceProc, scriptObj, ! remain, objv + (objc - remain)); (void) Ns_TclRegisterTrace(servPtr->server, NsTclTraceProc, cbPtr, when); break; Index: tclcallbacks.c =================================================================== RCS file: /cvsroot/naviserver/naviserver/nsd/tclcallbacks.c,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** tclcallbacks.c 9 Oct 2005 22:27:24 -0000 1.3 --- tclcallbacks.c 13 Jan 2006 15:49:11 -0000 1.4 *************** *** 56,60 **** *---------------------------------------------------------------------- * ! * Ns_TclNewCallback, Ns_TclNewCallbackObj -- * * Create a new script callback. --- 56,60 ---- *---------------------------------------------------------------------- * ! * Ns_TclNewCallback -- * * Create a new script callback. *************** *** 64,95 **** * * Side effects: ! * Copies are made of script and scriptarg. * *---------------------------------------------------------------------- */ ! Ns_TclCallback * ! Ns_TclNewCallback(Tcl_Interp *interp, void *cbProc, ! char *script, char *scriptarg) { Ns_TclCallback *cbPtr; ! cbPtr = ns_malloc(sizeof(Ns_TclCallback)); ! cbPtr->cbProc = cbProc; ! cbPtr->server = Ns_TclInterpServer(interp); ! cbPtr->script = ns_strdup(script); ! cbPtr->scriptarg = ns_strcopy(scriptarg); return cbPtr; } - Ns_TclCallback * - Ns_TclNewCallbackObj(Tcl_Interp *interp, void *cbProc, - Tcl_Obj *objPtr, Tcl_Obj *argObjPtr) - { - return Ns_TclNewCallback(interp, cbProc, Tcl_GetString(objPtr), - (argObjPtr ? Tcl_GetString(argObjPtr) : NULL)); - } - /* --- 64,95 ---- * * Side effects: ! * Copies are made of script and arguments * *---------------------------------------------------------------------- */ ! Ns_TclCallback* ! Ns_TclNewCallback(Tcl_Interp *interp, void *cbProc, Tcl_Obj *scriptObjPtr, ! int objc, Tcl_Obj *CONST objv[]) { + int ii; Ns_TclCallback *cbPtr; + + cbPtr = ns_malloc(sizeof(Ns_TclCallback) + objc * sizeof(char *)); + cbPtr->cbProc = cbProc; + cbPtr->server = Ns_TclInterpServer(interp); + cbPtr->script = ns_strdup(Tcl_GetString(scriptObjPtr)); + cbPtr->argc = objc; + cbPtr->argv = (char **)((char *)cbPtr + sizeof(Ns_TclCallback)); ! if (objc) { ! for (ii = 0; ii < objc; ii++) { ! cbPtr->argv[ii] = ns_strdup(Tcl_GetString(objv[ii])); ! } ! } return cbPtr; } /* *************** *** 112,119 **** Ns_TclFreeCallback(void *arg) { Ns_TclCallback *cbPtr = arg; ns_free(cbPtr->script); - ns_free(cbPtr->scriptarg); ns_free(cbPtr); } --- 112,123 ---- Ns_TclFreeCallback(void *arg) { + int ii; Ns_TclCallback *cbPtr = arg; + for (ii = 0; ii < cbPtr->argc; ii++) { + ns_free(cbPtr->argv[ii]); + } + ns_free(cbPtr->script); ns_free(cbPtr); } *************** *** 139,143 **** int ! Ns_TclEvalCallback(Tcl_Interp *interp, Ns_TclCallback *cbPtr, Ns_DString *result, ...) { va_list ap; --- 143,148 ---- int ! Ns_TclEvalCallback(Tcl_Interp *interp, Ns_TclCallback *cbPtr, ! Ns_DString *result, ...) { va_list ap; *************** *** 145,149 **** char *arg; int deallocInterp = 0; ! int status = TCL_ERROR; if (interp == NULL) { --- 150,154 ---- char *arg; int deallocInterp = 0; ! int ii, status = TCL_ERROR; if (interp == NULL) { *************** *** 159,164 **** } va_end(ap); ! if (cbPtr->scriptarg) { ! Ns_DStringAppendElement(&ds, cbPtr->scriptarg); } status = Tcl_EvalEx(interp, ds.string, ds.length, 0); --- 164,169 ---- } va_end(ap); ! for (ii = 0; ii < cbPtr->argc; ii++) { ! Ns_DStringAppendElement(&ds, cbPtr->argv[ii]); } status = Tcl_EvalEx(interp, ds.string, ds.length, 0); *************** *** 226,234 **** Ns_TclCallbackArgProc(Tcl_DString *dsPtr, void *arg) { Ns_TclCallback *cbPtr = arg; Tcl_DStringAppendElement(dsPtr, cbPtr->script); ! if (cbPtr->scriptarg != NULL) { ! Tcl_DStringAppendElement(dsPtr, cbPtr->scriptarg); } } --- 231,240 ---- Ns_TclCallbackArgProc(Tcl_DString *dsPtr, void *arg) { + int ii; Ns_TclCallback *cbPtr = arg; Tcl_DStringAppendElement(dsPtr, cbPtr->script); ! for (ii = 0; ii < cbPtr->argc; ii++) { ! Tcl_DStringAppendElement(dsPtr, cbPtr->argv[ii]); } } *************** *** 256,265 **** Ns_TclCallback *cbPtr; ! if (objc != 2 && objc != 3) { ! Tcl_WrongNumArgs(interp, 1, objv, "script ?arg?"); return TCL_ERROR; } ! cbPtr = Ns_TclNewCallbackObj(interp, Ns_TclCallbackProc, ! objv[1], (objc == 3) ? objv[2] : NULL); (*atProc)(Ns_TclCallbackProc, cbPtr); --- 262,271 ---- Ns_TclCallback *cbPtr; ! if (objc < 2) { ! Tcl_WrongNumArgs(interp, 1, objv, "script ?args?"); return TCL_ERROR; } ! cbPtr = Ns_TclNewCallback(interp, Ns_TclCallbackProc, objv[1], ! objc - 2, objv + 2); (*atProc)(Ns_TclCallbackProc, cbPtr); Index: conn.c =================================================================== RCS file: /cvsroot/naviserver/naviserver/nsd/conn.c,v retrieving revision 1.24 retrieving revision 1.25 diff -C2 -d -r1.24 -r1.25 *** conn.c 4 Jan 2006 14:08:03 -0000 1.24 --- conn.c 13 Jan 2006 15:49:11 -0000 1.25 *************** *** 1436,1446 **** int NsTclLocationProcObjCmd(ClientData arg, Tcl_Interp *interp, int objc, ! Tcl_Obj **objv) { NsServer *servPtr = NsGetInitServer(); Ns_TclCallback *cbPtr; ! if (objc != 2 && objc != 3) { ! Tcl_WrongNumArgs(interp, 1, objv, "script ?arg?"); return TCL_ERROR; } --- 1436,1446 ---- int NsTclLocationProcObjCmd(ClientData arg, Tcl_Interp *interp, int objc, ! Tcl_Obj *CONST objv[]) { NsServer *servPtr = NsGetInitServer(); Ns_TclCallback *cbPtr; ! if (objc < 2) { ! Tcl_WrongNumArgs(interp, 1, objv, "script ?args?"); return TCL_ERROR; } *************** *** 1449,1454 **** return TCL_ERROR; } ! cbPtr = Ns_TclNewCallbackObj(interp, NsTclConnLocation, ! objv[1], (objc > 2) ? objv[2] : NULL); Ns_SetConnLocationProc(NsTclConnLocation, cbPtr); --- 1449,1454 ---- return TCL_ERROR; } ! cbPtr = Ns_TclNewCallback(interp, NsTclConnLocation, objv[1], ! objc - 2, objv + 2); Ns_SetConnLocationProc(NsTclConnLocation, cbPtr); Index: pathname.c =================================================================== RCS file: /cvsroot/naviserver/naviserver/nsd/pathname.c,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** pathname.c 19 Aug 2005 08:20:27 -0000 1.6 --- pathname.c 13 Jan 2006 15:49:11 -0000 1.7 *************** *** 664,674 **** int ! NsTclServerRootProcObjCmd(ClientData arg, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { ! NsServer *servPtr = NsGetInitServer(); ! Ns_TclCallback *cbPtr; ! if (objc != 2 && objc != 3) { ! Tcl_WrongNumArgs(interp, 1, objv, "script ?arg?"); return TCL_ERROR; } --- 664,675 ---- int ! NsTclServerRootProcObjCmd(ClientData arg, Tcl_Interp *interp, int objc, ! Tcl_Obj *CONST objv[]) { ! NsServer *servPtr = NsGetInitServer(); ! Ns_TclCallback *cbPtr; ! if (objc < 2) { ! Tcl_WrongNumArgs(interp, 1, objv, "script ?args?"); return TCL_ERROR; } *************** *** 677,682 **** return TCL_ERROR; } ! cbPtr = Ns_TclNewCallbackObj(interp, NsTclServerRoot, ! objv[1], (objc > 2) ? objv[2] : NULL); Ns_SetServerRootProc(NsTclServerRoot, cbPtr); --- 678,683 ---- return TCL_ERROR; } ! cbPtr = Ns_TclNewCallback(interp, NsTclServerRoot, objv[1], ! objc - 2, objv + 2); Ns_SetServerRootProc(NsTclServerRoot, cbPtr); Index: tclsched.c =================================================================== RCS file: /cvsroot/naviserver/naviserver/nsd/tclsched.c,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** tclsched.c 10 Jun 2005 17:58:40 -0000 1.4 --- tclsched.c 13 Jan 2006 15:49:11 -0000 1.5 *************** *** 67,77 **** int ! NsTclAfterObjCmd(ClientData arg, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { Ns_TclCallback *cbPtr; int id, seconds; ! if (objc != 3) { ! Tcl_WrongNumArgs(interp, 1, objv, "seconds script"); return TCL_ERROR; } --- 67,78 ---- int ! NsTclAfterObjCmd(ClientData arg, Tcl_Interp *interp, int objc, ! Tcl_Obj *CONST objv[]) { Ns_TclCallback *cbPtr; int id, seconds; ! if (objc < 3) { ! Tcl_WrongNumArgs(interp, 1, objv, "seconds script ?args?"); return TCL_ERROR; } *************** *** 79,84 **** return TCL_ERROR; } ! cbPtr = Ns_TclNewCallbackObj(interp, NsTclSchedProc, objv[2], NULL); ! id = Ns_After(seconds, (Ns_Callback *) NsTclSchedProc, cbPtr, Ns_TclFreeCallback); return ReturnValidId(interp, id, cbPtr); --- 80,87 ---- return TCL_ERROR; } ! cbPtr = Ns_TclNewCallback(interp, NsTclSchedProc, objv[2], ! objc - 3, objv + 3); ! id = Ns_After(seconds, (Ns_Callback *) NsTclSchedProc, cbPtr, ! Ns_TclFreeCallback); return ReturnValidId(interp, id, cbPtr); *************** *** 177,188 **** int ! NsTclSchedDailyObjCmd(ClientData arg, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { Ns_TclCallback *cbPtr; ! int id; ! int hour, minute; ! char *script; ! char *scriptarg = NULL; ! int flags = 0, once = 0, thread = 0; Ns_ObjvSpec opts[] = { --- 180,190 ---- int ! NsTclSchedDailyObjCmd(ClientData arg, Tcl_Interp *interp, int objc, ! Tcl_Obj *CONST objv[]) { Ns_TclCallback *cbPtr; ! Tcl_Obj *scriptObj; ! int id, hour, minute; ! int remain = 0, flags = 0, once = 0, thread = 0; Ns_ObjvSpec opts[] = { *************** *** 193,200 **** }; Ns_ObjvSpec args[] = { ! {"hour", Ns_ObjvInt, &hour, NULL}, ! {"minute", Ns_ObjvInt, &minute, NULL}, ! {"script", Ns_ObjvString, &script, NULL}, ! {"?arg", Ns_ObjvString, &scriptarg, NULL}, {NULL, NULL, NULL, NULL} }; --- 195,202 ---- }; Ns_ObjvSpec args[] = { ! {"hour", Ns_ObjvInt, &hour, NULL}, ! {"minute", Ns_ObjvInt, &minute, NULL}, ! {"script", Ns_ObjvObj, &scriptObj, NULL}, ! {"?args", Ns_ObjvArgs, &remain, NULL}, {NULL, NULL, NULL, NULL} }; *************** *** 218,222 **** } ! cbPtr = Ns_TclNewCallback(interp, NsTclSchedProc, script, scriptarg); id = Ns_ScheduleDaily(NsTclSchedProc, cbPtr, flags, hour, minute, FreeSched); --- 220,225 ---- } ! cbPtr = Ns_TclNewCallback(interp, NsTclSchedProc, scriptObj, ! remain, objv + (objc - remain)); id = Ns_ScheduleDaily(NsTclSchedProc, cbPtr, flags, hour, minute, FreeSched); *************** *** 243,254 **** int ! NsTclSchedWeeklyObjCmd(ClientData arg, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { Ns_TclCallback *cbPtr; ! int id; ! int day, hour, minute; ! char *script; ! char *scriptarg = NULL; ! int flags = 0, once = 0, thread = 0; Ns_ObjvSpec opts[] = { --- 246,256 ---- int ! NsTclSchedWeeklyObjCmd(ClientData arg, Tcl_Interp *interp, int objc, ! Tcl_Obj *CONST objv[]) { Ns_TclCallback *cbPtr; ! Tcl_Obj *scriptObj; ! int id, day, hour, minute; ! int remain = 0, flags = 0, once = 0, thread = 0; Ns_ObjvSpec opts[] = { *************** *** 262,267 **** {"hour", Ns_ObjvInt, &hour, NULL}, {"minute", Ns_ObjvInt, &minute, NULL}, ! {"script", Ns_ObjvString, &script, NULL}, ! {"?arg", Ns_ObjvString, &scriptarg, NULL}, {NULL, NULL, NULL, NULL} }; --- 264,269 ---- {"hour", Ns_ObjvInt, &hour, NULL}, {"minute", Ns_ObjvInt, &minute, NULL}, ! {"script", Ns_ObjvObj, &scriptObj, NULL}, ! {"?args", Ns_ObjvArgs, &remain, NULL}, {NULL, NULL, NULL, NULL} }; *************** *** 289,293 **** } ! cbPtr = Ns_TclNewCallback(interp, NsTclSchedProc, script, scriptarg); id = Ns_ScheduleWeekly(NsTclSchedProc, cbPtr, flags, day, hour, minute, FreeSched); --- 291,296 ---- } ! cbPtr = Ns_TclNewCallback(interp, NsTclSchedProc, scriptObj, ! remain, objv + (objc - remain)); id = Ns_ScheduleWeekly(NsTclSchedProc, cbPtr, flags, day, hour, minute, FreeSched); *************** *** 314,325 **** int ! NsTclSchedObjCmd(ClientData arg, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { Ns_TclCallback *cbPtr; ! int id; ! int interval; ! char *script; ! char *scriptarg = NULL; ! int flags = 0, once = 0, thread = 0; Ns_ObjvSpec opts[] = { --- 317,327 ---- int ! NsTclSchedObjCmd(ClientData arg, Tcl_Interp *interp, int objc, ! Tcl_Obj *CONST objv[]) { Ns_TclCallback *cbPtr; ! Tcl_Obj *scriptObj; ! int id, interval; ! int remain = 0, flags = 0, once = 0, thread = 0; Ns_ObjvSpec opts[] = { *************** *** 331,336 **** Ns_ObjvSpec args[] = { {"interval", Ns_ObjvInt, &interval, NULL}, ! {"script", Ns_ObjvString, &script, NULL}, ! {"?arg", Ns_ObjvString, &scriptarg, NULL}, {NULL, NULL, NULL, NULL} }; --- 333,338 ---- Ns_ObjvSpec args[] = { {"interval", Ns_ObjvInt, &interval, NULL}, ! {"script", Ns_ObjvObj, &scriptObj, NULL}, ! {"?args", Ns_ObjvArgs, &remain, NULL}, {NULL, NULL, NULL, NULL} }; *************** *** 350,354 **** } ! cbPtr = Ns_TclNewCallback(interp, NsTclSchedProc, script, scriptarg); id = Ns_ScheduleProcEx(NsTclSchedProc, cbPtr, flags, interval, FreeSched); --- 352,357 ---- } ! cbPtr = Ns_TclNewCallback(interp, NsTclSchedProc, scriptObj, ! remain, objv + (objc - remain)); id = Ns_ScheduleProcEx(NsTclSchedProc, cbPtr, flags, interval, FreeSched); Index: tclrequest.c =================================================================== RCS file: /cvsroot/naviserver/naviserver/nsd/tclrequest.c,v retrieving revision 1.11 retrieving revision 1.12 diff -C2 -d -r1.11 -r1.12 *** tclrequest.c 23 Dec 2005 04:27:22 -0000 1.11 --- tclrequest.c 13 Jan 2006 15:49:11 -0000 1.12 *************** *** 73,80 **** Ns_TclCallback cb; ! cb.cbProc = &NsTclRequestProc; ! cb.server = Ns_ConnServer(conn); ! cb.script = (char *) name; ! cb.scriptarg = NULL; return NsTclRequestProc(&cb, conn); --- 73,81 ---- Ns_TclCallback cb; ! cb.cbProc = &NsTclRequestProc; ! cb.server = Ns_ConnServer(conn); ! cb.script = (char *) name; ! cb.argc = 0; ! cb.argv = NULL; return NsTclRequestProc(&cb, conn); *************** *** 104,109 **** NsInterp *itPtr = arg; Ns_TclCallback *cbPtr; ! char *method, *url, *script, *scriptarg = NULL; ! int flags = 0; Ns_ObjvSpec opts[] = { --- 105,111 ---- NsInterp *itPtr = arg; Ns_TclCallback *cbPtr; ! Tcl_Obj *scriptObj; ! char *method, *url; ! int flags = 0, remain = 0; Ns_ObjvSpec opts[] = { *************** *** 115,120 **** {"method", Ns_ObjvString, &method, NULL}, {"url", Ns_ObjvString, &url, NULL}, ! {"script", Ns_ObjvString, &script, NULL}, ! {"?arg", Ns_ObjvString, &scriptarg, NULL}, {NULL, NULL, NULL, NULL} }; --- 117,122 ---- {"method", Ns_ObjvString, &method, NULL}, {"url", Ns_ObjvString, &url, NULL}, ! {"script", Ns_ObjvObj, &scriptObj, NULL}, ! {"?args", Ns_ObjvArgs, &remain, NULL}, {NULL, NULL, NULL, NULL} }; *************** *** 123,127 **** } ! cbPtr = Ns_TclNewCallback(interp, NsTclRequestProc, script, scriptarg); Ns_RegisterRequest(itPtr->servPtr->server, method, url, NsTclRequestProc, Ns_TclFreeCallback, cbPtr, flags); --- 125,130 ---- } ! cbPtr = Ns_TclNewCallback(interp, NsTclRequestProc, scriptObj, ! remain, objv + (objc - remain)); Ns_RegisterRequest(itPtr->servPtr->server, method, url, NsTclRequestProc, Ns_TclFreeCallback, cbPtr, flags); *************** *** 290,295 **** NsInterp *itPtr = arg; Ns_TclCallback *cbPtr; ! char *method, *urlPattern, *script, *scriptarg = NULL; ! int when = 0; Ns_ObjvSpec opts[] = { --- 293,299 ---- NsInterp *itPtr = arg; Ns_TclCallback *cbPtr; ! char *method, *urlPattern; ! Tcl_Obj *scriptObj; ! int remain = 0, when = 0; Ns_ObjvSpec opts[] = { *************** *** 302,307 **** {"method", Ns_ObjvString, &method, NULL}, {"urlPattern", Ns_ObjvString, &urlPattern, NULL}, ! {"script", Ns_ObjvString, &script, NULL}, ! {"?arg", Ns_ObjvString, &scriptarg, NULL}, {NULL, NULL, NULL, NULL} }; --- 306,311 ---- {"method", Ns_ObjvString, &method, NULL}, {"urlPattern", Ns_ObjvString, &urlPattern, NULL}, ! {"script", Ns_ObjvObj, &scriptObj, NULL}, ! {"?args", Ns_ObjvArgs, &remain, NULL}, {NULL, NULL, NULL, NULL} }; *************** *** 310,314 **** } ! cbPtr = Ns_TclNewCallback(interp, NsTclFilterProc, script, scriptarg); Ns_RegisterFilter(itPtr->servPtr->server, method, urlPattern, NsTclFilterProc, when, cbPtr); --- 314,319 ---- } ! cbPtr = Ns_TclNewCallback(interp, NsTclFilterProc, scriptObj, ! remain, objv + (objc - remain)); Ns_RegisterFilter(itPtr->servPtr->server, method, urlPattern, NsTclFilterProc, when, cbPtr); *************** *** 380,390 **** NsInterp *itPtr = arg; Ns_TclCallback *cbPtr; ! char *method, *urlPattern, *script, *scriptarg = NULL; Ns_ObjvSpec args[] = { {"method", Ns_ObjvString, &method, NULL}, {"urlPattern", Ns_ObjvString, &urlPattern, NULL}, ! {"script", Ns_ObjvString, &script, NULL}, ! {"?arg", Ns_ObjvString, &scriptarg, NULL}, {NULL, NULL, NULL, NULL} }; --- 385,397 ---- NsInterp *itPtr = arg; Ns_TclCallback *cbPtr; ! char *method, *urlPattern; ! Tcl_Obj *scriptObj; ! int remain = 0; Ns_ObjvSpec args[] = { {"method", Ns_ObjvString, &method, NULL}, {"urlPattern", Ns_ObjvString, &urlPattern, NULL}, ! {"script", Ns_ObjvObj, &scriptObj, NULL}, ! {"?args", Ns_ObjvArgs, &remain, NULL}, {NULL, NULL, NULL, NULL} }; *************** *** 393,397 **** } ! cbPtr = Ns_TclNewCallback(interp, NsTclFilterProc, script, scriptarg); Ns_RegisterFilter(itPtr->servPtr->server, method, urlPattern, NsTclFilterProc, NS_FILTER_VOID_TRACE, cbPtr); --- 400,405 ---- } ! cbPtr = Ns_TclNewCallback(interp, NsTclFilterProc, scriptObj, ! remain, objv + (objc - remain)); Ns_RegisterFilter(itPtr->servPtr->server, method, urlPattern, NsTclFilterProc, NS_FILTER_VOID_TRACE, cbPtr); *************** *** 479,500 **** Tcl_DString cmd; Tcl_Interp *interp; ! int status; CONST char *result; ! interp = Ns_GetConnInterp(conn); Tcl_DStringInit(&cmd); ! /* ! * This really should be: cmd why ?arg?, but why and arg ! * are reversed for backwards compatibility. */ ! Tcl_DStringAppend(&cmd, cbPtr->script, -1); ! if (cbPtr->scriptarg != NULL) { ! Tcl_DStringAppendElement(&cmd, cbPtr->scriptarg); ! } ! /* ! * Append the 'why' */ --- 487,504 ---- Tcl_DString cmd; Tcl_Interp *interp; ! int ii, status; CONST char *result; ! interp = Ns_GetConnInterp(conn); Tcl_DStringInit(&cmd); ! /* ! * Append the command */ ! Tcl_DStringAppend(&cmd, cbPtr->script, -1); ! /* ! * Append the 'why' argument */ *************** *** 515,518 **** --- 519,530 ---- /* + * Append optional arguments + */ + + for (ii = 0; ii < cbPtr->argc; ii++) { + Tcl_DStringAppendElement(&cmd, cbPtr->argv[ii]); + } + + /* * Run the script. */ Index: url2file.c =================================================================== RCS file: /cvsroot/naviserver/naviserver/nsd/url2file.c,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** url2file.c 30 Dec 2005 11:26:42 -0000 1.2 --- url2file.c 13 Jan 2006 15:49:11 -0000 1.3 *************** *** 365,380 **** NsInterp *itPtr = arg; Ns_TclCallback *cbPtr; ! char *url, *script, *scriptarg = NULL; ! int flags = 0; ! Ns_ObjvSpec opts[] = { ! {"-noinherit", Ns_ObjvBool, &flags, (void *) NS_OP_NOINHERIT}, ! {"--", Ns_ObjvBreak, NULL, NULL}, {NULL, NULL, NULL, NULL} }; Ns_ObjvSpec args[] = { {"url", Ns_ObjvString, &url, NULL}, ! {"script", Ns_ObjvString, &script, NULL}, ! {"?arg", Ns_ObjvString, &scriptarg, NULL}, {NULL, NULL, NULL, NULL} }; --- 365,381 ---- NsInterp *itPtr = arg; Ns_TclCallback *cbPtr; ! char *url; ! Tcl_Obj *scriptObj; ! int remain = 0, flags = 0; ! Ns_ObjvSpec opts[] = { ! {"-noinherit", Ns_ObjvBool, &flags, (void *) NS_OP_NOINHERIT}, ! {"--", Ns_ObjvBreak, NULL, NULL}, {NULL, NULL, NULL, NULL} }; Ns_ObjvSpec args[] = { {"url", Ns_ObjvString, &url, NULL}, ! {"script", Ns_ObjvObj, &scriptObj, NULL}, ! {"?args", Ns_ObjvArgs, &remain, NULL}, {NULL, NULL, NULL, NULL} }; *************** *** 382,386 **** return TCL_ERROR; } ! cbPtr = Ns_TclNewCallback(interp, NsTclUrl2FileProc, script, scriptarg); Ns_RegisterUrl2FileProc(itPtr->servPtr->server, url, NsTclUrl2FileProc, Ns_TclFreeCallback, cbPtr, flags); --- 383,388 ---- return TCL_ERROR; } ! cbPtr = Ns_TclNewCallback(interp, NsTclUrl2FileProc, scriptObj, ! remain, objv + (objc - remain)); Ns_RegisterUrl2FileProc(itPtr->servPtr->server, url, NsTclUrl2FileProc, Ns_TclFreeCallback, cbPtr, flags); |
From: Zoran V. <vas...@us...> - 2006-01-13 15:49:21
|
Update of /cvsroot/naviserver/naviserver/include In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv26664/include Modified Files: ns.h Log Message: Implemented RFE #1404901 Index: ns.h =================================================================== RCS file: /cvsroot/naviserver/naviserver/include/ns.h,v retrieving revision 1.67 retrieving revision 1.68 diff -C2 -d -r1.67 -r1.68 *** ns.h 4 Jan 2006 10:15:52 -0000 1.67 --- ns.h 13 Jan 2006 15:49:11 -0000 1.68 *************** *** 450,454 **** CONST char *server; char *script; ! char *scriptarg; } Ns_TclCallback; --- 450,455 ---- CONST char *server; char *script; ! int argc; ! char **argv; } Ns_TclCallback; *************** *** 1747,1760 **** NS_EXTERN Ns_TclCallback *Ns_TclNewCallback(Tcl_Interp *interp, void *cbProc, ! char *script, char *scriptarg); ! NS_EXTERN Ns_TclCallback *Ns_TclNewCallbackObj(Tcl_Interp *interp, ! void *cbProc, ! Tcl_Obj *scriptObjPtr, ! Tcl_Obj *argObjPtr); NS_EXTERN int Ns_TclEvalCallback(Tcl_Interp *interp, Ns_TclCallback *cbPtr, Ns_DString *result, ...) NS_GNUC_SENTINEL; NS_EXTERN Ns_Callback Ns_TclCallbackProc; NS_EXTERN Ns_Callback Ns_TclFreeCallback; ! NS_EXTERN Ns_ArgProc Ns_TclCallbackArgProc; /* --- 1748,1760 ---- NS_EXTERN Ns_TclCallback *Ns_TclNewCallback(Tcl_Interp *interp, void *cbProc, ! Tcl_Obj *scriptObjPtr, int objc, ! Tcl_Obj *CONST objv[]); ! NS_EXTERN int Ns_TclEvalCallback(Tcl_Interp *interp, Ns_TclCallback *cbPtr, Ns_DString *result, ...) NS_GNUC_SENTINEL; + NS_EXTERN Ns_Callback Ns_TclCallbackProc; NS_EXTERN Ns_Callback Ns_TclFreeCallback; ! NS_EXTERN Ns_ArgProc Ns_TclCallbackArgProc; /* |