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;
   		}
       }