Mercurial > hg > xemacs-beta
diff lisp/energize/backtrace-logging.el @ 0:376386a54a3c r19-14
Import from CVS: tag r19-14
author | cvs |
---|---|
date | Mon, 13 Aug 2007 08:45:50 +0200 |
parents | |
children | 131b0175ea99 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/energize/backtrace-logging.el Mon Aug 13 08:45:50 2007 +0200 @@ -0,0 +1,178 @@ +;;; -*- Mode: EMACS-LISP; Syntax: E-Lisp; Base: 10 -*- +;;; +;;;; backtrace-logging.el +;;; +;;; User code for interacting with backtrace logging. +;;; +;;; *************************************************************************** +;;; +;;; Revision: 29-Jan-92 12:14:49 +;;; +;;; Programmer: Harlan Sexton +;;; +;;; Edit-History: +;;; +;;; Created: 30-Aug-91 by hbs +;;; +;;; End-of-Edit-History + +(defvar *btl-index-counter* 1) +(defvar *btl-data-file* nil) +(defvar *btl-indices-assigned* nil) +(defvar elisp-only-btl nil) +(defvar cadillac-id-tag-save 'cadillac-id-tag-save) + +(defun assign-btl-indices (&optional force) + (if (or force + (not *btl-indices-assigned*)) + (progn + (mapatoms 'assign-btl-index) + (setq *btl-indices-assigned* t)))) + +(defun btl-compiled-p (function) + (or (subrp function) + (compiled-function-p function) + (and (consp function) + (eq (car function) 'lambda) + (let ((rest (cdr (cdr function))) + (quit nil)) + (while (and rest (not quit)) + (let ((trial (car rest))) + (if (consp trial) + (setq quit (eq (car trial) 'byte-code))) + (setq rest (cdr rest)))) + quit)))) + +(defun get-btl-index (symbol) + (if (symbolp symbol) + (let ((val (or (get symbol cadillac-id-tag) + (get symbol 'cadillac-id-tag-save)))) + (if (and val (integerp val) (> val 0)) + val + (progn + (setq val *btl-index-counter*) + (setq *btl-index-counter* (1+ *btl-index-counter*)) + val))))) + +(defun disable-btl-index (symbol) + (if (symbolp symbol) + (let ((val (or (get symbol cadillac-id-tag) + (get symbol 'cadillac-id-tag-save)))) + (if (and val (integerp val) (> val 0)) + (put symbol 'cadillac-id-tag-save val)) + (remprop symbol cadillac-id-tag)))) + +(defun assign-btl-index (symbol) + (if (and (symbolp symbol) + (fboundp symbol)) + (let* ((function (symbol-function symbol)) + (subr-function (subrp function)) + (compiled-function (btl-compiled-p function)) + (tagged-function (get symbol cadillac-id-tag))) + (cond ((and elisp-only-btl compiled-function (not tagged-function)) + (put symbol cadillac-id-tag (get-btl-index symbol))) + ((and (not elisp-only-btl) subr-function tagged-function) + (disable-btl-index symbol)))))) + +(defun file-to-btl-data-file (file) + (let ((base-dir (expand-file-name ""))) + (if (string-equal base-dir file) + (setq file nil))) + (setq file (or file *btl-data-file*)) + (let ((go-ahead nil)) + (if (or (not (stringp file)) + (file-directory-p file)) + (setq go-ahead nil) + (if (file-exists-p file) + (setq go-ahead + (y-or-n-p (message "File exists -- overwrite %s? " + file))) + (setq go-ahead t))) + (if (not go-ahead) + (error "Bad data file."))) + file) + +(defun btl-init (file &optional pc-logging) + (setq file (file-to-btl-data-file file)) + (let ((log-type (if pc-logging "PC logging" "btl"))) + (message (format "Initializing %s..." log-type)) + (sit-for 0) + (assign-btl-indices t) + (setq *btl-data-file* file) + (if pc-logging + (initialize-pc-logging-internal file) + (initialize-backtrace-logging-internal file)) + (message (format "Initializing %s...done." log-type)) + (sit-for 1) + (message "") + (sit-for 0))) + +(defun start-btl (file &optional elisp-flag-val) + (interactive "FFile in which to write data: ") + (terminate-logging) + (setq elisp-only-btl elisp-flag-val) + (btl-init file) + (start-logging)) + +(defun start-btl-elisp (file) + (interactive "FFile in which to write data: ") + (start-btl file t)) + +(defun consing-btl (file &optional elisp-flag-val) + (interactive "FFile in which to write data: ") + (terminate-logging) + (setq elisp-only-btl elisp-flag-val) + (set-log-signal 0) + (btl-init file) + (start-logging)) + +(defun consing-btl-elisp (file) + (interactive "FFile in which to write data: ") + (consing-btl file t)) + +(defun set-elisp-btl (arg) + (interactive "p") + (setq elisp-only-btl (eql arg 1))) + +(defun start-pcl (file &optional elisp-flag-val) + (interactive "FFile in which to write data: ") + (setq elisp-only-btl elisp-flag-val) + (btl-init file t) + (start-logging)) + +(defun start-pcl-elisp (file) + (interactive "FFile in which to write data: ") + (start-pcl file t)) + +(defun suspend-btl () + (interactive) + (stop-logging)) + +(defun suspend-pcl () + (interactive) + (stop-logging)) + +(defun resume-btl () + (interactive) + (start-logging)) + +(defun resume-pcl () + (interactive) + (start-logging)) + +(defun stop-btl () + (interactive) + (terminate-logging)) + +(defun stop-pcl () + (interactive) + (terminate-logging)) + +(defun show-btl () + (interactive) + (terminate-logging) + (switch-to-buffer (get-buffer-create "*BTL Log Info*")) + (goto-char (point-max)) + (buffer-disable-undo (current-buffer)) + (if *btl-data-file* + (summarize-logging *btl-data-file*)))