428
+ − 1 @c -*-texinfo-*-
+ − 2 @c This is part of the XEmacs Lisp Reference Manual.
444
+ − 3 @c Copyright (C) 1990, 1991, 1992, 1993 Free Software Foundation, Inc.
428
+ − 4 @c See the file lispref.texi for copying conditions.
+ − 5 @setfilename ../../info/building.info
+ − 6 @node Building XEmacs and Object Allocation, Standard Errors, Tips, Top
+ − 7 @appendix Building XEmacs; Allocation of Objects
+ − 8
+ − 9 This chapter describes how the runnable XEmacs executable is dumped
+ − 10 with the preloaded Lisp libraries in it and how storage is allocated.
+ − 11
+ − 12 There is an entire separate document, the @cite{XEmacs Internals
+ − 13 Manual}, devoted to the internals of XEmacs from the perspective of the
+ − 14 C programmer. It contains much more detailed information about the
+ − 15 build process, the allocation and garbage-collection process, and other
+ − 16 aspects related to the internals of XEmacs.
+ − 17
+ − 18 @menu
+ − 19 * Building XEmacs:: How to preload Lisp libraries into XEmacs.
+ − 20 * Garbage Collection:: Reclaiming space for Lisp objects no longer used.
+ − 21 @end menu
+ − 22
+ − 23 @node Building XEmacs
+ − 24 @appendixsec Building XEmacs
+ − 25 @cindex building XEmacs
+ − 26 @pindex temacs
+ − 27
+ − 28 This section explains the steps involved in building the XEmacs
+ − 29 executable. You don't have to know this material to build and install
+ − 30 XEmacs, since the makefiles do all these things automatically. This
+ − 31 information is pertinent to XEmacs maintenance.
+ − 32
+ − 33 The @cite{XEmacs Internals Manual} contains more information about this.
+ − 34
+ − 35 Compilation of the C source files in the @file{src} directory
2818
+ − 36 produces an executable file called @file{temacs}. It contains the
+ − 37 XEmacs Lisp interpreter and I/O routines, but not the editing commands.
428
+ − 38
+ − 39 @cindex @file{loadup.el}
+ − 40 Before XEmacs is actually usable, a number of Lisp files need to be
+ − 41 loaded. These define all the editing commands, plus most of the startup
+ − 42 code and many very basic Lisp primitives. This is accomplished by
+ − 43 loading the file @file{loadup.el}, which in turn loads all of the other
+ − 44 standardly-loaded Lisp files.
+ − 45
+ − 46 It takes a substantial time to load the standard Lisp files. Luckily,
+ − 47 you don't have to do this each time you run XEmacs; @file{temacs} can
+ − 48 dump out an executable program called @file{xemacs} that has these files
+ − 49 preloaded. @file{xemacs} starts more quickly because it does not need to
+ − 50 load the files. This is the XEmacs executable that is normally
+ − 51 installed.
+ − 52
+ − 53 To create @file{xemacs}, use the command @samp{temacs -batch -l loadup
+ − 54 dump}. The purpose of @samp{-batch} here is to tell @file{temacs} to run
+ − 55 in non-interactive, command-line mode. (@file{temacs} can @emph{only} run
+ − 56 in this fashion. Part of the code required to initialize frames and faces
+ − 57 is in Lisp, and must be loaded before XEmacs is able to create any frames.)
+ − 58 The argument @samp{dump} tells @file{loadup.el} to dump a new executable
+ − 59 named @file{xemacs}.
+ − 60
+ − 61 The dumping process is highly system-specific, and some operating
+ − 62 systems don't support dumping. On those systems, you must start XEmacs
+ − 63 with the @samp{temacs -batch -l loadup run-temacs} command each time you
+ − 64 use it. This takes a substantial time, but since you need to start
+ − 65 Emacs once a day at most---or once a week if you never log out---the
+ − 66 extra time is not too severe a problem. (In older versions of Emacs,
+ − 67 you started Emacs from @file{temacs} using @samp{temacs -l loadup}.)
+ − 68
+ − 69 @cindex runnable @file{temacs}
+ − 70 @cindex bootstrapping XEmacs from @file{temacs}
+ − 71 You are free to start XEmacs directly from @file{temacs} if you want,
+ − 72 even if there is already a dumped @file{xemacs}. Normally you wouldn't
+ − 73 want to do that; but the Makefiles do this when you rebuild XEmacs using
+ − 74 @samp{make all-elc}, which builds XEmacs and simultaneously compiles any
+ − 75 out-of-date Lisp files. (You need @file{xemacs} in order to compile Lisp
+ − 76 files. However, you also need the compiled Lisp files in order to dump
+ − 77 out @file{xemacs}. If both of these are missing or corrupted, you are
+ − 78 out of luck unless you're able to bootstrap @file{xemacs} from
+ − 79 @file{temacs}. Note that @samp{make all-elc} actually loads the
+ − 80 alternative loadup file @file{loadup-el.el}, which works like
2818
+ − 81 @file{loadup.el} but forces XEmacs to ignore any compiled Lisp files
+ − 82 even if they exist.)
428
+ − 83
+ − 84 @cindex @file{site-load.el}
+ − 85 You can specify additional files to preload by writing a library named
2818
+ − 86 @file{site-load.el} that loads them. However, the advantage of
428
+ − 87 preloading additional files decreases as machines get faster. On modern
+ − 88 machines, it is often not advisable, especially if the Lisp code is
+ − 89 on a file system local to the machine running XEmacs.
+ − 90
+ − 91 @cindex @file{site-init.el}
+ − 92 You can specify other Lisp expressions to execute just before dumping
+ − 93 by putting them in a library named @file{site-init.el}. However, if
+ − 94 they might alter the behavior that users expect from an ordinary
+ − 95 unmodified XEmacs, it is better to put them in @file{default.el}, so that
+ − 96 users can override them if they wish. @xref{Start-up Summary}.
+ − 97
+ − 98 Before @file{loadup.el} dumps the new executable, it finds the
+ − 99 documentation strings for primitive and preloaded functions (and
+ − 100 variables) in the file where they are stored, by calling
+ − 101 @code{Snarf-documentation} (@pxref{Accessing Documentation}). These
+ − 102 strings were moved out of the @file{xemacs} executable to make it
+ − 103 smaller. @xref{Documentation Basics}.
+ − 104
+ − 105 @defun dump-emacs to-file from-file
+ − 106 @cindex unexec
+ − 107 This function dumps the current state of XEmacs into an executable file
+ − 108 @var{to-file}. It takes symbols from @var{from-file} (this is normally
+ − 109 the executable file @file{temacs}).
+ − 110
+ − 111 If you use this function in an XEmacs that was already dumped, you must
+ − 112 set @code{command-line-processed} to @code{nil} first for good results.
+ − 113 @xref{Command Line Arguments}.
+ − 114 @end defun
+ − 115
+ − 116 @defun run-emacs-from-temacs &rest args
+ − 117 This is the function that implements the @file{run-temacs} command-line
+ − 118 argument. It is called from @file{loadup.el} as appropriate. You should
+ − 119 most emphatically @emph{not} call this yourself; it will reinitialize
+ − 120 your XEmacs process and you'll be sorry.
+ − 121 @end defun
+ − 122
444
+ − 123 @deffn Command emacs-version &optional arg
428
+ − 124 This function returns a string describing the version of XEmacs that is
+ − 125 running. It is useful to include this string in bug reports.
+ − 126
444
+ − 127 When called interactively with a prefix argument, insert string at point.
+ − 128 Don't use this function in programs to choose actions according
+ − 129 to the system configuration; look at @code{system-configuration} instead.
+ − 130
428
+ − 131 @example
+ − 132 @group
+ − 133 (emacs-version)
+ − 134 @result{} "XEmacs 20.1 [Lucid] (i586-unknown-linux2.0.29)
+ − 135 of Mon Apr 7 1997 on altair.xemacs.org"
+ − 136 @end group
+ − 137 @end example
+ − 138
+ − 139 Called interactively, the function prints the same information in the
+ − 140 echo area.
+ − 141 @end deffn
+ − 142
+ − 143 @defvar emacs-build-time
+ − 144 The value of this variable is the time at which XEmacs was built at the
+ − 145 local site.
+ − 146
+ − 147 @example
+ − 148 @group
+ − 149 emacs-build-time "Mon Apr 7 20:28:52 1997"
444
+ − 150 @result{}
428
+ − 151 @end group
+ − 152 @end example
+ − 153 @end defvar
+ − 154
+ − 155 @defvar emacs-version
+ − 156 The value of this variable is the version of Emacs being run. It is a
+ − 157 string, e.g. @code{"20.1 XEmacs Lucid"}.
+ − 158 @end defvar
+ − 159
+ − 160 The following two variables did not exist before FSF GNU Emacs version
+ − 161 19.23 and XEmacs version 19.10, which reduces their usefulness at
+ − 162 present, but we hope they will be convenient in the future.
+ − 163
+ − 164 @defvar emacs-major-version
+ − 165 The major version number of Emacs, as an integer. For XEmacs version
+ − 166 20.1, the value is 20.
+ − 167 @end defvar
+ − 168
+ − 169 @defvar emacs-minor-version
+ − 170 The minor version number of Emacs, as an integer. For XEmacs version
+ − 171 20.1, the value is 1.
+ − 172 @end defvar
+ − 173
+ − 174 @node Garbage Collection
+ − 175 @appendixsec Garbage Collection
+ − 176 @cindex garbage collector
+ − 177
+ − 178 @cindex memory allocation
+ − 179 When a program creates a list or the user defines a new function (such
+ − 180 as by loading a library), that data is placed in normal storage. If
+ − 181 normal storage runs low, then XEmacs asks the operating system to
+ − 182 allocate more memory in blocks of 2k bytes. Each block is used for one
+ − 183 type of Lisp object, so symbols, cons cells, markers, etc., are
+ − 184 segregated in distinct blocks in memory. (Vectors, long strings,
+ − 185 buffers and certain other editing types, which are fairly large, are
+ − 186 allocated in individual blocks, one per object, while small strings are
+ − 187 packed into blocks of 8k bytes. [More correctly, a string is allocated
+ − 188 in two sections: a fixed size chunk containing the length, list of
+ − 189 extents, etc.; and a chunk containing the actual characters in the
+ − 190 string. It is this latter chunk that is either allocated individually
+ − 191 or packed into 8k blocks. The fixed size chunk is packed into 2k
+ − 192 blocks, as for conses, markers, etc.])
+ − 193
+ − 194 It is quite common to use some storage for a while, then release it by
+ − 195 (for example) killing a buffer or deleting the last pointer to an
+ − 196 object. XEmacs provides a @dfn{garbage collector} to reclaim this
+ − 197 abandoned storage. (This name is traditional, but ``garbage recycler''
+ − 198 might be a more intuitive metaphor for this facility.)
+ − 199
+ − 200 The garbage collector operates by finding and marking all Lisp objects
+ − 201 that are still accessible to Lisp programs. To begin with, it assumes
+ − 202 all the symbols, their values and associated function definitions, and
+ − 203 any data presently on the stack, are accessible. Any objects that can
+ − 204 be reached indirectly through other accessible objects are also
+ − 205 accessible.
+ − 206
+ − 207 When marking is finished, all objects still unmarked are garbage. No
+ − 208 matter what the Lisp program or the user does, it is impossible to refer
+ − 209 to them, since there is no longer a way to reach them. Their space
+ − 210 might as well be reused, since no one will miss them. The second
+ − 211 (``sweep'') phase of the garbage collector arranges to reuse them.
+ − 212
+ − 213 @cindex free list
+ − 214 The sweep phase puts unused cons cells onto a @dfn{free list} for
+ − 215 future allocation; likewise for symbols, markers, extents, events,
+ − 216 floats, compiled-function objects, and the fixed-size portion of
+ − 217 strings. It compacts the accessible small string-chars chunks so they
+ − 218 occupy fewer 8k blocks; then it frees the other 8k blocks. Vectors,
+ − 219 buffers, windows, and other large objects are individually allocated and
+ − 220 freed using @code{malloc} and @code{free}.
+ − 221
+ − 222 @cindex CL note---allocate more storage
+ − 223 @quotation
+ − 224 @b{Common Lisp note:} unlike other Lisps, XEmacs Lisp does not
+ − 225 call the garbage collector when the free list is empty. Instead, it
+ − 226 simply requests the operating system to allocate more storage, and
+ − 227 processing continues until @code{gc-cons-threshold} bytes have been
+ − 228 used.
+ − 229
+ − 230 This means that you can make sure that the garbage collector will not
+ − 231 run during a certain portion of a Lisp program by calling the garbage
+ − 232 collector explicitly just before it (provided that portion of the
+ − 233 program does not use so much space as to force a second garbage
+ − 234 collection).
+ − 235 @end quotation
+ − 236
+ − 237 @deffn Command garbage-collect
+ − 238 This command runs a garbage collection, and returns information on
+ − 239 the amount of space in use. (Garbage collection can also occur
+ − 240 spontaneously if you use more than @code{gc-cons-threshold} bytes of
+ − 241 Lisp data since the previous garbage collection.)
+ − 242
+ − 243 @code{garbage-collect} returns a list containing the following
+ − 244 information:
+ − 245
+ − 246 @example
+ − 247 @group
+ − 248 ((@var{used-conses} . @var{free-conses})
+ − 249 (@var{used-syms} . @var{free-syms})
+ − 250 @end group
+ − 251 (@var{used-markers} . @var{free-markers})
444
+ − 252 @var{used-string-chars}
428
+ − 253 @var{used-vector-slots}
+ − 254 (@var{plist}))
+ − 255
+ − 256 @group
+ − 257 @result{} ((73362 . 8325) (13718 . 164)
+ − 258 (5089 . 5098) 949121 118677
+ − 259 (conses-used 73362 conses-free 8329 cons-storage 658168
+ − 260 symbols-used 13718 symbols-free 164 symbol-storage 335216
+ − 261 bit-vectors-used 0 bit-vectors-total-length 0
+ − 262 bit-vector-storage 0 vectors-used 7882
+ − 263 vectors-total-length 118677 vector-storage 537764
+ − 264 compiled-functions-used 1336 compiled-functions-free 37
+ − 265 compiled-function-storage 44440 short-strings-used 28829
+ − 266 long-strings-used 2 strings-free 7722
+ − 267 short-strings-total-length 916657 short-string-storage 1179648
+ − 268 long-strings-total-length 32464 string-header-storage 441504
+ − 269 floats-used 3 floats-free 43 float-storage 2044 markers-used 5089
+ − 270 markers-free 5098 marker-storage 245280 events-used 103
+ − 271 events-free 835 event-storage 110656 extents-used 10519
+ − 272 extents-free 2718 extent-storage 372736
+ − 273 extent-auxiliarys-used 111 extent-auxiliarys-freed 3
+ − 274 extent-auxiliary-storage 4440 window-configurations-used 39
+ − 275 window-configurations-on-free-list 5
+ − 276 window-configurations-freed 10 window-configuration-storage 9492
+ − 277 popup-datas-used 3 popup-data-storage 72 toolbar-buttons-used 62
+ − 278 toolbar-button-storage 4960 toolbar-datas-used 12
+ − 279 toolbar-data-storage 240 symbol-value-buffer-locals-used 182
+ − 280 symbol-value-buffer-local-storage 5824
+ − 281 symbol-value-lisp-magics-used 22
+ − 282 symbol-value-lisp-magic-storage 1496
+ − 283 symbol-value-varaliases-used 43
+ − 284 symbol-value-varalias-storage 1032 opaque-lists-used 2
+ − 285 opaque-list-storage 48 color-instances-used 12
+ − 286 color-instance-storage 288 font-instances-used 5
+ − 287 font-instance-storage 180 opaques-used 11 opaque-storage 312
+ − 288 range-tables-used 1 range-table-storage 16 faces-used 34
+ − 289 face-storage 2584 glyphs-used 124 glyph-storage 4464
+ − 290 specifiers-used 775 specifier-storage 43869 weak-lists-used 786
+ − 291 weak-list-storage 18864 char-tables-used 40
+ − 292 char-table-storage 41920 buffers-used 25 buffer-storage 7000
+ − 293 extent-infos-used 457 extent-infos-freed 73
+ − 294 extent-info-storage 9140 keymaps-used 275 keymap-storage 12100
+ − 295 consoles-used 4 console-storage 384 command-builders-used 2
+ − 296 command-builder-storage 120 devices-used 2 device-storage 344
+ − 297 frames-used 3 frame-storage 624 image-instances-used 47
+ − 298 image-instance-storage 3008 windows-used 27 windows-freed 2
+ − 299 window-storage 9180 lcrecord-lists-used 15
+ − 300 lcrecord-list-storage 360 hash-tables-used 631
+ − 301 hash-table-storage 25240 streams-used 1 streams-on-free-list 3
+ − 302 streams-freed 12 stream-storage 91))
+ − 303 @end group
+ − 304 @end example
+ − 305
+ − 306 Here is a table explaining each element:
+ − 307
+ − 308 @table @var
+ − 309 @item used-conses
+ − 310 The number of cons cells in use.
+ − 311
+ − 312 @item free-conses
+ − 313 The number of cons cells for which space has been obtained from the
+ − 314 operating system, but that are not currently being used.
+ − 315
+ − 316 @item used-syms
+ − 317 The number of symbols in use.
+ − 318
+ − 319 @item free-syms
+ − 320 The number of symbols for which space has been obtained from the
+ − 321 operating system, but that are not currently being used.
+ − 322
+ − 323 @item used-markers
+ − 324 The number of markers in use.
+ − 325
+ − 326 @item free-markers
+ − 327 The number of markers for which space has been obtained from the
+ − 328 operating system, but that are not currently being used.
+ − 329
+ − 330 @item used-string-chars
+ − 331 The total size of all strings, in characters.
+ − 332
+ − 333 @item used-vector-slots
+ − 334 The total number of elements of existing vectors.
+ − 335
+ − 336 @item plist
+ − 337 A list of alternating keyword/value pairs providing more detailed
+ − 338 information. (As you can see above, quite a lot of information is
+ − 339 provided.)
+ − 340 @ignore @c Different in XEmacs
+ − 341
+ − 342 @item used-floats
+ − 343 @c Emacs 19 feature
+ − 344 The number of floats in use.
+ − 345
+ − 346 @item free-floats
+ − 347 @c Emacs 19 feature
+ − 348 The number of floats for which space has been obtained from the
+ − 349 operating system, but that are not currently being used.
+ − 350 @end ignore
+ − 351 @end table
+ − 352 @end deffn
+ − 353
+ − 354 @defopt gc-cons-threshold
+ − 355 The value of this variable is the number of bytes of storage that must
+ − 356 be allocated for Lisp objects after one garbage collection in order to
+ − 357 trigger another garbage collection. A cons cell counts as eight bytes,
+ − 358 a string as one byte per character plus a few bytes of overhead, and so
+ − 359 on; space allocated to the contents of buffers does not count. Note
+ − 360 that the subsequent garbage collection does not happen immediately when
+ − 361 the threshold is exhausted, but only the next time the Lisp evaluator is
+ − 362 called.
+ − 363
+ − 364 The initial threshold value is 500,000. If you specify a larger
+ − 365 value, garbage collection will happen less often. This reduces the
+ − 366 amount of time spent garbage collecting, but increases total memory use.
+ − 367 You may want to do this when running a program that creates lots of
+ − 368 Lisp data.
+ − 369
+ − 370 You can make collections more frequent by specifying a smaller value,
+ − 371 down to 10,000. A value less than 10,000 will remain in effect only
+ − 372 until the subsequent garbage collection, at which time
+ − 373 @code{garbage-collect} will set the threshold back to 10,000. (This does
+ − 374 not apply if XEmacs was configured with @samp{--debug}. Therefore, be
+ − 375 careful when setting @code{gc-cons-threshold} in that case!)
+ − 376 @end defopt
+ − 377
444
+ − 378 @ignore
428
+ − 379 @c Emacs 19 feature
+ − 380 @defun memory-limit
+ − 381 This function returns the address of the last byte XEmacs has allocated,
+ − 382 divided by 1024. We divide the value by 1024 to make sure it fits in a
+ − 383 Lisp integer.
+ − 384
+ − 385 You can use this to get a general idea of how your actions affect the
+ − 386 memory usage.
+ − 387 @end defun
444
+ − 388 @end ignore
428
+ − 389
+ − 390 @defvar pre-gc-hook
+ − 391 This is a normal hook to be run just before each garbage collection.
+ − 392 Interrupts, garbage collection, and errors are inhibited while this hook
+ − 393 runs, so be extremely careful in what you add here. In particular,
+ − 394 avoid consing, and do not interact with the user.
+ − 395 @end defvar
+ − 396
+ − 397 @defvar post-gc-hook
+ − 398 This is a normal hook to be run just after each garbage collection.
+ − 399 Interrupts, garbage collection, and errors are inhibited while this hook
+ − 400 runs, so be extremely careful in what you add here. In particular,
+ − 401 avoid consing, and do not interact with the user.
+ − 402 @end defvar
+ − 403
+ − 404 @defvar gc-message
+ − 405 This is a string to print to indicate that a garbage collection is in
+ − 406 progress. This is printed in the echo area. If the selected frame is
+ − 407 on a window system and @code{gc-pointer-glyph} specifies a value (i.e. a
+ − 408 pointer image instance) in the domain of the selected frame, the mouse
+ − 409 cursor will change instead of this message being printed.
+ − 410 @end defvar
+ − 411
+ − 412 @defvr Glyph gc-pointer-glyph
+ − 413 This holds the pointer glyph used to indicate that a garbage collection
+ − 414 is in progress. If the selected window is on a window system and this
+ − 415 glyph specifies a value (i.e. a pointer image instance) in the domain of
+ − 416 the selected window, the cursor will be changed as specified during
+ − 417 garbage collection. Otherwise, a message will be printed in the echo
+ − 418 area, as controlled by @code{gc-message}. @xref{Glyphs}.
+ − 419 @end defvr
+ − 420
+ − 421 If XEmacs was configured with @samp{--debug}, you can set the following
+ − 422 two variables to get direct information about all the allocation that
+ − 423 is happening in a segment of Lisp code.
+ − 424
+ − 425 @defvar debug-allocation
+ − 426 If non-zero, print out information to stderr about all objects
+ − 427 allocated.
+ − 428 @end defvar
+ − 429
+ − 430 @defvar debug-allocation-backtrace
+ − 431 Length (in stack frames) of short backtrace printed out by
+ − 432 @code{debug-allocation}.
+ − 433 @end defvar