blocxx

AutoDescriptor.cpp

Go to the documentation of this file.
00001 /*******************************************************************************
00002 * Copyright (C) 2005, Quest Software, Inc. All rights reserved.
00003 * Copyright (C) 2006, Novell, Inc. All rights reserved.
00004 * 
00005 * Redistribution and use in source and binary forms, with or without
00006 * modification, are permitted provided that the following conditions are met:
00007 * 
00008 *     * Redistributions of source code must retain the above copyright notice,
00009 *       this list of conditions and the following disclaimer.
00010 *     * Redistributions in binary form must reproduce the above copyright
00011 *       notice, this list of conditions and the following disclaimer in the
00012 *       documentation and/or other materials provided with the distribution.
00013 *     * Neither the name of 
00014 *       Quest Software, Inc., 
00015 *       nor Novell, Inc., 
00016 *       nor the names of its contributors or employees may be used to 
00017 *       endorse or promote products derived from this software without 
00018 *       specific prior written permission.
00019 * 
00020 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
00021 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00022 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
00023 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
00024 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
00025 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
00026 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
00027 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
00028 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
00029 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
00030 * POSSIBILITY OF SUCH DAMAGE.
00031 *******************************************************************************/
00032 
00033 
00038 #include "blocxx/AutoDescriptor.hpp"
00039 #include "blocxx/System.hpp"
00040 
00041 #if !defined(BLOCXX_NO_EXCEPTIONS)
00042 #include "blocxx/Logger.hpp"
00043 #include "blocxx/Format.hpp"
00044 #endif
00045 
00046 #ifdef BLOCXX_HAVE_UNISTD_H
00047 #include <unistd.h>
00048 #endif
00049 
00050 #ifdef BLOCXX_WIN32
00051 #include <io.h>
00052 #endif
00053 
00054 #include <cerrno>
00055 
00056 namespace BLOCXX_NAMESPACE
00057 {
00058 void AutoDescriptorPolicy::free(handle_type h)
00059 {
00060 #if defined(BLOCXX_WIN32)
00061    if (h != BLOCXX_INVALID_HANDLE)
00062    {
00063       if (!CloseHandle(h))
00064       {
00065 #if !defined(BLOCXX_NO_EXCEPTIONS)
00066          String msg; 
00067          System::lastErrorMsg("Closing handle", msg);
00068 
00069          Logger lgr("blocxx");
00070          BLOCXX_LOG_ERROR(lgr, msg);
00071 #else
00072          // We can't do any logging without the possibility of throwing an exception.
00073 #endif /* !defined(BLOCXX_NO_EXCEPTIONS) */
00074       }
00075    }
00076 #else
00077    if (h >= 0)
00078    {
00079       int rc = 0;
00080       do
00081       {
00082          rc = ::close(h);
00083       } while (rc < 0 && errno == EINTR);
00084 
00085       if (rc == -1)
00086       {
00087 #if !defined(BLOCXX_NO_EXCEPTIONS)
00088          int lerrno = errno;
00089          Logger lgr("blocxx");
00090          BLOCXX_LOG_ERROR(lgr, Format("Closing handle %1 failed: %2", h, lerrno));
00091 #else
00092          // We can't do any logging without the possibility of throwing an exception.
00093 #endif /* !defined(BLOCXX_NO_EXCEPTIONS) */
00094       }
00095    }
00096 #endif /* defined(BLOCXX_WIN32) */
00097 }
00098 }