From 2ef04bad714981349b54fea4af9a629bc0a20c18 Mon Sep 17 00:00:00 2001
From: Glauber Costa <glommer@cloudius-systems.com>
Date: Mon, 12 May 2014 16:06:36 +0400
Subject: [PATCH] shrinker: export to C

Export the shrinker interface to C users.

Signed-off-by: Glauber Costa <glommer@cloudius-systems.com>
Reviewed-by: Raphael S. Carvalho <raphaelsc@cloudius-systems.com>
Signed-off-by: Pekka Enberg <penberg@cloudius-systems.com>
---
 core/mempool.cc        |  7 +++++++
 include/osv/shrinker.h | 28 ++++++++++++++++++++++++++++
 2 files changed, 35 insertions(+)
 create mode 100644 include/osv/shrinker.h

diff --git a/core/mempool.cc b/core/mempool.cc
index 919a9a67c..04a1adb09 100644
--- a/core/mempool.cc
+++ b/core/mempool.cc
@@ -28,6 +28,7 @@
 #include <algorithm>
 #include <osv/prio.hh>
 #include <stdlib.h>
+#include <osv/shrinker.h>
 #include "java/jvm_balloon.hh"
 
 TRACEPOINT(trace_memory_malloc, "buf=%p, len=%d", void *, size_t);
@@ -629,6 +630,12 @@ shrinker::shrinker(std::string name)
     }
 }
 
+void *osv_register_shrinker(const char *name,
+                            size_t (*func)(size_t target, bool hard))
+{
+    return reinterpret_cast<void *>(new c_shrinker(name, func));
+}
+
 bool reclaimer_waiters::wake_waiters()
 {
     bool woken = false;
diff --git a/include/osv/shrinker.h b/include/osv/shrinker.h
new file mode 100644
index 000000000..bac7d242b
--- /dev/null
+++ b/include/osv/shrinker.h
@@ -0,0 +1,28 @@
+#ifndef SHRINKER_H_
+#define SHRINKER_H_
+
+#ifdef __cplusplus
+
+#include <osv/mempool.hh>
+
+class c_shrinker : public memory::shrinker {
+public:
+    explicit c_shrinker(const char *name,
+                        size_t (*func)(size_t target, bool hard)) :
+            memory::shrinker(name), _func(func) {}
+    size_t request_memory(size_t s, bool hard) { return _func(s, hard); }
+private:
+    size_t (*_func)(size_t target, bool hard);
+};
+
+
+extern "C"
+void *osv_register_shrinker(const char *name,
+                            size_t (*func)(size_t target, bool hard));
+#else
+#include <stdbool.h>
+void *osv_register_shrinker(const char *name,
+                            size_t (*func)(size_t target, bool hard));
+#endif
+
+#endif
-- 
GitLab