You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@apr.apache.org by be...@apache.org on 2004/05/10 21:51:03 UTC
cvs commit: apr-util/hooks apr_hooks.c
ben 2004/05/10 12:51:03
Modified: hooks apr_hooks.c
Log:
Drag forward topological sort changes.
Revision Changes Path
1.51 +28 -3 apr-util/hooks/apr_hooks.c
Index: apr_hooks.c
===================================================================
RCS file: /home/cvs/apr-util/hooks/apr_hooks.c,v
retrieving revision 1.50
retrieving revision 1.51
diff -u -r1.50 -r1.51
--- apr_hooks.c 13 Feb 2004 09:55:26 -0000 1.50
+++ apr_hooks.c 10 May 2004 19:51:03 -0000 1.51
@@ -126,6 +126,15 @@
return pData;
}
+/* Topologically sort, dragging out-of-order items to the front. Note that
+ this tends to preserve things that want to be near the front better, and
+ changing that behaviour might compromise some of Apache's behaviour (in
+ particular, mod_log_forensic might otherwise get pushed to the end, and
+ core.c's log open function used to end up at the end when pushing items
+ to the back was the methedology). Also note that the algorithm could
+ go back to its original simplicity by sorting from the back instead of
+ the front.
+*/
static TSort *tsort(TSort *pData,int nItems)
{
int nTotal;
@@ -138,8 +147,23 @@
for(n=0 ; ; ++n) {
if(n == nItems)
assert(0); /* we have a loop... */
- if(!pData[n].pNext && !pData[n].nPredecessors)
- break;
+ if(!pData[n].pNext) {
+ if(pData[n].nPredecessors) {
+ for(k=0 ; ; ++k) {
+ assert(k < nItems);
+ if(pData[n].ppPredecessors[k])
+ break;
+ }
+ for(i=0 ; ; ++i) {
+ assert(i < nItems);
+ if(&pData[i] == pData[n].ppPredecessors[k]) {
+ n=i-1;
+ break;
+ }
+ }
+ } else
+ break;
+ }
}
if(pTail)
pTail->pNext=&pData[n];
@@ -148,9 +172,10 @@
pTail=&pData[n];
pTail->pNext=pTail; /* fudge it so it looks linked */
for(i=0 ; i < nItems ; ++i)
- for(k=0 ; pData[i].ppPredecessors[k] ; ++k)
+ for(k=0 ; k < nItems ; ++k)
if(pData[i].ppPredecessors[k] == &pData[n]) {
--pData[i].nPredecessors;
+ pData[i].ppPredecessors[k]=NULL;
break;
}
}