Linked<T> get(long timeout=0) { const long interval=1000; for(;;) { { CriticalBlock b(crit); typename std::vector<Linked<T> >::iterator it; for(it=resources.begin();it!=resources.end();it++) { if(it->get() == NULL) { Owned<T> e = factory->createResource(); if(e) { it->set(e.get()); return e; } } else if(!it->get()->IsShared()) { return *it; } } } long slp=timeout!=INFINITE && timeout<interval ? timeout : interval; if(slp<=0) break; long start=msTick(); long elapsed=sem.wait(slp) ? (msTick()-start) : slp; if(timeout!=INFINITE) timeout-=elapsed; } throw MakeStringException(1, "Run out of resources"); }