diff --git a/common/include/villas/utils.hpp b/common/include/villas/utils.hpp
index cd5d46ffe..45d320c6d 100644
--- a/common/include/villas/utils.hpp
+++ b/common/include/villas/utils.hpp
@@ -177,9 +177,6 @@ char * vstrcatf(char **dest, const char *fmt, va_list va)
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);
diff --git a/common/lib/CMakeLists.txt b/common/lib/CMakeLists.txt
index 3a59e654d..a359051a5 100644
--- a/common/lib/CMakeLists.txt
+++ b/common/lib/CMakeLists.txt
@@ -49,6 +49,10 @@ add_library(villas-common SHARED
popen.cpp
)
+if(CMAKE_CXX_COMPILER_ID STREQUAL GNU)
+ target_link_libraries(villas-common PUBLIC "-lstdc++fs")
+endif()
+
if(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")
target_sources(villas-common PRIVATE tsc.cpp)
endif()
diff --git a/common/lib/advio.cpp b/common/lib/advio.cpp
index a4a1cbe95..15e76ced4 100644
--- a/common/lib/advio.cpp
+++ b/common/lib/advio.cpp
@@ -22,6 +22,14 @@
* along with this program. If not, see .
*********************************************************************************/
+#if __GNUC__ <= 7 && !defined(__clang__)
+ #include
+ namespace fs = std::experimental::filesystem;
+#else
+ #include
+ namespace fs = std::filesystem;
+#endif
+
#include
#include
#include
@@ -198,10 +206,9 @@ int aislocal(const char *uri)
AFILE * afopen(const char *uri, const char *mode)
{
int ret;
- char *cwd;
const char *sep;
- AFILE *af = (AFILE *) alloc(sizeof(AFILE));
+ AFILE *af = new AFILE;
snprintf(af->mode, sizeof(af->mode), "%s", mode);
@@ -216,13 +223,8 @@ AFILE * afopen(const char *uri, const char *mode)
return nullptr;
/* Handle relative paths */
- if (uri[0] != '/') {
- cwd = getcwd(nullptr, 0);
-
- af->uri = strf("file://%s/%s", cwd, uri);
-
- free(cwd);
- }
+ if (uri[0] != '/')
+ af->uri = strf("file://%s/%s", fs::current_path().c_str(), uri);
else
af->uri = strf("file://%s", uri);
}
@@ -264,7 +266,8 @@ AFILE * afopen(const char *uri, const char *mode)
out0: curl_easy_cleanup(af->curl);
out1: fclose(af->file);
out2: free(af->uri);
- free(af);
+
+ delete af;
return nullptr;
}
@@ -284,7 +287,8 @@ int afclose(AFILE *af)
return ret;
free(af->uri);
- free(af);
+
+ delete af;
return 0;
}
diff --git a/common/lib/buffer.cpp b/common/lib/buffer.cpp
index a955dd056..149408df6 100644
--- a/common/lib/buffer.cpp
+++ b/common/lib/buffer.cpp
@@ -30,7 +30,7 @@ int buffer_init(struct buffer *b, size_t size)
{
b->len = 0;
b->size = size;
- b->buf = (char *) malloc(size);
+ b->buf = new char[size];
if (!b->buf)
return -1;
@@ -42,7 +42,7 @@ int buffer_init(struct buffer *b, size_t size)
int buffer_destroy(struct buffer *b)
{
if (b->buf)
- free(b->buf);
+ delete[] b->buf;
b->state = State::DESTROYED;
diff --git a/common/lib/hist.cpp b/common/lib/hist.cpp
index d6ccea6f3..d0f004190 100644
--- a/common/lib/hist.cpp
+++ b/common/lib/hist.cpp
@@ -143,7 +143,7 @@ void Hist::print(bool details) const
info("Stddev: %g", getStddev());
if (details && total - higher - lower > 0) {
- char *buf =dump();
+ char *buf = dump();
info("Matlab: %s", buf);
free(buf);
@@ -187,7 +187,7 @@ void Hist::plot() const
char * Hist::dump() const
{
- char *buf = (char *) alloc(128);
+ char *buf = new char[128];
strcatf(&buf, "[ ");
diff --git a/common/lib/kernel/pci.cpp b/common/lib/kernel/pci.cpp
index 0d627b207..bda24a42b 100644
--- a/common/lib/kernel/pci.cpp
+++ b/common/lib/kernel/pci.cpp
@@ -57,7 +57,7 @@ int pci_init(struct pci *p)
(strcmp(e->d_name, "..") == 0) )
continue;
- struct pci_device *d = (struct pci_device *) alloc(sizeof(struct pci_device));
+ struct pci_device *d = new struct pci_device;
struct { const char *s; int *p; } map[] = {
{ "vendor", &d->id.vendor },
@@ -227,8 +227,7 @@ int pci_device_parse_id(struct pci_device *f, const char *str, const char **erro
return 0;
-fail:
- free(tmp);
+fail: free(tmp);
return -1;
}
@@ -314,9 +313,8 @@ size_t pci_get_regions(const struct pci_device *d, struct pci_region** regions)
}
if (valid_regions > 0) {
- const size_t len = valid_regions * sizeof (struct pci_region);
- *regions = (struct pci_region *) malloc(len);
- memcpy(*regions, _regions, len);
+ *regions = new struct pci_region[valid_regions];
+ memcpy(*regions, _regions, valid_regions * sizeof (struct pci_region));
}
return valid_regions;
diff --git a/common/lib/kernel/vfio.cpp b/common/lib/kernel/vfio.cpp
index ceb327e45..c94671c73 100644
--- a/common/lib/kernel/vfio.cpp
+++ b/common/lib/kernel/vfio.cpp
@@ -579,7 +579,7 @@ VfioDevice::pciHotReset()
const size_t reset_infolen = sizeof(struct vfio_pci_hot_reset_info) +
sizeof(struct vfio_pci_dependent_device) * 64;
- auto reset_info = reinterpret_cast
+ auto reset_info = reinterpret_cast
(calloc(1, reset_infolen));
reset_info->argsz = reset_infolen;
diff --git a/common/lib/kernel/vfio_legacy.cpp b/common/lib/kernel/vfio_legacy.cpp
index 6e143fb32..d487864f3 100644
--- a/common/lib/kernel/vfio_legacy.cpp
+++ b/common/lib/kernel/vfio_legacy.cpp
@@ -117,7 +117,7 @@ int vfio_device_destroy(struct vfio_device *d)
debug(5, "VFIO: closed device: name=%s, fd=%d", d->name, d->fd);
- free(d->mappings);
+ delete[] d->mappings;
free(d->name);
return 0;
@@ -252,7 +252,7 @@ int vfio_device_attach(struct vfio_device *d, struct vfio_container *c, const ch
}
if (!g) {
- g = alloc(sizeof(struct vfio_group));
+ g = new struct vfio_group;
/* Aquire group ownership */
ret = vfio_group_attach(g, c, index);
@@ -277,9 +277,9 @@ int vfio_device_attach(struct vfio_device *d, struct vfio_container *c, const ch
if (ret < 0)
serror("Failed to get VFIO device info for: %s", d->name);
- d->irqs = alloc(d->info.num_irqs * sizeof(struct vfio_irq_info));
- d->regions = alloc(d->info.num_regions * sizeof(struct vfio_region_info));
- d->mappings = alloc(d->info.num_regions * sizeof(void *));
+ d->irqs = new struct vfio_irq_info[d->info.num_irqs];
+ d->regions = new struct vfio_region_info[d->info.num_regions];
+ d->mappings = new void *[d->info.num_regions];
/* Get device regions */
for (int i = 0; i < d->info.num_regions && i < 8; i++) {
@@ -321,8 +321,8 @@ int vfio_pci_reset(struct vfio_device *d)
size_t reset_infolen = sizeof(struct vfio_pci_hot_reset_info) + sizeof(struct vfio_pci_dependent_device) * 64;
size_t resetlen = sizeof(struct vfio_pci_hot_reset) + sizeof(int32_t) * 1;
- struct vfio_pci_hot_reset_info *reset_info = (struct vfio_pci_hot_reset_info *) alloc(reset_infolen);
- struct vfio_pci_hot_reset *reset = (struct vfio_pci_hot_reset *) alloc(resetlen);
+ struct vfio_pci_hot_reset_info *reset_info = new char[reset_infolen];
+ struct vfio_pci_hot_reset *reset = new char[resetlen];
reset_info->argsz = reset_infolen;
reset->argsz = resetlen;
@@ -400,7 +400,7 @@ int vfio_pci_msi_deinit(struct vfio_device *d, int efds[32])
return -1;
irq_setlen = sizeof(struct vfio_irq_set) + sizeof(int) * irq_count;
- irq_set = alloc(irq_setlen);
+ irq_set = new char[irq_setlen];
irq_set->argsz = irq_setlen;
irq_set->flags = VFIO_IRQ_SET_DATA_EVENTFD | VFIO_IRQ_SET_ACTION_TRIGGER;
@@ -434,7 +434,7 @@ int vfio_pci_msi_init(struct vfio_device *d, int efds[32])
return -1;
irq_setlen = sizeof(struct vfio_irq_set) + sizeof(int) * irq_count;
- irq_set = alloc(irq_setlen);
+ irq_set = new char[irq_setlen];
irq_set->argsz = irq_setlen;
irq_set->flags = VFIO_IRQ_SET_DATA_EVENTFD | VFIO_IRQ_SET_ACTION_TRIGGER;
diff --git a/common/lib/utils.cpp b/common/lib/utils.cpp
index b23a1a917..6ce59b170 100644
--- a/common/lib/utils.cpp
+++ b/common/lib/utils.cpp
@@ -212,17 +212,6 @@ double randf()
return (double) random() / RAND_MAX;
}
-void * alloc(size_t bytes)
-{
- void *p = malloc(bytes);
- if (!p)
- error("Failed to allocate memory");
-
- memset(p, 0, bytes);
-
- return p;
-}
-
char * vstrcatf(char **dest, const char *fmt, va_list ap)
{
char *tmp;
@@ -271,7 +260,7 @@ char * vstrf(const char *fmt, va_list va)
void * memdup(const void *src, size_t bytes)
{
- void *dst = alloc(bytes);
+ void *dst = new char[bytes];
memcpy(dst, src, bytes);