You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by ak...@apache.org on 2010/05/13 20:25:12 UTC

svn commit: r943969 - in /trafficserver/traffic/branches/UserFiber: include/UF.H src/Makefile src/UF.C src/UFIO.C

Author: akundu
Date: Thu May 13 18:25:12 2010
New Revision: 943969

URL: http://svn.apache.org/viewvc?rev=943969&view=rev
Log:
incorporate the sleep by the base user fiber into epolls sleep interval

Modified:
    trafficserver/traffic/branches/UserFiber/include/UF.H
    trafficserver/traffic/branches/UserFiber/src/Makefile
    trafficserver/traffic/branches/UserFiber/src/UF.C
    trafficserver/traffic/branches/UserFiber/src/UFIO.C

Modified: trafficserver/traffic/branches/UserFiber/include/UF.H
URL: http://svn.apache.org/viewvc/trafficserver/traffic/branches/UserFiber/include/UF.H?rev=943969&r1=943968&r2=943969&view=diff
==============================================================================
--- trafficserver/traffic/branches/UserFiber/include/UF.H (original)
+++ trafficserver/traffic/branches/UserFiber/include/UF.H Thu May 13 18:25:12 2010
@@ -170,6 +170,7 @@ struct UFScheduler
     const ucontext_t& getMainContext() const;
     void setSpecific(void* args);
     void* getSpecific() const;
+    unsigned long long int getAmtToSleep() const;
     static void setExit(bool exit = true);
     void setExitJustMe(bool exit = true);
 
@@ -200,6 +201,9 @@ protected:
 
     //the sleep tree
     MapTimeUF                   _sleepList;
+    //store the shortest sleep interval
+    unsigned long long int      _amtToSleep;
+
 
     //store thread specific content
     void*                       _specific;
@@ -216,6 +220,7 @@ public:
     UFConnectionPool *_conn_pool;
 };
 
+inline unsigned long long int UFScheduler::getAmtToSleep() const { return _amtToSleep; }
 inline UF* UFScheduler::getRunningFiberOnThisThread(){ return _currentFiber; }
 inline const ucontext_t& UFScheduler::getMainContext() const { return _mainContext; };
 inline void UFScheduler::setSpecific(void* args) { _specific = args; }

Modified: trafficserver/traffic/branches/UserFiber/src/Makefile
URL: http://svn.apache.org/viewvc/trafficserver/traffic/branches/UserFiber/src/Makefile?rev=943969&r1=943968&r2=943969&view=diff
==============================================================================
--- trafficserver/traffic/branches/UserFiber/src/Makefile (original)
+++ trafficserver/traffic/branches/UserFiber/src/Makefile Thu May 13 18:25:12 2010
@@ -13,16 +13,16 @@ all:	libUF.a
 UF.o:	UF.C $(INCLUDE_DIR)/UF.H
 	$(CPP) $(BUILD_FLAGS) -c -o $(LIB)/UF.o UF.C -I../include -march=$(ARCH) 
 
-UFIO.o:	UFIO.C $(INCLUDE_DIR)/UFIO.H
+UFIO.o:	UFIO.C $(INCLUDE_DIR)/UFIO.H $(INCLUDE_DIR)/UF.H
 	$(CPP) $(BUILD_FLAGS) -c -o $(LIB)/UFIO.o UFIO.C $(INCLUDE) -march=$(ARCH)
 
-UFStatSystem.o: UFStatSystem.C $(INCLUDE_DIR)/UFStatSystem.H
+UFStatSystem.o: UFStatSystem.C $(INCLUDE_DIR)/UFStatSystem.H $(INCLUDE_DIR)/UFIO.H $(INCLUDE_DIR)/UF.H
 	$(CPP) $(BUILD_FLAGS) -c -o $(LIB)/UFStatSystem.o UFStatSystem.C $(INCLUDE) -march=$(ARCH)
 
-UFServer.o: UFServer.C $(INCLUDE_DIR)/UFServer.H
+UFServer.o: UFServer.C $(INCLUDE_DIR)/UFServer.H $(INCLUDE_DIR)/UFStatSystem.H $(INCLUDE_DIR)/UFIO.H $(INCLUDE_DIR)/UF.H
 	$(CPP) $(BUILD_FLAGS) -c -o $(LIB)/UFServer.o UFServer.C $(INCLUDE) -march=$(ARCH)
 
-UFConnectionPoolImpl.o: UFConnectionPoolImpl.C $(INCLUDE_DIR)/UFConnectionPool.H UFConnectionPoolImpl.H
+UFConnectionPoolImpl.o: UFConnectionPoolImpl.C $(INCLUDE_DIR)/UFConnectionPool.H UFConnectionPoolImpl.H $(INCLUDE_DIR)/UFIO.H $(INCLUDE_DIR)/UF.H
 	$(CPP) $(BUILD_FLAGS) -c -o $(LIB)/UFConnectionPoolImpl.o UFConnectionPoolImpl.C $(INCLUDE) -march=$(ARCH)
 
 libUF.a:	UF.o UFIO.o UFStatSystem.o UFServer.o UFConnectionPoolImpl.o

Modified: trafficserver/traffic/branches/UserFiber/src/UF.C
URL: http://svn.apache.org/viewvc/trafficserver/traffic/branches/UserFiber/src/UF.C?rev=943969&r1=943968&r2=943969&view=diff
==============================================================================
--- trafficserver/traffic/branches/UserFiber/src/UF.C (original)
+++ trafficserver/traffic/branches/UserFiber/src/UF.C Thu May 13 18:25:12 2010
@@ -152,6 +152,7 @@ UFScheduler::UFScheduler()
     _notifyArgs = 0;
 
     pthread_setspecific(_specific_key, this);
