Mercurial > hg > xemacs-beta
comparison src/procimpl.h @ 263:727739f917cb r20-5b30
Import from CVS: tag r20-5b30
author | cvs |
---|---|
date | Mon, 13 Aug 2007 10:24:41 +0200 |
parents | |
children | 90d73dddcdc4 |
comparison
equal
deleted
inserted
replaced
262:9d8607af9e13 | 263:727739f917cb |
---|---|
1 /* Processes implementation header | |
2 Copyright (C) 1985, 1992, 1993, 1994 Free Software Foundation, Inc. | |
3 | |
4 This file is part of XEmacs. | |
5 | |
6 XEmacs is free software; you can redistribute it and/or modify it | |
7 under the terms of the GNU General Public License as published by the | |
8 Free Software Foundation; either version 2, or (at your option) any | |
9 later version. | |
10 | |
11 XEmacs is distributed in the hope that it will be useful, but WITHOUT | |
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
14 for more details. | |
15 | |
16 You should have received a copy of the GNU General Public License | |
17 along with XEmacs; see the file COPYING. If not, write to | |
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
19 Boston, MA 02111-1307, USA. */ | |
20 | |
21 /* This file must be only included by the process implementation files: | |
22 process-unix.c, process-msw.c etc. The Lisp_Process structure and other | |
23 contents of this file is not exported to the rest of the world */ | |
24 | |
25 #ifndef _XEMACS_PROCIMPL_H_ | |
26 #define _XEMACS_PROCIMPL_H_ | |
27 | |
28 struct Lisp_Process; | |
29 | |
30 /* | |
31 * Structure which keeps methods of the process implementation. | |
32 * There is only one object of this class exists in a perticular | |
33 * XEmacs implementation. | |
34 */ | |
35 | |
36 /* #### Comment me... */ | |
37 | |
38 struct process_methods | |
39 { | |
40 void (*mark_process_data) (struct Lisp_Process *proc, | |
41 void (*markobj) (Lisp_Object)); | |
42 void (*print_process_data) (struct Lisp_Process *proc, | |
43 Lisp_Object printcharfun); | |
44 void (*finalize_process_data) (struct Lisp_Process *proc, int for_disksave); | |
45 void (*alloc_process_data) (struct Lisp_Process *p); | |
46 void (*init_process_io_handles) (struct Lisp_Process *p, | |
47 void* in, void* out, int flags); | |
48 int (*create_process) (struct Lisp_Process *p, | |
49 char **new_argv, CONST char *current_dir); | |
50 int (*tooltalk_connection_p) (struct Lisp_Process *p); | |
51 #ifdef HAVE_SOCKETS | |
52 void (*open_network_stream) (Lisp_Object name, Lisp_Object host, | |
53 Lisp_Object service, Lisp_Object family, | |
54 void** vinfd, void** voutfd); | |
55 #ifdef HAVE_MULTICAST | |
56 void (*open_multicast_group) (Lisp_Object name, Lisp_Object dest, | |
57 Lisp_Object port, Lisp_Object ttl, | |
58 void** vinfd, void** voutfd); | |
59 #endif /* HAVE_MULTICAST */ | |
60 #endif /* HAVE_SOCKETS */ | |
61 Lisp_Object (*canonicalize_host_name) (Lisp_Object host); | |
62 int (*set_window_size) (struct Lisp_Process* p, int height, int width); | |
63 void (*send_process) (Lisp_Object proc, struct lstream* lstream); | |
64 void (*reap_exited_processes) (void); | |
65 void (*update_status_if_terminated) (struct Lisp_Process* p); | |
66 void (*kill_child_process) (Lisp_Object proc, int signo, | |
67 int current_group, int nomsg); | |
68 int (*kill_process_by_pid) (int pid, int sigcode); | |
69 int (*process_send_eof) (Lisp_Object proc); | |
70 Lisp_Object (*get_tty_name) (struct Lisp_Process *p); | |
71 USID (*deactivate_process) (struct Lisp_Process *p); | |
72 void (*init_process) (void); | |
73 }; | |
74 | |
75 extern struct process_methods the_process_methods; | |
76 | |
77 /* | |
78 * Accessors for process_methods | |
79 */ | |
80 | |
81 #define HAS_PROCMETH_P(name) (the_process_methods.name != 0) | |
82 #define PROCMETH(name, par) ((the_process_methods.name) par) | |
83 #define PROCMETH_OR_GIVEN(name, par, given) (HAS_PROCMETH_P(name) ? PROCMETH(name, par) : (given)) | |
84 #define MAYBE_PROCMETH(name, par) do { if (HAS_PROCMETH_P(name)) PROCMETH(name, par); } while (0); | |
85 #define MAYBE_LISP_PROCMETH(name, par) PROCMETH_OR_GIVEN(name, par, Qnil) | |
86 #define MAYBE_INT_PROCMETH(name, par) PROCMETH_OR_GIVEN(name, par, 0) | |
87 #define PROCESS_HAS_METHOD(os, name) the_process_methods.name = os##_##name | |
88 | |
89 /* | |
90 * Structure records pertinent information about open channels. | |
91 * There is one channel associated with each process. | |
92 */ | |
93 | |
94 struct Lisp_Process | |
95 { | |
96 struct lcrecord_header header; | |
97 /* Name of this process */ | |
98 Lisp_Object name; | |
99 /* List of command arguments that this process was run with */ | |
100 Lisp_Object command; | |
101 /* (funcall FILTER PROC STRING) (if FILTER is non-nil) | |
102 to dispose of a bunch of chars from the process all at once */ | |
103 Lisp_Object filter; | |
104 /* (funcall SENTINEL PROCESS) when process state changes */ | |
105 Lisp_Object sentinel; | |
106 /* Buffer that output is going to */ | |
107 Lisp_Object buffer; | |
108 /* Marker set to end of last buffer-inserted output from this process */ | |
109 Lisp_Object mark; | |
110 /* Lisp_Int of subprocess' PID, or a cons of | |
111 service/host if this is really a network connection */ | |
112 Lisp_Object pid; | |
113 | |
114 /* Symbol indicating status of process. | |
115 This may be a symbol: run, stop, exit, signal */ | |
116 Lisp_Object status_symbol; | |
117 | |
118 /* Exit code if process has terminated, | |
119 signal which stopped/interrupted process | |
120 or 0 if process is running */ | |
121 int exit_code; | |
122 /* Non-false if process has exited and "dumped core" on its way down */ | |
123 char core_dumped; | |
124 | |
125 /* This next field is only actually used #ifdef ENERGIZE */ | |
126 /* if this flag is not NIL, then filter will do the read on the | |
127 channel, rather than having a call to make_string. | |
128 This only works if the filter is a subr. */ | |
129 char filter_does_read; | |
130 /* Non-nil means kill silently if Emacs is exited. */ | |
131 char kill_without_query; | |
132 char selected; | |
133 /* Event-count of last event in which this process changed status. */ | |
134 volatile int tick; | |
135 /* Event-count of last such event reported. */ | |
136 int update_tick; | |
137 /* Low level streams used in input and output, connected to child */ | |
138 Lisp_Object pipe_instream; | |
139 Lisp_Object pipe_outstream; | |
140 #ifdef FILE_CODING | |
141 /* Data end streams, decoding and encoding pipe_* streams */ | |
142 Lisp_Object coding_instream; | |
143 Lisp_Object coding_outstream; | |
144 #endif | |
145 | |
146 /* Implementation dependent data */ | |
147 void *process_data; | |
148 }; | |
149 | |
150 /* Macros to refer to data connection streams */ | |
151 #ifdef FILE_CODING | |
152 #define DATA_INSTREAM(p) (p)->coding_instream | |
153 #define DATA_OUTSTREAM(p) (p)->coding_outstream | |
154 #else | |
155 #define DATA_INSTREAM(p) (p)->pipe_instream | |
156 #define DATA_OUTSTREAM(p) (p)->pipe_outstream | |
157 #endif | |
158 | |
159 /* Random externs from process.c */ | |
160 extern Lisp_Object Qrun, Qstop, Qopen, Qclosed; | |
161 extern Lisp_Object Qtcpip; | |
162 extern Lisp_Object Vprocess_connection_type; | |
163 extern Lisp_Object Vprocess_list; | |
164 | |
165 extern c_hashtable usid_to_process; | |
166 | |
167 extern volatile int process_tick; | |
168 | |
169 #ifdef HAVE_MULTICAST | |
170 extern Lisp_Object Qmulticast; | |
171 #endif | |
172 | |
173 #ifdef PROCESS_IO_BLOCKING | |
174 extern Lisp_Object network_stream_blocking_port_list; | |
175 #endif /* PROCESS_IO_BLOCKING */ | |
176 | |
177 Lisp_Object make_process_internal (Lisp_Object name); | |
178 void init_process_io_handles (struct Lisp_Process *p, void* in, | |
179 void* out, int flags); | |
180 void send_process (Lisp_Object proc, | |
181 Lisp_Object relocatable, | |
182 CONST Bufbyte *nonrelocatable, | |
183 int start, int len); | |
184 | |
185 #endif /* _XEMACS_PROCIMPL_H_ */ |