-RPCHandle::RPCHandle(Category& log) : m_clnt(NULL), m_sock((RPCListener::ShibSocket)0), m_log(log)
-{
- m_log.debug("new RPCHandle created: %p", this);
-}
-
-RPCHandle::~RPCHandle()
-{
- m_log.debug("destroying RPC Handle: %p", this);
- disconnect();
-}
-
-void RPCHandle::disconnect(const RPCListener* listener)
-{
- if (m_clnt) {
- clnt_destroy(m_clnt);
- m_clnt=NULL;
- if (listener) {
- listener->close(m_sock);
- m_sock=(RPCListener::ShibSocket)0;
- }
- else {
-#ifdef WIN32
- ::closesocket(m_sock);
-#else
- ::close(m_sock);
-#endif
- m_sock=(RPCListener::ShibSocket)0;
- }
- }
-}
-
-CLIENT* RPCHandle::connect(const RPCListener* listener)
-{
-#ifdef _DEBUG
- saml::NDC ndc("connect");
-#endif
- if (m_clnt) {
- m_log.debug("returning existing connection: %p -> %p", this, m_clnt);
- return m_clnt;
- }
-
- m_log.debug("trying to connect to socket");
-
- RPCListener::ShibSocket sock;
- if (!listener->create(sock)) {
- m_log.error("cannot create socket");
- throw ListenerException("Cannot create socket");
- }
-
- bool connected = false;
- int num_tries = 3;
-
- for (int i = num_tries-1; i >= 0; i--) {
- if (listener->connect(sock)) {
- connected = true;
- break;
- }
-
- m_log.warn("cannot connect %p to socket...%s", this, (i > 0 ? "retrying" : ""));
-
- if (i) {
-#ifdef WIN32
- Sleep(2000*(num_tries-i));
-#else
- sleep(2*(num_tries-i));
-#endif
- }
- }
-
- if (!connected) {
- m_log.crit("socket server unavailable, failing");
- listener->close(sock);
- throw ListenerException("Cannot connect to listener process, a site adminstrator should be notified.");
- }
-
- CLIENT* clnt = (CLIENT*)listener->getClientHandle(sock, SHIBRPC_PROG, SHIBRPC_VERS_3);
- if (!clnt) {
- const char* rpcerror = clnt_spcreateerror("RPCHandle::connect");
- m_log.crit("RPC failed for %p: %s", this, rpcerror);
- listener->close(sock);
- throw ListenerException(rpcerror);
- }
-
- // Set the RPC timeout to a fairly high value...
- struct timeval tv;
- tv.tv_sec = 300; /* change timeout to 5 minutes */
- tv.tv_usec = 0; /* this should always be set */
- clnt_control(clnt, CLSET_TIMEOUT, (char*)&tv);
-
- m_clnt = clnt;
- m_sock = sock;
-
- m_log.debug("success: %p -> %p", this, m_clnt);
- return m_clnt;
-}
-
-RPCHandlePool::~RPCHandlePool()
-{
- while (!m_pool.empty()) {
- delete m_pool.top();
- m_pool.pop();
- }
-}
-
-RPCHandle* RPCHandlePool::get()
-{
- m_lock->lock();
- if (m_pool.empty()) {
- m_lock->unlock();
- return new RPCHandle(m_log);
- }
- RPCHandle* ret=m_pool.top();
- m_pool.pop();
- m_lock->unlock();
- return ret;
-}
-
-void RPCHandlePool::put(RPCHandle* handle)
-{
- m_lock->lock();
- m_pool.push(handle);
- m_lock->unlock();
-}
-
-RPC::RPC(RPCHandlePool& pool) : m_pool(pool)
-{
- m_handle=m_pool.get();
-}
-