X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=shibsp%2Fremoting%2Fimpl%2FSocketListener.cpp;h=8951175ae44ecce02588773db281bedc9307a2bb;hb=c51bfd77603cf0ddb0b5e374c35586a8435895d6;hp=2560c53e79aafddac80ffee11f70a9b05ade7dc4;hpb=d4b309a04fc6454158dc18abccb2400afe4d268a;p=shibboleth%2Fcpp-sp.git diff --git a/shibsp/remoting/impl/SocketListener.cpp b/shibsp/remoting/impl/SocketListener.cpp index 2560c53..8951175 100644 --- a/shibsp/remoting/impl/SocketListener.cpp +++ b/shibsp/remoting/impl/SocketListener.cpp @@ -1,17 +1,21 @@ -/* - * Copyright 2001-2010 Internet2 +/** + * Licensed to the University Corporation for Advanced Internet + * Development, Inc. (UCAID) under one or more contributor license + * agreements. See the NOTICE file distributed with this work for + * additional information regarding copyright ownership. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * UCAID licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the + * License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, + * either express or implied. See the License for the specific + * language governing permissions and limitations under the License. */ /** @@ -64,7 +68,7 @@ namespace shibsp { Category& m_log; const SocketListener* m_listener; - auto_ptr m_lock; + boost::scoped_ptr m_lock; stack m_pool; }; @@ -156,23 +160,22 @@ SocketListener::ShibSocket SocketPool::get() void SocketPool::put(SocketListener::ShibSocket s) { - m_lock->lock(); + Lock lock(m_lock); m_pool.push(s); - m_lock->unlock(); } SocketListener::SocketListener(const DOMElement* e) - : m_catchAll(false), log(&Category::getInstance(SHIBSP_LOGCAT".Listener")), m_socketpool(nullptr), - m_shutdown(nullptr), m_child_lock(nullptr), m_child_wait(nullptr), m_stackSize(0), m_socket((ShibSocket)0) + : m_catchAll(false), log(&Category::getInstance(SHIBSP_LOGCAT ".Listener")), + m_shutdown(nullptr), m_stackSize(0), m_socket((ShibSocket)0) { // Are we a client? if (SPConfig::getConfig().isEnabled(SPConfig::InProcess)) { - m_socketpool=new SocketPool(*log,this); + m_socketpool.reset(new SocketPool(*log,this)); } // Are we a server? if (SPConfig::getConfig().isEnabled(SPConfig::OutOfProcess)) { - m_child_lock = Mutex::create(); - m_child_wait = CondWait::create(); + m_child_lock.reset(Mutex::create()); + m_child_wait.reset(CondWait::create()); static const XMLCh stackSize[] = UNICODE_LITERAL_9(s,t,a,c,k,S,i,z,e); m_stackSize = XMLHelper::getAttrInt(e, 0, stackSize) * 1024; @@ -181,9 +184,6 @@ SocketListener::SocketListener(const DOMElement* e) SocketListener::~SocketListener() { - delete m_socketpool; - delete m_child_wait; - delete m_child_lock; } bool SocketListener::init(bool force) @@ -221,7 +221,7 @@ bool SocketListener::run(bool* shutdown) NDC ndc("run"); #endif // Save flag to monitor for shutdown request. - m_shutdown=shutdown; + m_shutdown = shutdown; unsigned long count = 0; while (!*m_shutdown) { @@ -257,7 +257,7 @@ bool SocketListener::run(bool* shutdown) // We throw away the result because the children manage themselves... try { - new ServerThread(newsock,this,++count); + new ServerThread(newsock, this, ++count); } catch (exception& ex) { log->crit("exception starting new server thread to service incoming request: %s", ex.what()); @@ -275,7 +275,7 @@ bool SocketListener::run(bool* shutdown) // Wait for all children to exit. m_child_lock->lock(); while (!m_children.empty()) - m_child_wait->wait(m_child_lock); + m_child_wait->wait(m_child_lock.get()); m_child_lock->unlock(); return true; @@ -379,15 +379,17 @@ DDF SocketListener::send(const DDF& in) throw ListenerException("Remote call failed with an unparsable exception."); } - auto_ptr wrapper(except); + boost::scoped_ptr wrapper(except); wrapper->raise(); } return out; } -bool SocketListener::log_error() const +bool SocketListener::log_error(const char* fn) const { + if (!fn) + fn = "unknown"; #ifdef WIN32 int rc=WSAGetLastError(); #else @@ -397,10 +399,10 @@ bool SocketListener::log_error() const char buf[256]; memset(buf,0,sizeof(buf)); strerror_r(rc,buf,sizeof(buf)); - log->error("socket call resulted in error (%d): %s",rc,isprint(*buf) ? buf : "no message"); + log->error("socket call (%s) resulted in error (%d): %s",fn, rc, isprint(*buf) ? buf : "no message"); #else const char* buf=strerror(rc); - log->error("socket call resulted in error (%d): %s",rc,isprint(*buf) ? buf : "no message"); + log->error("socket call (%s) resulted in error (%d): %s", fn, rc, isprint(*buf) ? buf : "no message"); #endif return false; } @@ -453,8 +455,8 @@ void ServerThread::run() // Before starting up, make sure we fully "own" this socket. m_listener->m_child_lock->lock(); - while (m_listener->m_children.find(m_sock)!=m_listener->m_children.end()) - m_listener->m_child_wait->wait(m_listener->m_child_lock); + while (m_listener->m_children.find(m_sock) != m_listener->m_children.end()) + m_listener->m_child_wait->wait(m_listener->m_child_lock.get()); m_listener->m_children[m_sock] = m_child; m_listener->m_child_lock->unlock(); @@ -497,7 +499,7 @@ void ServerThread::run() int ServerThread::job() { - Category& log = Category::getInstance(SHIBSP_LOGCAT".Listener"); + Category& log = Category::getInstance(SHIBSP_LOGCAT ".Listener"); bool incomingError = true; // set false once incoming message is received ostringstream sink;