Mercurial > hg > xemacs-beta
annotate lib-src/gnuserv.h @ 5157:1fae11d56ad2
redo memory-usage mechanism, add way of dynamically initializing Lisp objects
-------------------- ChangeLog entries follow: --------------------
lisp/ChangeLog addition:
2010-03-18 Ben Wing <ben@xemacs.org>
* diagnose.el (show-memory-usage):
Rewrite to take into account API changes in memory-usage functions.
src/ChangeLog addition:
2010-03-18 Ben Wing <ben@xemacs.org>
* alloc.c:
* alloc.c (disksave_object_finalization_1):
* alloc.c (lisp_object_storage_size):
* alloc.c (listu):
* alloc.c (listn):
* alloc.c (Fobject_memory_usage_stats):
* alloc.c (compute_memusage_stats_length):
* alloc.c (Fobject_memory_usage):
* alloc.c (Ftotal_object_memory_usage):
* alloc.c (malloced_storage_size):
* alloc.c (common_init_alloc_early):
* alloc.c (reinit_alloc_objects_early):
* alloc.c (reinit_alloc_early):
* alloc.c (init_alloc_once_early):
* alloc.c (syms_of_alloc):
* alloc.c (reinit_vars_of_alloc):
* buffer.c:
* buffer.c (struct buffer_stats):
* buffer.c (compute_buffer_text_usage):
* buffer.c (compute_buffer_usage):
* buffer.c (buffer_memory_usage):
* buffer.c (buffer_objects_create):
* buffer.c (syms_of_buffer):
* buffer.c (vars_of_buffer):
* console-impl.h (struct console_methods):
* dynarr.c (Dynarr_memory_usage):
* emacs.c (main_1):
* events.c (clear_event_resource):
* extents.c:
* extents.c (compute_buffer_extent_usage):
* extents.c (extent_objects_create):
* extents.h:
* faces.c:
* faces.c (compute_face_cachel_usage):
* faces.c (face_objects_create):
* faces.h:
* general-slots.h:
* glyphs.c:
* glyphs.c (compute_glyph_cachel_usage):
* glyphs.c (glyph_objects_create):
* glyphs.h:
* lisp.h:
* lisp.h (struct usage_stats):
* lrecord.h:
* lrecord.h (enum lrecord_type):
* lrecord.h (struct lrecord_implementation):
* lrecord.h (MC_ALLOC_CALL_FINALIZER_FOR_DISKSAVE):
* lrecord.h (DEFINE_DUMPABLE_LISP_OBJECT):
* lrecord.h (DEFINE_DUMPABLE_SIZABLE_LISP_OBJECT):
* lrecord.h (DEFINE_DUMPABLE_FROB_BLOCK_LISP_OBJECT):
* lrecord.h (DEFINE_DUMPABLE_FROB_BLOCK_SIZABLE_LISP_OBJECT):
* lrecord.h (DEFINE_DUMPABLE_INTERNAL_LISP_OBJECT):
* lrecord.h (DEFINE_DUMPABLE_SIZABLE_INTERNAL_LISP_OBJECT):
* lrecord.h (DEFINE_NODUMP_LISP_OBJECT):
* lrecord.h (DEFINE_NODUMP_SIZABLE_LISP_OBJECT):
* lrecord.h (DEFINE_NODUMP_FROB_BLOCK_LISP_OBJECT):
* lrecord.h (DEFINE_NODUMP_FROB_BLOCK_SIZABLE_LISP_OBJECT):
* lrecord.h (DEFINE_NODUMP_INTERNAL_LISP_OBJECT):
* lrecord.h (DEFINE_NODUMP_SIZABLE_INTERNAL_LISP_OBJECT):
* lrecord.h (MAKE_LISP_OBJECT):
* lrecord.h (DEFINE_DUMPABLE_MODULE_LISP_OBJECT):
* lrecord.h (DEFINE_DUMPABLE_MODULE_SIZABLE_LISP_OBJECT):
* lrecord.h (DEFINE_NODUMP_MODULE_LISP_OBJECT):
* lrecord.h (DEFINE_NODUMP_MODULE_SIZABLE_LISP_OBJECT):
* lrecord.h (MAKE_MODULE_LISP_OBJECT):
* lrecord.h (INIT_LISP_OBJECT):
* lrecord.h (INIT_MODULE_LISP_OBJECT):
* lrecord.h (UNDEF_LISP_OBJECT):
* lrecord.h (UNDEF_MODULE_LISP_OBJECT):
* lrecord.h (DECLARE_LISP_OBJECT):
* lrecord.h (DECLARE_MODULE_API_LISP_OBJECT):
* lrecord.h (DECLARE_MODULE_LISP_OBJECT):
* lstream.c:
* lstream.c (syms_of_lstream):
* lstream.c (vars_of_lstream):
* marker.c:
* marker.c (compute_buffer_marker_usage):
* mc-alloc.c (mc_alloced_storage_size):
* mc-alloc.h:
* mule-charset.c:
* mule-charset.c (struct charset_stats):
* mule-charset.c (compute_charset_usage):
* mule-charset.c (charset_memory_usage):
* mule-charset.c (mule_charset_objects_create):
* mule-charset.c (syms_of_mule_charset):
* mule-charset.c (vars_of_mule_charset):
* redisplay.c:
* redisplay.c (compute_rune_dynarr_usage):
* redisplay.c (compute_display_block_dynarr_usage):
* redisplay.c (compute_glyph_block_dynarr_usage):
* redisplay.c (compute_display_line_dynarr_usage):
* redisplay.c (compute_line_start_cache_dynarr_usage):
* redisplay.h:
* scrollbar-gtk.c (gtk_compute_scrollbar_instance_usage):
* scrollbar-msw.c (mswindows_compute_scrollbar_instance_usage):
* scrollbar-x.c (x_compute_scrollbar_instance_usage):
* scrollbar.c (compute_scrollbar_instance_usage):
* scrollbar.h:
* symbols.c:
* symbols.c (reinit_symbol_objects_early):
* symbols.c (init_symbols_once_early):
* symbols.c (reinit_symbols_early):
* symbols.c (defsymbol_massage_name_1):
* symsinit.h:
* ui-gtk.c:
* ui-gtk.c (emacs_gtk_object_getprop):
* ui-gtk.c (emacs_gtk_object_putprop):
* ui-gtk.c (ui_gtk_objects_create):
* unicode.c (compute_from_unicode_table_size_1):
* unicode.c (compute_to_unicode_table_size_1):
* unicode.c (compute_from_unicode_table_size):
* unicode.c (compute_to_unicode_table_size):
* window.c:
* window.c (struct window_stats):
* window.c (compute_window_mirror_usage):
* window.c (compute_window_usage):
* window.c (window_memory_usage):
* window.c (window_objects_create):
* window.c (syms_of_window):
* window.c (vars_of_window):
* window.h:
Redo memory-usage mechanism, make it general; add way of dynamically
initializing Lisp object types -- OBJECT_HAS_METHOD(), similar to
CONSOLE_HAS_METHOD().
(1) Create OBJECT_HAS_METHOD(), OBJECT_HAS_PROPERTY() etc. for
specifying that a Lisp object type has a particular method or
property. Call such methods with OBJECT_METH, MAYBE_OBJECT_METH,
OBJECT_METH_OR_GIVEN; retrieve properties with OBJECT_PROPERTY.
Methods that formerly required a DEFINE_*GENERAL_LISP_OBJECT() to
specify them (getprop, putprop, remprop, plist, disksave) now
instead use the dynamic-method mechanism. The main benefit of
this is that new methods or properties can be added without
requiring that the declaration statements of all existing methods
be modified. We have to make the `struct lrecord_implementation'
non-const, but I don't think this should have any effect on speed --
the only possible method that's really speed-critical is the
mark method, and we already extract those out into a separate
(non-const) array for increased cache locality.
Object methods need to be reinitialized after pdump, so we put
them in separate functions such as face_objects_create(),
extent_objects_create() and call them appropriately from emacs.c
The only current object property (`memusage_stats_list') that
objects can specify is a Lisp object and gets staticpro()ed so it
only needs to be set during dump time, but because it references
symbols that might not exist in a syms_of_() function, we
initialize it in vars_of_(). There is also an object property
(`num_extra_memusage_stats') that is automatically initialized based
on `memusage_stats_list'; we do that in reinit_vars_of_alloc(),
which is called after all vars_of_() functions are called.
`disksaver' method was renamed `disksave' to correspond with the
name normally given to the function (e.g. disksave_lstream()).
(2) Generalize the memory-usage mechanism in `buffer-memory-usage',
`window-memory-usage', `charset-memory-usage' into an object-type-
specific mechanism called by a single function
`object-memory-usage'. (Former function `object-memory-usage'
renamed to `total-object-memory-usage'). Generalize the mechanism
of different "slices" so that we can have different "classes" of
memory described and different "slices" onto each class; `t'
separates classes, `nil' separates slices. Currently we have
three classes defined: the memory of an object itself,
non-Lisp-object memory associated with the object (e.g. arrays or
dynarrs stored as fields in the object), and Lisp-object memory
associated with the object (other internal Lisp objects stored in
the object). This isn't completely finished yet and we might need
to further separate the "other internal Lisp objects" class into
two classes.
The memory-usage mechanism uses a `struct usage_stats' (renamed
from `struct overhead_stats') to describe a malloc-view onto a set
of allocated memory (listing how much was requested and various
types of overhead) and a more general `struct generic_usage_stats'
(with a `struct usage_stats' in it) to hold all statistics about
object memory. `struct generic_usage_stats' contains an array of
32 Bytecounts, which are statistics of unspecified semantics. The
intention is that individual types declare a corresponding struct
(e.g. `struct window_stats') with the same structure but with
specific fields in place of the array, corresponding to specific
statistics. The number of such statistics is an object property
computed from the list of tags (Lisp symbols describing the
statistics) stored in `memusage_stats_list'. The idea here is to
allow particular object types to customize the number and
semantics of the statistics where completely avoiding consing.
This doesn't matter so much yet, but the intention is to have the
memory usage of all objects computed at the end of GC, at the same
time as other statistics are currently computed. The values for
all statistics for a single type would be added up to compute
aggregate values for all objects of a specific type. To make this
efficient, we can't allow any memory allocation at all.
(3) Create some additional functions for creating lists that
specify the elements directly as args rather than indirectly through
an array: listn() (number of args given), listu() (list terminated
by Qunbound).
(4) Delete a bit of remaining unused C window_config stuff, also
unused lrecord_type_popup_data.
author | Ben Wing <ben@xemacs.org> |
---|---|
date | Thu, 18 Mar 2010 10:50:06 -0500 |
parents | aa5ed11f473b |
children | e6508b64ee08 |
rev | line source |
---|---|
428 | 1 /* -*-C-*- |
2 | |
613 | 3 Header file for the XEmacs server and client C code. |
428 | 4 |
613 | 5 This file is part of XEmacs. |
428 | 6 |
7 Copying is permitted under those conditions described by the GNU | |
8 General Public License. | |
9 | |
10 Copyright (C) 1989 Free Software Foundation, Inc. | |
11 | |
12 Author: Andy Norman (ange@hplb.hpl.hp.com), based on | |
13 'etc/server.c' and 'etc/emacsclient.c' from the 18.52 GNU | |
14 Emacs distribution. | |
15 | |
16 Please mail bugs and suggestions to the author at the above address. | |
17 */ | |
18 | |
19 /* HISTORY | |
20 * 11-Nov-1990 bristor@simba | |
21 * Added EOT stuff. | |
22 */ | |
23 | |
24 /* | |
25 * This file incorporates new features added by Bob Weiner <weiner@mot.com>, | |
26 * Darrell Kindred <dkindred@cmu.edu> and Arup Mukherjee <arup@cmu.edu>. | |
27 * Please see the note at the end of the README file for details. | |
28 * | |
29 * (If gnuserv came bundled with your emacs, the README file is probably | |
30 * ../etc/gnuserv.README relative to the directory containing this file) | |
31 */ | |
32 | |
456 | 33 #define GNUSERV_VERSION "3.12" |
428 | 34 |
464 | 35 /* Note: this setting can cause client-server connection failure if the |
36 * value of TMPDIR is not shared by client and server at run-time. | |
37 */ | |
428 | 38 #define USE_TMPDIR |
39 | |
40 #define PATCHLEVEL 2 | |
41 | |
42 #define NO_SHORTNAMES | |
43 /* gnuserv should not be compiled using SOCKS */ | |
44 #define DO_NOT_SOCKSIFY | |
438 | 45 #include <config.h> |
428 | 46 #undef signal |
47 | |
48 /* Define the communication method between server and clients: | |
49 * You can have either or both kinds of sockets, but you can't mix | |
50 * sockets with sysv ipc | |
51 */ | |
52 | |
53 | |
54 #define INTERNET_DOMAIN_SOCKETS | |
55 #ifdef HAVE_SYS_UN_H | |
56 #define UNIX_DOMAIN_SOCKETS | |
57 /* #define SYSV_IPC */ | |
58 #endif | |
59 | |
60 /* | |
61 * Define additional authentication protocols to be used. These methods will | |
62 * be tried before falling back to the default gnuserv protocol (based on | |
63 * the GNU_SECURE environment variable). Currently, only MIT-MAGIC-COOKIE-1 | |
64 * is also supported. | |
65 * | |
66 * Comment out the next line(s) if you don't want to enable the | |
67 * appropriate authentication protocol. | |
68 */ | |
69 | |
70 #if defined (HAVE_XAUTH) | |
71 #define AUTH_MAGIC_COOKIE | |
72 #endif /* HAVE_XAUTH */ | |
73 | |
74 /* | |
75 * stuff related to supporting MIT-MAGIC-COOKIE-1 | |
76 */ | |
77 | |
78 #define MCOOKIE_SCREEN "999" /* screen # to use as the gnuserv cookie */ | |
79 #define MCOOKIE_NAME "MAGIC-1" /* authentication protocol name */ | |
80 #define MCOOKIE_X_NAME "MIT-MAGIC-COOKIE-1" /* as needed by X */ | |
81 | |
82 | |
83 #define DEFAUTH_NAME "GNU-SECURE" /* name of default auth protocol */ | |
84 #define AUTH_TIMEOUT 15 /* # seconds to wait for auth data */ | |
85 #define AUTH_NAMESZ 15 /* max allows auth protocol name size */ | |
86 | |
87 | |
88 /* | |
89 * Pick a default communication scheme, if none was specified. | |
90 */ | |
91 | |
92 #if !defined(SYSV_IPC) && !defined(UNIX_DOMAIN_SOCKETS) && !defined(INTERNET_DOMAIN_SOCKETS) | |
93 | |
94 #ifdef HAVE_SYSVIPC | |
95 #define SYSV_IPC /* SYSV systems use SYSV IPC by default */ | |
96 #endif /* HAVE_SYSVIPC */ | |
97 | |
98 #ifdef BSD | |
99 #define UNIX_DOMAIN_SOCKETS /* BSD systems use Unix Domain sockets by default */ | |
100 #endif /* BSD */ | |
101 | |
102 #endif /* No communication method pre-defined */ | |
103 | |
978 | 104 #include <sys/types.h> |
105 #include <sys/param.h> | |
106 #include <sys/stat.h> | |
107 #include <stdio.h> | |
108 #include <stdlib.h> | |
109 #include <string.h> | |
110 #include "syssignal.h" | |
111 #include <errno.h> | |
112 | |
428 | 113 #ifdef HAVE_UNISTD_H |
114 #include <unistd.h> | |
115 #endif | |
116 | |
117 #ifdef HAVE_SYS_TIME_H | |
118 #include <sys/time.h> | |
119 #endif | |
120 | |
121 /* | |
122 * If you are using SYSV_IPC, you might want to make the buffer size bigger | |
123 * since it limits the size of requests and responses. Don't make it bigger | |
124 * than your system's max message size though (usually a couple of k) or else | |
125 * msgsend will start failing. For sockets, using the system BUFSIZ is usually | |
126 * what you want. | |
127 */ | |
128 | |
129 # define GSERV_BUFSZ BUFSIZ | |
130 | |
131 | |
132 #ifdef SYSV_IPC | |
133 #include <sys/ipc.h> | |
134 #include <sys/msg.h> | |
135 | |
136 #define send_string(s,str) \ | |
137 if (strlen(msgp->mtext) + strlen(str) < GSERV_BUFSZ) \ | |
138 strcat(msgp->mtext,str); \ | |
139 else \ | |
140 { \ | |
141 fprintf(stderr,"%s: not enough message buffer space\n",progname); \ | |
142 exit(1); \ | |
143 } \ | |
144 | |
145 #endif /* SYSV_IPC */ | |
146 | |
147 #if defined(INTERNET_DOMAIN_SOCKETS) || defined(UNIX_DOMAIN_SOCKETS) | |
148 #include <sys/socket.h> | |
149 #endif /* INTERNET_DOMAIN_SOCKETS || UNIX_DOMAIN_SOCKETS */ | |
150 | |
151 #ifdef INTERNET_DOMAIN_SOCKETS | |
152 #include <netdb.h> | |
153 #include <netinet/in.h> | |
154 #include <arpa/inet.h> | |
155 #define TABLE_SIZE 101 /* The number of entries in the hash table */ | |
156 #define HASH(host) host /* Rather simplistic hash function */ | |
157 #define DEFAULT_PORT 21490 /* default port number to use is | |
158 * DEFAULT_PORT + uid */ | |
159 #endif /* INTERNET_DOMAIN_SOCKETS */ | |
160 | |
161 #ifdef UNIX_DOMAIN_SOCKETS | |
162 #include <sys/un.h> | |
163 #define HIDE_UNIX_SOCKET /* put the unix socket in a protected dir */ | |
164 #endif /* UNIX_DOMAIN_SOCKETS */ | |
165 | |
166 /* On some platforms, we need to do the equivalent of "stty litout" to get | |
167 * characters like ^D to pass through to emacs. This problem has only | |
168 * been observed under emacs18; fsf19 and lemacs are probably okay without it. | |
169 */ | |
170 #ifndef DONT_USE_LITOUT | |
171 #if !defined(HAVE_TERMIO) && !defined(HAVE_TERMIOS) && !defined(VMS) | |
172 #define USE_LITOUT | |
173 #endif | |
174 #endif | |
175 | |
176 | |
177 #define HOSTNAMSZ 255 /* max size of a hostname */ | |
178 #define REPLYSIZ 300 /* max size of reply from server to client */ | |
179 #undef FALSE | |
180 #define FALSE 0 | |
181 #undef TRUE | |
182 #define TRUE 1 | |
183 | |
184 extern char *optarg; | |
185 extern int optind; | |
186 extern char *progname; | |
187 extern char *tmpdir; | |
188 | |
189 /* The casts shut Sun's compiler up and are safe in the context these | |
190 are actually used. */ | |
191 #define max2(x,y) (((int) (x) > (int) (y)) ? (x) : (y)) | |
192 #define min2(x,y) (((int) (x) < (int) (y)) ? (x) : (y)) | |
193 | |
194 #ifndef _NFILE /* rough guess at maximum number of open files */ | |
195 #define _NFILE 20 | |
196 #endif | |
197 | |
198 #define EOT_STR "\004" | |
199 #define EOT_CHR '\004' | |
200 | |
201 /* connection types */ | |
202 #define CONN_UNIX 0 | |
203 #define CONN_INTERNET 1 | |
204 #define CONN_IPC 2 | |
205 | |
206 /* function declarations */ | |
207 int make_connection (char *hostarg, int portarg, int *s); | |
208 #ifdef SYSV_IPC | |
209 void disconnect_from_ipc_server(); | |
210 #endif | |
211 #if defined(INTERNET_DOMAIN_SOCKETS) || defined(UNIX_DOMAIN_SOCKETS) | |
442 | 212 void send_string (int s, const char *msg); |
428 | 213 void disconnect_from_server (int s, int echo); |
214 int read_line (int s, char *dest); | |
215 #endif | |
216 #ifdef INTERNET_DOMAIN_SOCKETS | |
217 int internet_addr (char *host); | |
218 #endif |