| #ifndef __dispatch_error_h__ |
| #define __dispatch_error_h__ 1 |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF 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 |
| * |
| * 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. |
| */ |
| |
| #include <qpid/dispatch/enum.h> |
| |
| /** @file |
| * Thread-safe error handling mechansim for dispatch. |
| * |
| * Functions that detect an error should return qd_error_t. |
| * |
| * Implementation of such functions should first call qd_error_clear() |
| * to clear any previous error and on detecting an error do: |
| * return qd_error(code, "printf format", ...) |
| * |
| * The caller can check the error code and message with |
| * qd_error_code() and qd_error_message(). |
| * |
| * |
| */ |
| // NOTE: If you modify this enum, you must update error_names in error.c |
| typedef enum { |
| QD_ERROR_NONE, |
| QD_ERROR_NOT_FOUND, |
| QD_ERROR_ALREADY_EXISTS, |
| QD_ERROR_ALLOC, |
| QD_ERROR_MESSAGE, ///< Error parsing a message. |
| QD_ERROR_PYTHON, ///< Error from python code. |
| QD_ERROR_CONFIG, ///< Error in configuration |
| QD_ERROR_TYPE, ///< Value of inappropriate type. |
| QD_ERROR_VALUE, ///< Invalid value. |
| QD_ERROR_RUNTIME, ///< Run-time failure. |
| QD_ERROR_SYSTEM ///< System error from errno |
| } qd_error_t; |
| ENUM_DECLARE(qd_error); |
| |
| /** |
| * Store thread-local error code and message. |
| *@param code Error code. If 0 this is equivalent to calling qd_error_clear() |
| *@param ... printf-stlye format and arguments. |
| *@return code |
| */ |
| #define qd_error(code, ...) qd_error_impl(code, __FILE__, __LINE__, __VA_ARGS__) |
| |
| qd_error_t qd_error_impl(qd_error_t code, const char *file, int line, const char *fmt, ...); |
| |
| /** |
| * Clear thread-local error code and message. |
| *@return QD_ERROR_NONE |
| */ |
| qd_error_t qd_error_clear(); |
| |
| /** |
| * @return Thread local error message. Includes text for error code. |
| */ |
| const char* qd_error_message(); |
| |
| /** |
| *@return Thread local error code |
| */ |
| qd_error_t qd_error_code(); |
| |
| /** Maximum length of a qd_error_message, useful for temporary buffers. */ |
| extern const int QD_ERROR_MAX; |
| |
| /** |
| * Check for a python error. |
| * |
| * If there is a python error, call qd_error(QD_ERROR_PYTHON, <python-msg>), |
| * clear the python error indicator, log the python error and stack trace and |
| * return QD_ERROR_PYTHON. |
| * |
| * If there is no python error, call qd_error_clear() and return QD_ERROR_NONE. |
| * |
| * @return QD_ERROR_PYTHON or QD_ERROR_NONE. |
| */ |
| #define qd_error_py() qd_error_py_impl(__FILE__, __LINE__) |
| |
| qd_error_t qd_error_py_impl(const char *file, int line); |
| |
| #define QD_ERROR_RET() do { if (qd_error_code()) return qd_error_code(); } while(0) |
| #define QD_ERROR_BREAK() if (qd_error_code()) break; |
| #define QD_ERROR_PY_RET() do { if (qd_error_py()) return qd_error_code(); } while(0) |
| |
| /** |
| * Check for an errno error. |
| * |
| * If errnum is non-0, set error code QD_ERROR_SYSTEM with a message including the errno text. |
| * Otherwise, call qd_error_clear() and return QD_ERROR_NONE. |
| */ |
| #define qd_error_errno(errnum, ...) qd_error_errno_impl(errnum, __FILE__, __LINE__, __VA_ARGS__) |
| |
| qd_error_t qd_error_errno_impl(int errnum, const char *file, int line, const char *fmt, ...); |
| |
| #endif |