Commit c7f7dedd authored by Steffen Vogel's avatar Steffen Vogel 🎅🏼

move utils.h to utils.hpp

parent a9121ca9
......@@ -23,7 +23,7 @@
#pragma once
#include <villas/utils.h>
#include <villas/utils.hpp>
namespace villas {
namespace dsp {
......
/** Various helper functions.
*
* @file
* @author Steffen Vogel <stvogel@eonerc.rwth-aachen.de>
* @copyright 2014-2019, Institute for Automation of Complex Power Systems, EONERC
* @license GNU General Public License (version 3)
*
* VILLAScommon
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*********************************************************************************/
#pragma once
#ifdef __cplusplus
extern "C" {
#endif
#include <stdlib.h>
#include <stdint.h>
#include <sched.h>
#include <assert.h>
#include <sys/types.h>
#include <signal.h>
#include <villas/config.h>
#include <villas/log.h>
#ifdef __GNUC__
#define LIKELY(x) __builtin_expect((x),1)
#define UNLIKELY(x) __builtin_expect((x),0)
#else
#define LIKELY(x) (x)
#define UNLIKELY(x) (x)
#endif
/* Some color escape codes for pretty log messages */
#define CLR(clr, str) "\e[" XSTR(clr) "m" str "\e[0m"
#define CLR_GRY(str) CLR(30, str) /**< Print str in gray */
#define CLR_RED(str) CLR(31, str) /**< Print str in red */
#define CLR_GRN(str) CLR(32, str) /**< Print str in green */
#define CLR_YEL(str) CLR(33, str) /**< Print str in yellow */
#define CLR_BLU(str) CLR(34, str) /**< Print str in blue */
#define CLR_MAG(str) CLR(35, str) /**< Print str in magenta */
#define CLR_CYN(str) CLR(36, str) /**< Print str in cyan */
#define CLR_WHT(str) CLR(37, str) /**< Print str in white */
#define CLR_BLD(str) CLR( 1, str) /**< Print str in bold */
/* CPP stringification */
#define XSTR(x) STR(x)
#define STR(x) #x
#define CONCAT_DETAIL(x, y) x##y
#define CONCAT(x, y) CONCAT_DETAIL(x, y)
#define UNIQUE(x) CONCAT(x, __COUNTER__)
#ifdef ALIGN
#undef ALIGN
#endif
#define ALIGN(x, a) ALIGN_MASK(x, (uintptr_t) (a) - 1)
#define ALIGN_MASK(x, m) (((uintptr_t) (x) + (m)) & ~(m))
#define IS_ALIGNED(x, a) (ALIGN(x, a) == (uintptr_t) x)
#ifdef __cplusplus
#define SWAP(x,y) do {\
auto &_x = x; \
auto &_y = y; \
x = _y; \
y = _x; \
} while(0)
#else
#define SWAP(x,y) do {\
__auto_type _x = x; \
__auto_type _y = y; \
x = _y; \
y = _x; \
} while(0)
#endif
/** Round-up integer division */
#define CEIL(x, y) (((x) + (y) - 1) / (y))
/** Get nearest up-rounded power of 2 */
#define LOG2_CEIL(x) (1 << (log2i((x) - 1) + 1))
/** Check if the number is a power of 2 */
#define IS_POW2(x) (((x) != 0) && !((x) & ((x) - 1)))
/** Calculate the number of elements in an array. */
#define ARRAY_LEN(a) ( sizeof (a) / sizeof (a)[0] )
/* Return the bigger value */
#ifdef MAX
#undef MAX
#endif
#define MAX(a, b) ({ __typeof__ (a) _a = (a); \
__typeof__ (b) _b = (b); \
_a > _b ? _a : _b; })
/* Return the smaller value */
#ifdef MIN
#undef MIN
#endif
#define MIN(a, b) ({ __typeof__ (a) _a = (a); \
__typeof__ (b) _b = (b); \
_a < _b ? _a : _b; })
#ifndef offsetof
#define offsetof(type, member) __builtin_offsetof(type, member)
#endif
#ifndef container_of
#define container_of(ptr, type, member) ({ const typeof( ((type *) 0)->member ) *__mptr = (ptr); \
(type *) ( (char *) __mptr - offsetof(type, member) ); \
})
#endif
#define BITS_PER_LONGLONG (sizeof(long long) * 8)
/* Some helper macros */
#define BITMASK(h, l) (((~0ULL) << (l)) & (~0ULL >> (BITS_PER_LONGLONG - 1 - (h))))
#define BIT(nr) (1UL << (nr))
/** Normal random variate generator using the Box-Muller method
*
* @param m Mean
* @param s Standard deviation
* @return Normal variate random variable (Gaussian)
*/
double box_muller(float m, float s);
/** Double precission uniform random variable */
double randf();
/** Concat formatted string to an existing string.
*
* This function uses realloc() to resize the destination.
* Please make sure to only on dynamic allocated destionations!!!
*
* @param dest A pointer to a malloc() allocated memory region
* @param fmt A format string like for printf()
* @param ... Optional parameters like for printf()
* @retval The the new value of the dest buffer.
*/
char * strcatf(char **dest, const char *fmt, ...)
__attribute__ ((format(printf, 2, 3)));
/** Variadic version of strcatf() */
char * vstrcatf(char **dest, const char *fmt, va_list va)
__attribute__ ((format(printf, 2, 0)));
char * strf(const char *fmt, ...);
char * vstrf(const char *fmt, va_list va);
/** Allocate and initialize memory. */
void * alloc(size_t bytes);
/** Allocate and copy memory. */
void * memdup(const void *src, size_t bytes);
/** Call quit() in the main thread. */
void die();
/** Check assertion and exit if failed. */
#ifndef assert
#define assert(exp) do { \
if (!EXPECT(exp, 0)) \
error("Assertion failed: '%s' in %s(), %s:%d", \
XSTR(exp), __FUNCTION__, __BASE_FILE__, __LINE__); \
} while (0)
#endif
/** Get log2 of long long integers */
static inline int log2i(long long x) {
if (x == 0)
return 1;
return sizeof(x) * 8 - __builtin_clzll(x) - 1;
}
/** Send signal \p sig to main thread. */
void killme(int sig);
pid_t spawn(const char *name, char *const argv[]);
/** Determines the string length as printed on the screen (ignores escable sequences). */
size_t strlenp(const char *str);
#ifdef __cplusplus
}
#endif
......@@ -29,18 +29,111 @@
#include <signal.h>
#include <stdlib.h>
#include <stdint.h>
#include <sched.h>
#include <assert.h>
#include <sys/types.h>
#include <signal.h>
#include <villas/config.h>
#include <villas/log.h>
#ifdef __GNUC__
#define LIKELY(x) __builtin_expect((x),1)
#define UNLIKELY(x) __builtin_expect((x),0)
#else
#define LIKELY(x) (x)
#define UNLIKELY(x) (x)
#endif
/** Check assertion and exit if failed. */
#ifndef assert
#define assert(exp) do { \
if (!EXPECT(exp, 0)) \
error("Assertion failed: '%s' in %s(), %s:%d", \
XSTR(exp), __FUNCTION__, __BASE_FILE__, __LINE__); \
} while (0)
#endif
/* CPP stringification */
#define XSTR(x) STR(x)
#define STR(x) #x
#define CONCAT_DETAIL(x, y) x##y
#define CONCAT(x, y) CONCAT_DETAIL(x, y)
#define UNIQUE(x) CONCAT(x, __COUNTER__)
#ifdef ALIGN
#undef ALIGN
#endif
#define ALIGN(x, a) ALIGN_MASK(x, (uintptr_t) (a) - 1)
#define ALIGN_MASK(x, m) (((uintptr_t) (x) + (m)) & ~(m))
#define IS_ALIGNED(x, a) (ALIGN(x, a) == (uintptr_t) x)
#define SWAP(x,y) do { \
auto &_x = x; \
auto &_y = y; \
x = _y; \
y = _x; \
} while(0)
/** Round-up integer division */
#define CEIL(x, y) (((x) + (y) - 1) / (y))
/** Get nearest up-rounded power of 2 */
#define LOG2_CEIL(x) (1 << (log2i((x) - 1) + 1))
/** Check if the number is a power of 2 */
#define IS_POW2(x) (((x) != 0) && !((x) & ((x) - 1)))
/** Calculate the number of elements in an array. */
#define ARRAY_LEN(a) ( sizeof (a) / sizeof (a)[0] )
/* Return the bigger value */
#ifdef MAX
#undef MAX
#endif
#define MAX(a, b) ({ __typeof__ (a) _a = (a); \
__typeof__ (b) _b = (b); \
_a > _b ? _a : _b; })
/* Return the smaller value */
#ifdef MIN
#undef MIN
#endif
#define MIN(a, b) ({ __typeof__ (a) _a = (a); \
__typeof__ (b) _b = (b); \
_a < _b ? _a : _b; })
#ifndef offsetof
#define offsetof(type, member) __builtin_offsetof(type, member)
#endif
#ifndef container_of
#define container_of(ptr, type, member) ({ const typeof( ((type *) 0)->member ) *__mptr = (ptr); \
(type *) ( (char *) __mptr - offsetof(type, member) ); \
})
#endif
#define BITS_PER_LONGLONG (sizeof(long long) * 8)
/* Some helper macros */
#define BITMASK(h, l) (((~0ULL) << (l)) & (~0ULL >> (BITS_PER_LONGLONG - 1 - (h))))
#define BIT(nr) (1UL << (nr))
namespace villas {
namespace utils {
std::vector<std::string>
tokenize(std::string s, std::string delimiter);
template<typename T>
void
assertExcept(bool condition, const T& exception)
{
if(not condition)
if (not condition)
throw exception;
}
......@@ -53,6 +146,63 @@ ssize_t read_random(char *buf, size_t len);
/** Remove ANSI control sequences for colored output. */
char * decolor(char *str);
/** Normal random variate generator using the Box-Muller method
*
* @param m Mean
* @param s Standard deviation
* @return Normal variate random variable (Gaussian)
*/
double box_muller(float m, float s);
/** Double precission uniform random variable */
double randf();
/** Concat formatted string to an existing string.
*
* This function uses realloc() to resize the destination.
* Please make sure to only on dynamic allocated destionations!!!
*
* @param dest A pointer to a malloc() allocated memory region
* @param fmt A format string like for printf()
* @param ... Optional parameters like for printf()
* @retval The the new value of the dest buffer.
*/
char * strcatf(char **dest, const char *fmt, ...)
__attribute__ ((format(printf, 2, 3)));
/** Variadic version of strcatf() */
char * vstrcatf(char **dest, const char *fmt, va_list va)
__attribute__ ((format(printf, 2, 0)));
char * strf(const char *fmt, ...);
char * vstrf(const char *fmt, va_list va);
/** Allocate and initialize memory. */
void * alloc(size_t bytes);
/** Allocate and copy memory. */
void * memdup(const void *src, size_t bytes);
/** Call quit() in the main thread. */
void die();
/** Get log2 of long long integers */
static inline int log2i(long long x) {
if (x == 0)
return 1;
return sizeof(x) * 8 - __builtin_clzll(x) - 1;
}
/** Send signal \p sig to main thread. */
void killme(int sig);
pid_t spawn(const char *name, char *const argv[]);
/** Determines the string length as printed on the screen (ignores escable sequences). */
size_t strlenp(const char *str);
} // namespace utils
} // namespace villas
using namespace villas::utils;
......@@ -32,7 +32,7 @@
#include <curl/curl.h>
#include <villas/utils.h>
#include <villas/utils.hpp>
#include <villas/config.h>
#include <villas/advio.h>
#include <villas/crypt.h>
......
......@@ -27,7 +27,7 @@
#include <math.h>
#include <time.h>
#include <villas/utils.h>
#include <villas/utils.hpp>
#include <villas/hist.hpp>
#include <villas/config.h>
#include <villas/table.hpp>
......
......@@ -32,7 +32,7 @@
#include <sys/types.h>
#include <sys/wait.h>
#include <villas/utils.h>
#include <villas/utils.hpp>
#include <villas/config.h>
#include <villas/kernel/kernel.h>
......
......@@ -27,7 +27,7 @@
#include <linux/limits.h>
#include <villas/log.h>
#include <villas/utils.h>
#include <villas/utils.hpp>
#include <villas/config.h>
#include <villas/kernel/pci.h>
......
......@@ -26,7 +26,7 @@
#include <villas/log.hpp>
#include <villas/cpuset.hpp>
#include <villas/config.h>
#include <villas/utils.h>
#include <villas/utils.hpp>
#include <villas/exceptions.hpp>
#include <villas/kernel/kernel.h>
......
......@@ -14,7 +14,7 @@
#include <sys/ioctl.h>
#include <sys/eventfd.h>
#include <villas/utils.h>
#include <villas/utils.hpp>
#include <villas/log.h>
#include <villas/config.h>
#include <villas/kernel/kernel.h>
......
......@@ -26,7 +26,7 @@
#include <string.h>
#include <villas/list.h>
#include <villas/utils.h>
#include <villas/utils.hpp>
/* Compare functions */
static int cmp_lookup(const void *a, const void *b) {
......
......@@ -24,7 +24,7 @@
#include <cstdio>
#include <cerrno>
#include <villas/utils.h>
#include <villas/utils.hpp>
#include <villas/log.hpp>
#pragma GCC diagnostic push
......
......@@ -23,7 +23,7 @@
#include <stdlib.h>
#include <string.h>
#include <villas/utils.h>
#include <villas/utils.hpp>
#include <villas/table.hpp>
#include <villas/boxes.hpp>
#include <villas/log.h>
......
......@@ -24,7 +24,7 @@
#include <time.h>
#include <errno.h>
#include <villas/utils.h>
#include <villas/utils.hpp>
#include <villas/task.h>
#include <villas/timing.h>
......
......@@ -37,16 +37,16 @@
#include <fcntl.h>
#include <villas/config.h>
#include <villas/utils.h>
#include <villas/utils.hpp>
#include <villas/colors.hpp>
#include <villas/config.h>
#include <villas/log.hpp>
static pthread_t main_thread;
namespace villas {
namespace utils {
static pthread_t main_thread;
std::vector<std::string>
tokenize(std::string s, std::string delimiter)
{
......@@ -169,8 +169,6 @@ char * decolor(char *str)
return str;
}
extern "C" {
void killme(int sig)
{
/* Send only to main thread in case the ID was initilized by signals_init() */
......@@ -180,11 +178,6 @@ void killme(int sig)
kill(0, sig);
}
}
} /* namespace utils */
} /* namespace villas */
double box_muller(float m, float s)
{
double x1, x2, y1;
......@@ -217,14 +210,15 @@ double randf()
return (double) random() / RAND_MAX;
}
char * strcatf(char **dest, const char *fmt, ...)
void * alloc(size_t bytes)
{
va_list ap;
va_start(ap, fmt);
vstrcatf(dest, fmt, ap);
va_end(ap);
void *p = malloc(bytes);
if (!p)
error("Failed to allocate memory");
return *dest;
memset(p, 0, bytes);
return p;
}
char * vstrcatf(char **dest, const char *fmt, va_list ap)
......@@ -242,6 +236,16 @@ char * vstrcatf(char **dest, const char *fmt, va_list ap)
return *dest;
}
char * strcatf(char **dest, const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
vstrcatf(dest, fmt, ap);
va_end(ap);
return *dest;
}
char * strf(const char *fmt, ...)
{
char *buf = nullptr;
......@@ -263,17 +267,6 @@ char * vstrf(const char *fmt, va_list va)
return buf;
}
void * alloc(size_t bytes)
{
void *p = malloc(bytes);
if (!p)
error("Failed to allocate memory");
memset(p, 0, bytes);
return p;
}
void * memdup(const void *src, size_t bytes)
{
void *dst = alloc(bytes);
......@@ -334,3 +327,6 @@ size_t strlenp(const char *str)
return sz;
}
} /* namespace utils */
} /* namespace villas */
......@@ -24,7 +24,7 @@
#include <criterion/criterion.h>
#include <villas/utils.h>
#include <villas/utils.hpp>
#include <villas/utils.hpp>
#include <villas/advio.h>
......
......@@ -23,7 +23,7 @@
#include <criterion/criterion.h>
#include <villas/hist.hpp>
#include <villas/utils.h>
#include <villas/utils.hpp>
const double test_data[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
......
......@@ -24,7 +24,7 @@
#include <string.h>
#include <criterion/criterion.h>
#include <villas/utils.h>
#include <villas/utils.hpp>
#include <villas/list.h>
static const char *nouns[] = { "time", "person", "year", "way", "day", "thing", "man", "world", "life", "hand", "part", "child", "eye", "woman", "place", "work", "week", "case", "point", "government", "company", "number", "group", "problem", "fact" };
......
......@@ -22,7 +22,7 @@
#include <criterion/criterion.h>
#include <villas/utils.h>
#include <villas/utils.hpp>
#include <villas/tsc.h>
#include <villas/timing.h>
......
......@@ -23,7 +23,6 @@
#include <criterion/criterion.h>
#include <villas/crypt.h>
#include <villas/utils.h>
#include <villas/utils.hpp>
#include <villas/version.hpp>
#include <villas/cpuset.hpp>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment