// vi:set ft=cpp: -*- Mode: C++ -*-
/**
 * \file
 * \brief IPC helper
 */
/*
 * (c) 2008-2009 Adam Lackorzynski <adam@os.inf.tu-dresden.de>,
 *               Alexander Warg <warg@os.inf.tu-dresden.de>
 *     economic rights: Technische Universität Dresden (Germany)
 *
 * This file is part of TUD:OS and distributed under the terms of the
 * GNU General Public License 2.
 * Please see the COPYING-GPL-2 file for details.
 *
 * As a special exception, you may use this file as part of a free software
 * library without restriction.  Specifically, if other files instantiate
 * templates or use macros or inline functions from this file, or you compile
 * this file and link it with other files to produce an executable, this
 * file does not by itself cause the resulting executable to be covered by
 * the GNU General Public License.  This exception does not however
 * invalidate any other reasons why the executable file might be covered by
 * the GNU General Public License.
 */
#pragma once

#include <l4/cxx/exceptions>
#include <l4/sys/utcb.h>

namespace L4
{
#ifdef __EXCEPTIONS
  /**
   * \brief Throw an L4 IPC error as exception.
   *
   * \ingroup helper
   * \param o    The client side object, for which the IPC was invoked.
   * \param err  The IPC result code (error code).
   * \utcb{utcb}
   */
  inline void
  throw_ipc_exception(L4::Cap<void> const &o, l4_msgtag_t const &err,
                      l4_utcb_t *utcb)
  {
    (void)o;
    if (err.has_error())
      throw (L4::Com_error(l4_error_u(err, utcb)));
  }

  /**
   * \brief Throw an L4 IPC error as exception.
   *
   * \ingroup helper
   * \param o    The client side object, for which the IPC was invoked.
   * \param err  The IPC result code (error code).
   * \utcb{utcb}
   */
  inline void
  throw_ipc_exception(void const *o, l4_msgtag_t const &err,
                      l4_utcb_t *utcb)
  { throw_ipc_exception(L4::Cap<void>(o), err, utcb); }
#endif

}
