X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Finclude%2Fgnunet_common.h;h=08c1f96c98bcf4e31012a69d332e5b48aafa5bd1;hb=83b19539f4d322b43683f5838b72e9ec2c8e6073;hp=b8a667524c6b08e8a9115c38002514204914a549;hpb=cddbdf5b928c68ab71b40c950b9f01ea68a9fbdb;p=oweals%2Fgnunet.git diff --git a/src/include/gnunet_common.h b/src/include/gnunet_common.h index b8a667524..08c1f96c9 100644 --- a/src/include/gnunet_common.h +++ b/src/include/gnunet_common.h @@ -49,7 +49,7 @@ /** * Version of the API (for entire gnunetutil.so library). */ -#define GNUNET_UTIL_VERSION 0x00089900 +#define GNUNET_UTIL_VERSION 0x00089990 /** * Name used for "services" that are actually command-line @@ -138,6 +138,7 @@ typedef int (*GNUNET_FileNameCallback) (void *cls, const char *filename); */ enum GNUNET_ErrorType { + GNUNET_ERROR_TYPE_UNSPECIFIED = -1, GNUNET_ERROR_TYPE_NONE = 0, GNUNET_ERROR_TYPE_ERROR = 1, GNUNET_ERROR_TYPE_WARNING = 2, @@ -161,6 +162,17 @@ typedef void (*GNUNET_Logger) (void *cls, enum GNUNET_ErrorType kind, const char *component, const char *date, const char *message); + +/** + * Number of log calls to ignore. + */ +extern unsigned int skip_log; + +#if !defined(GNUNET_CULL_LOGGING) +int +GNUNET_get_log_call_status (int caller_level, const char *comp, + const char *file, const char *function, int line); +#endif /** * Main log function. * @@ -169,9 +181,29 @@ typedef void (*GNUNET_Logger) (void *cls, enum GNUNET_ErrorType kind, * @param ... arguments for format string */ void -GNUNET_log (enum GNUNET_ErrorType kind, const char *message, ...); - +GNUNET_log_nocheck (enum GNUNET_ErrorType kind, const char *message, ...); + +/* from glib */ +#if defined(__GNUC__) && (__GNUC__ > 2) && defined(__OPTIMIZE__) +#define _GNUNET_BOOLEAN_EXPR(expr) \ + __extension__ ({ \ + int _gnunet_boolean_var_; \ + if (expr) \ + _gnunet_boolean_var_ = 1; \ + else \ + _gnunet_boolean_var_ = 0; \ + _gnunet_boolean_var_; \ +}) +#define GN_LIKELY(expr) (__builtin_expect (_GNUNET_BOOLEAN_EXPR(expr), 1)) +#define GN_UNLIKELY(expr) (__builtin_expect (_GNUNET_BOOLEAN_EXPR(expr), 0)) +#else +#define GN_LIKELY(expr) (expr) +#define GN_UNLIKELY(expr) (expr) +#endif +#if !defined(GNUNET_LOG_CALL_STATUS) +#define GNUNET_LOG_CALL_STATUS -1 +#endif /** * Log function that specifies an alternative component. @@ -183,9 +215,35 @@ GNUNET_log (enum GNUNET_ErrorType kind, const char *message, ...); * @param ... arguments for format string */ void -GNUNET_log_from (enum GNUNET_ErrorType kind, const char *comp, - const char *message, ...); - +GNUNET_log_from_nocheck (enum GNUNET_ErrorType kind, const char *comp, + const char *message, ...); + +#if !defined(GNUNET_CULL_LOGGING) +#define GNUNET_log_from(kind,comp,...) do { int log_line = __LINE__;\ + static int log_call_enabled = GNUNET_LOG_CALL_STATUS;\ + if (GN_UNLIKELY(log_call_enabled == -1))\ + log_call_enabled = GNUNET_get_log_call_status ((kind) & (~GNUNET_ERROR_TYPE_BULK), comp, __FILE__, __FUNCTION__, log_line);\ + if (GN_UNLIKELY(skip_log > 0)) {skip_log--;}\ + else {\ + if (GN_UNLIKELY(log_call_enabled))\ + GNUNET_log_from_nocheck (kind, comp, __VA_ARGS__);\ + }\ +} while (0) + +#define GNUNET_log(kind,...) do { int log_line = __LINE__;\ + static int log_call_enabled = GNUNET_LOG_CALL_STATUS;\ + if (GN_UNLIKELY(log_call_enabled == -1))\ + log_call_enabled = GNUNET_get_log_call_status ((kind) & (~GNUNET_ERROR_TYPE_BULK), NULL, __FILE__, __FUNCTION__, log_line);\ + if (GN_UNLIKELY(skip_log > 0)) {skip_log--;}\ + else {\ + if (GN_UNLIKELY(log_call_enabled))\ + GNUNET_log_nocheck (kind, __VA_ARGS__);\ + }\ +} while (0) +#else +#define GNUNET_log(...) +#define GNUNET_log_from(...) +#endif /** * Ignore the next n calls to the log function. @@ -323,6 +381,13 @@ GNUNET_error_type_to_string (enum GNUNET_ErrorType kind); */ #define GNUNET_log_strerror(level, cmd) do { GNUNET_log(level, _("`%s' failed at %s:%d with error: %s\n"), cmd, __FILE__, __LINE__, STRERROR(errno)); } while(0) +/** + * Log an error message at log-level 'level' that indicates + * a failure of the command 'cmd' with the message given + * by strerror(errno). + */ +#define GNUNET_log_from_strerror(level, component, cmd) do { GNUNET_log_from (level, component, _("`%s' failed at %s:%d with error: %s\n"), cmd, __FILE__, __LINE__, STRERROR(errno)); } while(0) + /** * Log an error message at log-level 'level' that indicates * a failure of the command 'cmd' with the message given @@ -330,6 +395,13 @@ GNUNET_error_type_to_string (enum GNUNET_ErrorType kind); */ #define GNUNET_log_strerror_file(level, cmd, filename) do { GNUNET_log(level, _("`%s' failed on file `%s' at %s:%d with error: %s\n"), cmd, filename,__FILE__, __LINE__, STRERROR(errno)); } while(0) +/** + * Log an error message at log-level 'level' that indicates + * a failure of the command 'cmd' with the message given + * by strerror(errno). + */ +#define GNUNET_log_from_strerror_file(level, component, cmd, filename) do { GNUNET_log_from (level, component, _("`%s' failed on file `%s' at %s:%d with error: %s\n"), cmd, filename,__FILE__, __LINE__, STRERROR(errno)); } while(0) + /* ************************* endianess conversion ****************** */ /** @@ -428,7 +500,7 @@ GNUNET_htonll (unsigned long long n); * @param length of the string to duplicate * @return a partial copy of the string including zero-termination */ -#define GNUNET_strndup(a,b) GNUNET_xstrndup_(a,b,__FILE__,__LINE__) +#define GNUNET_strndup(a,length) GNUNET_xstrndup_(a,length,__FILE__,__LINE__) /** * Grow a well-typed (!) array. This is a convenience @@ -513,7 +585,6 @@ void * GNUNET_xmalloc_ (size_t size, const char *filename, int linenumber); - /** * Allocate and initialize memory. Checks the return value, aborts if no more * memory is available. Don't use GNUNET_xmemdup_ directly. Use the @@ -577,8 +648,9 @@ GNUNET_xstrdup_ (const char *str, const char *filename, int linenumber); /** * Dup partially a string. Don't call GNUNET_xstrndup_ directly. Use the GNUNET_strndup macro. + * * @param str string to duplicate - * @param len lenght of the string to duplicate + * @param len length of the string to duplicate * @param filename where is this call being made (for debugging) * @param linenumber line where this call is being made (for debugging) * @return the duplicated string @@ -607,6 +679,14 @@ GNUNET_xgrow_ (void **old, size_t elementSize, unsigned int *oldCount, unsigned int newCount, const char *filename, int linenumber); +/** + * Create a copy of the given message. + * + * @param msg message to copy + * @return duplicate of the message + */ +struct GNUNET_MessageHeader * +GNUNET_copy_message (const struct GNUNET_MessageHeader *msg); #if __STDC_VERSION__ < 199901L