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
{