+    _amtToSleep = 0;
 }
 
 UFScheduler::~UFScheduler()
@@ -252,7 +253,7 @@ void UFScheduler::runScheduler()
 {
     errno = 0;
 
-    unsigned long long int amtToSleep = DEFAULT_SLEEP_IN_USEC;
+    _amtToSleep = DEFAULT_SLEEP_IN_USEC;
     bool ranGetTimeOfDay = false;
     bool firstRun = true;
 
@@ -260,6 +261,7 @@ void UFScheduler::runScheduler()
     struct timeval now;
     struct timeval start,finish;
     gettimeofday(&start, 0);
+    unsigned long long int timeNow = 0;
 
     // Add connection pool cleanup fiber
     UFConnectionPoolCleaner *conn_pool_cleanup_fiber = new UFConnectionPoolCleaner;
@@ -323,14 +325,14 @@ void UFScheduler::runScheduler()
 
 
         ranGetTimeOfDay = false;
-        amtToSleep = DEFAULT_SLEEP_IN_USEC;
+        _amtToSleep = DEFAULT_SLEEP_IN_USEC;
         //pick up the fibers that may have completed sleeping
         //look into the sleep list;
         if(!_sleepList.empty())
         {
             gettimeofday(&now, 0);
             ranGetTimeOfDay = true;
-            unsigned long long int timeNow = (now.tv_sec*1000000)+now.tv_usec;
+            timeNow = (now.tv_sec*1000000)+now.tv_usec;
             firstRun = true;
             for(MapTimeUF::iterator beg = _sleepList.begin(); beg != _sleepList.end(); )
             {
@@ -338,7 +340,7 @@ void UFScheduler::runScheduler()
                 //1. see if anyone has crossed the sleep timer - add them to the active list
                 if(beg->first <= timeNow) //sleep time is over
                 {
-                    _activeRunningList.push_back(beg->second);
+                    _activeRunningList.push_front(beg->second);
                     _sleepList.erase(beg);
                     beg = _sleepList.begin();
                     continue;
@@ -346,7 +348,7 @@ void UFScheduler::runScheduler()
                 else
                 {
                     if(firstRun)
-                        amtToSleep = beg->first-timeNow;
+                        _amtToSleep = beg->first-timeNow;
                     break;
                 }
                 firstRun = false;
@@ -360,8 +362,8 @@ void UFScheduler::runScheduler()
             if(_inThreadedMode) //go to conditional wait (in threaded mode)
             {
                 struct timespec ts;
-                unsigned long long int nSecToIncrement = (int)(amtToSleep/1000000);
-                unsigned long long int nUSecToIncrement = (int)(amtToSleep%1000000);
+                unsigned long long int nSecToIncrement = (int)(_amtToSleep/1000000);
+                unsigned long long int nUSecToIncrement = (int)(_amtToSleep%1000000);
                 if(!ranGetTimeOfDay)
                     gettimeofday(&now, 0);
                 ts.tv_sec = now.tv_sec + nSecToIncrement;
@@ -373,7 +375,7 @@ void UFScheduler::runScheduler()
                 pthread_mutex_unlock(&_mutexToNominateToActiveList);
             }
             else //sleep in non-threaded mode
-                usleep(amtToSleep);
+                usleep(_amtToSleep);
         }
     }
     gettimeofday(&finish, 0);

Modified: trafficserver/traffic/branches/UserFiber/src/UFIO.C
URL: http://svn.apache.org/viewvc/trafficserver/traffic/branches/UserFiber/src/UFIO.C?rev=943969&r1=943968&r2=943969&view=diff
==============================================================================
--- trafficserver/traffic/branches/UserFiber/src/UFIO.C (original)
+++ trafficserver/traffic/branches/UserFiber/src/UFIO.C Thu May 13 18:25:12 2010
@@ -900,9 +900,15 @@ void EpollUFIOScheduler::waitForEvents(T
     IntUFIOMap::iterator index;
     UFIO* ufio = 0;
     UF* uf = 0;
-    unsigned int amtToSleep = timeToWait;
+    unsigned long long int amtToSleep = timeToWait;
     int i = 0;
     _interruptedByEventFd = false;
+    UFScheduler* ufs = _uf->getParentScheduler();
+    if(!ufs)
+    {
+        cerr<<"epoll scheduler has to be connected to some scheduler"<<endl;
+        return;
+    }
     while(1)
     {
         if(_interruptedByEventFd) //this is so that the last interruption gets handled right away
@@ -911,6 +917,8 @@ void EpollUFIOScheduler::waitForEvents(T
             _uf->yield();
         }
 
+        if(amtToSleep > ufs->getAmtToSleep())
+            amtToSleep = ufs->getAmtToSleep();
         nfds = ::epoll_wait(_epollFd, 
                             _epollEventStruct, 
                             _maxFds, 
@@ -930,7 +938,7 @@ void EpollUFIOScheduler::waitForEvents(T
                         exit(1);
                     }
                     //activate the fiber
-                    uf->getParentScheduler()->addFiberToScheduler(uf, 0);
+                    ufs->addFiberToScheduler(uf, 0);
                 }
                 else
                 {