branch: externals/gcmh
commit 49db3037587b92e1c7e993875d4c609c42df0c36
Author: Andrea Corallo <[email protected]>
Commit: Andrea Corallo <[email protected]>
initial implementation
---
gcmh.el | 97 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 97 insertions(+)
diff --git a/gcmh.el b/gcmh.el
index 4500e82..69daea1 100644
--- a/gcmh.el
+++ b/gcmh.el
@@ -1 +1,98 @@
;;; gcmh.el --- the Garbage Collector Magic Hack -*- lexical-binding:t -*-
+
+;; Copyright (C) 2019 Andrea Corallo
+
+;; Maintainer: [email protected]
+;; Package: gcmh
+;; Homepage: https://gitlab.com/koral/gcmh
+;; Version: 0.1
+;; Package-Requires:
+;; Keywords: garbage collector, garbage collection
+
+;; This file is not part of GNU Emacs.
+
+;; GNU Emacs 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
+;; (at your option) any later version.
+
+;; GNU Emacs 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 GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Enforce an optimized Garbage Collection strategy to minimize GC
+;; interference with the user activity.
+;; A more detailed explanation of the rationale behind this can be found at
+;; http://akrl.sdf.org/
+
+;;; Code:
+
+(defcustom gcmh-low-cons-threshold gc-cons-threshold
+ "High cons gc threshold.
+This is the gc threshold used while in idle. Default value is \
+`gc-cons-threshold'"
+ :group 'gcmh
+ :type 'number)
+
+(defcustom gcmh-high-cons-threshold #x40000000
+ "High cons gc threshold.
+This should be set to a value that makes GC unlikely but does not make the OS \
+paging."
+ :group 'gcmh
+ :type 'number)
+
+(defcustom gcmh-verbose nil
+ "If t print a message into when garbage collecting."
+ :group 'gcmh
+ :type 'boolean)
+
+(defvar gcmh-timer nil
+ "Idle timer set for trigering GC.")
+
+(defmacro gcmh-time (&rest body)
+ "Measure and return the time it takes to evaluate BODY."
+ `(let ((time (current-time)))
+ ,@body
+ (float-time (time-since time))))
+
+(defun gcmh-set-high-threshold ()
+ "Set the high gc thereshold.
+This is to be used with the `pre-command-hook'."
+ (setq gc-cons-threshold gcmh-high-cons-threshold))
+
+;;;###autoload
+(define-minor-mode gcmh-mode
+ "Minor mode tweak Garbage Colelction strategy."
+ :lighter " GCMH"
+ :global t
+ (cond
+ (gcmh-mode
+ (progn
+ (setq gc-cons-threshold gcmh-high-cons-threshold)
+ ;; Print a message when garbage collecting
+ (setq garbage-collection-messages gcmh-verbose)
+ ;; When idle for 15sec run the GC no matter what.
+ (unless gcmh-timer
+ (setq gcmh-timer
+ (run-with-idle-timer 15 t
+ (lambda ()
+ (if gcmh-verbose
+ (message "Garbage Collector has run
for %.06fsec"
+ (gcmh-time (garbage-collect)))
+ (garbage-collect))
+ (setq gc-cons-threshold
gcmh-low-cons-threshold)))))
+ (add-hook 'pre-command-hook #'gcmh-set-high-threshold)))
+ (t (progn
+ (setq gc-cons-threshold gcmh-low-cons-threshold)
+ (cancel-timer gcmh-timer)
+ (setq gcmh-timer nil)
+ (remove-hook 'pre-command-hook #'gcmh-set-high-threshold)))))
+
+(provide 'gcmh)
+
+;;; gcmh.el ends here