aboutsummaryrefslogtreecommitdiffstats
path: root/process.c
diff options
context:
space:
mode:
authorJean Boussier <byroot@ruby-lang.org>2022-10-19 16:56:37 +0200
committerJean Boussier <jean.boussier@gmail.com>2023-04-04 19:49:08 +0200
commitba6ccd871442f55080bffd53e33678c0726787d2 (patch)
treed8b9435500b80ecdd29e798db76cb4620b5763b7 /process.c
parenta84c99468f26a9f79fec57926d561ed906505eac (diff)
downloadruby-ba6ccd871442f55080bffd53e33678c0726787d2.tar.gz
Implement `Process.warmup`
[Feature #18885] For now, the optimizations performed are: - Run a major GC - Compact the heap - Promote all surviving objects to oldgen Other optimizations may follow.
Diffstat (limited to 'process.c')
-rw-r--r--process.c34
1 files changed, 34 insertions, 0 deletions
diff --git a/process.c b/process.c
index daf3456bfd..9605036c64 100644
--- a/process.c
+++ b/process.c
@@ -115,6 +115,7 @@ int initgroups(const char *, rb_gid_t);
#include "ruby/thread.h"
#include "ruby/util.h"
#include "vm_core.h"
+#include "vm_sync.h"
#include "ruby/ractor.h"
/* define system APIs */
@@ -8510,6 +8511,37 @@ static VALUE rb_mProcUID;
static VALUE rb_mProcGID;
static VALUE rb_mProcID_Syscall;
+/*
+ * call-seq:
+ * Process.warmup -> true
+ *
+ * Notify the Ruby virtual machine that the boot sequence is finished,
+ * and that now is a good time to optimize the application. This is useful
+ * for long running applications.
+ *
+ * This method is expected to be called at the end of the application boot.
+ * If the application is deployed using a pre-forking model, +Process.warmup+
+ * should be called in the original process before the first fork.
+ *
+ * The actual optimizations performed are entirely implementation specific
+ * and may change in the future without notice.
+ *
+ * On CRuby, +Process.warmup+:
+ *
+ * * Perform a major GC.
+ * * Compacts the heap.
+ * * Promotes all surviving objects to the old generation.
+ */
+
+static VALUE
+proc_warmup(VALUE _)
+{
+ RB_VM_LOCK_ENTER();
+ rb_gc_prepare_heap();
+ RB_VM_LOCK_LEAVE();
+ return Qtrue;
+}
+
/*
* Document-module: Process
@@ -8627,6 +8659,8 @@ InitVM_process(void)
rb_define_module_function(rb_mProcess, "getpriority", proc_getpriority, 2);
rb_define_module_function(rb_mProcess, "setpriority", proc_setpriority, 3);
+ rb_define_module_function(rb_mProcess, "warmup", proc_warmup, 0);
+
#ifdef HAVE_GETPRIORITY
/* see Process.setpriority */
rb_define_const(rb_mProcess, "PRIO_PROCESS", INT2FIX(PRIO_PROCESS));