Mercurial > hg > xemacs-beta
diff src/process.c @ 412:697ef44129c6 r21-2-14
Import from CVS: tag r21-2-14
author | cvs |
---|---|
date | Mon, 13 Aug 2007 11:20:41 +0200 |
parents | de805c49cfc1 |
children | 41dbb7a9d5f2 |
line wrap: on
line diff
--- a/src/process.c Mon Aug 13 11:19:22 2007 +0200 +++ b/src/process.c Mon Aug 13 11:20:41 2007 +0200 @@ -58,7 +58,7 @@ #include "systty.h" #include "syswait.h" -Lisp_Object Qprocessp, Qprocess_live_p; +Lisp_Object Qprocessp; /* Process methods */ struct process_methods the_process_methods; @@ -71,7 +71,7 @@ /* Qrun => Qopen, Qexit => Qclosed for "network connection" processes */ Lisp_Object Qopen, Qclosed; /* Protocol families */ -Lisp_Object Qtcp, Qudp; +Lisp_Object Qtcpip; #ifdef HAVE_MULTICAST Lisp_Object Qmulticast; /* Will be used for occasional warnings */ @@ -107,27 +107,26 @@ Lisp_Object Vprocess_list; extern Lisp_Object Vlisp_EXEC_SUFFIXES; -Lisp_Object Vnull_device; static Lisp_Object -mark_process (Lisp_Object obj) +mark_process (Lisp_Object obj, void (*markobj) (Lisp_Object)) { - Lisp_Process *proc = XPROCESS (obj); - MAYBE_PROCMETH (mark_process_data, (proc)); - mark_object (proc->name); - mark_object (proc->command); - mark_object (proc->filter); - mark_object (proc->sentinel); - mark_object (proc->buffer); - mark_object (proc->mark); - mark_object (proc->pid); - mark_object (proc->pipe_instream); - mark_object (proc->pipe_outstream); + struct Lisp_Process *proc = XPROCESS (obj); + MAYBE_PROCMETH (mark_process_data, (proc, markobj)); + markobj (proc->name); + markobj (proc->command); + markobj (proc->filter); + markobj (proc->sentinel); + markobj (proc->buffer); + markobj (proc->mark); + markobj (proc->pid); + markobj (proc->pipe_instream); + markobj (proc->pipe_outstream); #ifdef FILE_CODING - mark_object (proc->coding_instream); - mark_object (proc->coding_outstream); + markobj (proc->coding_instream); + markobj (proc->coding_outstream); #endif return proc->status_symbol; } @@ -135,7 +134,7 @@ static void print_process (Lisp_Object obj, Lisp_Object printcharfun, int escapeflag) { - Lisp_Process *proc = XPROCESS (obj); + struct Lisp_Process *proc = XPROCESS (obj); if (print_readably) error ("printing unreadable object #<process %s>", @@ -148,10 +147,10 @@ else { int netp = network_connection_p (obj); - write_c_string ((netp ? GETTEXT ("#<network connection ") : + write_c_string (((netp) ? GETTEXT ("#<network connection ") : GETTEXT ("#<process ")), printcharfun); print_internal (proc->name, printcharfun, 1); - write_c_string ((netp ? " " : " pid "), printcharfun); + write_c_string (((netp) ? " " : " pid "), printcharfun); print_internal (proc->pid, printcharfun, 1); write_c_string (" state:", printcharfun); print_internal (proc->status_symbol, printcharfun, 1); @@ -161,7 +160,7 @@ } #ifdef HAVE_WINDOW_SYSTEM -extern void debug_process_finalization (Lisp_Process *p); +extern void debug_process_finalization (struct Lisp_Process *p); #endif /* HAVE_WINDOW_SYSTEM */ static void @@ -169,7 +168,7 @@ { /* #### this probably needs to be tied into the tty event loop */ /* #### when there is one */ - Lisp_Process *p = (Lisp_Process *) header; + struct Lisp_Process *p = (struct Lisp_Process *) header; #ifdef HAVE_WINDOW_SYSTEM if (!for_disksave) { @@ -187,7 +186,7 @@ DEFINE_LRECORD_IMPLEMENTATION ("process", process, mark_process, print_process, finalize_process, - 0, 0, 0, Lisp_Process); + 0, 0, struct Lisp_Process); /************************************************************************/ /* basic process accessors */ @@ -197,7 +196,8 @@ directly to the child process, rather than en/decoding FILE_CODING streams */ void -get_process_streams (Lisp_Process *p, Lisp_Object *instr, Lisp_Object *outstr) +get_process_streams (struct Lisp_Process *p, + Lisp_Object *instr, Lisp_Object *outstr) { assert (p); assert (NILP (p->pipe_instream) || LSTREAMP(p->pipe_instream)); @@ -206,14 +206,14 @@ *outstr = p->pipe_outstream; } -Lisp_Process * +struct Lisp_Process * get_process_from_usid (USID usid) { - const void *vval; + CONST void *vval; assert (usid != USID_ERROR && usid != USID_DONTHASH); - if (gethash ((const void*)usid, usid_to_process, &vval)) + if (gethash ((CONST void*)usid, usid_to_process, &vval)) { Lisp_Object proc; CVOID_TO_LISP (proc, vval); @@ -224,19 +224,19 @@ } int -get_process_selected_p (Lisp_Process *p) +get_process_selected_p (struct Lisp_Process *p) { return p->selected; } void -set_process_selected_p (Lisp_Process *p, int selected_p) +set_process_selected_p (struct Lisp_Process *p, int selected_p) { p->selected = !!selected_p; } int -connected_via_filedesc_p (Lisp_Process *p) +connected_via_filedesc_p (struct Lisp_Process *p) { return MAYBE_INT_PROCMETH (tooltalk_connection_p, (p)); } @@ -245,7 +245,7 @@ int network_connection_p (Lisp_Object process) { - return CONSP (XPROCESS (process)->pid); + return GC_CONSP (XPROCESS (process)->pid); } #endif @@ -257,14 +257,6 @@ return PROCESSP (obj) ? Qt : Qnil; } -DEFUN ("process-live-p", Fprocess_live_p, 1, 1, 0, /* -Return t if OBJECT is a process that is alive. -*/ - (obj)) -{ - return PROCESSP (obj) && PROCESS_LIVE_P (XPROCESS (obj)) ? Qt : Qnil; -} - DEFUN ("process-list", Fprocess_list, 0, 0, 0, /* Return a list of all processes. */ @@ -280,7 +272,7 @@ { Lisp_Object tail; - if (PROCESSP (name)) + if (GC_PROCESSP (name)) return name; if (!gc_in_progress) @@ -288,7 +280,7 @@ of a signal or crash. */ CHECK_STRING (name); - for (tail = Vprocess_list; CONSP (tail); tail = XCDR (tail)) + for (tail = Vprocess_list; GC_CONSP (tail); tail = XCDR (tail)) { Lisp_Object proc = XCAR (tail); QUIT; @@ -306,18 +298,18 @@ { Lisp_Object buf, tail, proc; - if (NILP (name)) return Qnil; + if (GC_NILP (name)) return Qnil; buf = Fget_buffer (name); - if (NILP (buf)) return Qnil; + if (GC_NILP (buf)) return Qnil; - for (tail = Vprocess_list; CONSP (tail); tail = XCDR (tail)) + for (tail = Vprocess_list; GC_CONSP (tail); tail = XCDR (tail)) { /* jwz: do not quit here - it isn't necessary, as there is no way for Vprocess_list to get circular or overwhelmingly long, and this function is called from layout_mode_element under redisplay. */ /* QUIT; */ proc = XCAR (tail); - if (PROCESSP (proc) && EQ (XPROCESS (proc)->buffer, buf)) + if (GC_PROCESSP (proc) && EQ (XPROCESS (proc)->buffer, buf)) return proc; } return Qnil; @@ -339,28 +331,28 @@ /* This may be called during a GC from process_send_signal() from kill_buffer_processes() if emacs decides to abort(). */ - if (PROCESSP (name)) + if (GC_PROCESSP (name)) return name; - if (STRINGP (name)) + if (GC_STRINGP (name)) { obj = Fget_process (name); - if (NILP (obj)) + if (GC_NILP (obj)) obj = Fget_buffer (name); - if (NILP (obj)) + if (GC_NILP (obj)) error ("Process %s does not exist", XSTRING_DATA (name)); } - else if (NILP (name)) + else if (GC_NILP (name)) obj = Fcurrent_buffer (); else obj = name; /* Now obj should be either a buffer object or a process object. */ - if (BUFFERP (obj)) + if (GC_BUFFERP (obj)) { proc = Fget_buffer_process (obj); - if (NILP (proc)) + if (GC_NILP (proc)) error ("Buffer %s has no process", XSTRING_DATA (XBUFFER(obj)->name)); } else @@ -424,7 +416,8 @@ { Lisp_Object val, name1; int i; - Lisp_Process *p = alloc_lcrecord_type (Lisp_Process, &lrecord_process); + struct Lisp_Process *p = + alloc_lcrecord_type (struct Lisp_Process, &lrecord_process); /* If name is already in use, modify it until it is unused. */ name1 = name; @@ -471,7 +464,7 @@ } void -init_process_io_handles (Lisp_Process *p, void* in, void* out, int flags) +init_process_io_handles (struct Lisp_Process *p, void* in, void* out, int flags) { USID usid = event_stream_create_stream_pair (in, out, &p->pipe_instream, &p->pipe_outstream, @@ -484,7 +477,7 @@ { Lisp_Object proc = Qnil; XSETPROCESS (proc, p); - puthash ((const void*)usid, LISP_TO_VOID (proc), usid_to_process); + puthash ((CONST void*)usid, LISP_TO_VOID (proc), usid_to_process); } MAYBE_PROCMETH (init_process_io_handles, (p, in, out, flags)); @@ -506,7 +499,7 @@ create_process (Lisp_Object process, Lisp_Object *argv, int nargv, Lisp_Object program, Lisp_Object cur_dir) { - Lisp_Process *p = XPROCESS (process); + struct Lisp_Process *p = XPROCESS (process); int pid; /* *_create_process may change status_symbol, if the process @@ -517,7 +510,7 @@ pid = PROCMETH (create_process, (p, argv, nargv, program, cur_dir)); p->pid = make_int (pid); - if (PROCESS_LIVE_P (p)) + if (!NILP(p->pipe_instream)) event_stream_select_process (p); } @@ -666,7 +659,7 @@ DEFUN ("open-network-stream-internal", Fopen_network_stream_internal, 4, 5, 0, /* Open a TCP connection for a service to a host. -Return a subprocess-object to represent the connection. +Returns a subprocess-object to represent the connection. Input and output work as for subprocesses; `delete-process' closes it. NAME is name for process. It is modified if necessary to make it unique. @@ -678,18 +671,10 @@ Third arg is name of the host to connect to, or its IP address. Fourth arg SERVICE is name of the service desired, or an integer specifying a port number to connect to. -Fifth argument PROTOCOL is a network protocol. Currently 'tcp - (Transmission Control Protocol) and 'udp (User Datagram Protocol) are - supported. When omitted, 'tcp is assumed. - -Ouput via `process-send-string' and input via buffer or filter (see -`set-process-filter') are stream-oriented. That means UDP datagrams are -not guaranteed to be sent and received in discrete packets. (But small -datagrams around 500 bytes that are not truncated by `process-send-string' -are usually fine.) Note further that UDP protocol does not guard against -lost packets. +Fifth argument FAMILY is a protocol family. When omitted, 'tcp/ip +\(Internet protocol family TCP/IP) is assumed. */ - (name, buffer, host, service, protocol)) + (name, buffer, host, service, family)) { /* !!#### This function has not been Mule-ized */ /* This function can GC */ @@ -697,17 +682,17 @@ struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5, ngcpro1; void *inch, *outch; - GCPRO5 (name, buffer, host, service, protocol); + GCPRO5 (name, buffer, host, service, family); CHECK_STRING (name); - if (NILP(protocol)) - protocol = Qtcp; + if (NILP(family)) + family = Qtcpip; else - CHECK_SYMBOL (protocol); + CHECK_SYMBOL (family); /* Since this code is inside HAVE_SOCKETS, existence of open_network_stream is mandatory */ - PROCMETH (open_network_stream, (name, host, service, protocol, + PROCMETH (open_network_stream, (name, host, service, family, &inch, &outch)); if (!NILP (buffer)) @@ -731,7 +716,7 @@ DEFUN ("open-multicast-group-internal", Fopen_multicast_group_internal, 5, 5, 0, /* Open a multicast connection on the specified dest/port/ttl. -Return a subprocess-object to represent the connection. +Returns a subprocess-object to represent the connection. Input and output work as for subprocesses; `delete-process' closes it. NAME is name for process. It is modified if necessary to make it unique. @@ -820,7 +805,7 @@ Bytecount nbytes, nchars; Bufbyte chars[1024]; Lisp_Object outstream; - Lisp_Process *p = XPROCESS (proc); + struct Lisp_Process *p = XPROCESS (proc); /* If there is a lot of output from the subprocess, the loop in execute_internal_event() might call read_process_output() more @@ -830,7 +815,7 @@ Really, the loop in execute_internal_event() should check itself for a process-filter change, like in status_notify(); but the struct Lisp_Process is not exported outside of this file. */ - if (!PROCESS_LIVE_P (p)) + if (NILP(p->pipe_instream)) return -1; /* already closed */ if (!NILP (p->filter) && (p->filter_does_read)) @@ -965,7 +950,7 @@ void send_process (Lisp_Object proc, - Lisp_Object relocatable, const Bufbyte *nonrelocatable, + Lisp_Object relocatable, CONST Bufbyte *nonrelocatable, int start, int len) { /* This function can GC */ @@ -980,7 +965,7 @@ if (nonrelocatable) lstream = make_fixed_buffer_input_stream (nonrelocatable + start, len); - else if (BUFFERP (relocatable)) + else if (GC_BUFFERP (relocatable)) lstream = make_lisp_buffer_input_stream (XBUFFER (relocatable), start, start + len, 0); else @@ -1039,7 +1024,7 @@ set_process_filter (Lisp_Object proc, Lisp_Object filter, int filter_does_read) { CHECK_PROCESS (proc); - if (PROCESS_LIVE_P (XPROCESS (proc))) { + if (PROCESS_LIVE_P (proc)) { if (EQ (filter, Qt)) event_stream_unselect_process (XPROCESS (proc)); else @@ -1074,25 +1059,24 @@ return XPROCESS (proc)->filter; } -DEFUN ("process-send-region", Fprocess_send_region, 3, 4, 0, /* -Send current contents of the region between START and END as input to PROCESS. +DEFUN ("process-send-region", Fprocess_send_region, 3, 3, 0, /* +Send current contents of region as input to PROCESS. PROCESS may be a process name or an actual process. -BUFFER specifies the buffer to look in; if nil, the current buffer is used. +Called from program, takes three arguments, PROCESS, START and END. If the region is more than 500 or so characters long, it is sent in several bunches. This may happen even for shorter regions. Output from processes can arrive in between bunches. */ - (process, start, end, buffer)) + (process, start, end)) { /* This function can GC */ Lisp_Object proc = get_process (process); Bufpos st, en; - struct buffer *buf = decode_buffer (buffer, 0); + + get_buffer_range_char (current_buffer, start, end, &st, &en, 0); - XSETBUFFER (buffer, buf); - get_buffer_range_char (buf, start, end, &st, &en, 0); - - send_process (proc, buffer, 0, st, en - st); + send_process (proc, Fcurrent_buffer (), 0, + st, en - st); return Qnil; } @@ -1129,7 +1113,6 @@ (process)) { process = get_process (process); - CHECK_LIVE_PROCESS (process); return decoding_stream_coding_system (XLSTREAM (XPROCESS (process)->coding_instream) ); } @@ -1139,7 +1122,6 @@ (process)) { process = get_process (process); - CHECK_LIVE_PROCESS (process); return encoding_stream_coding_system (XLSTREAM (XPROCESS (process)->coding_outstream)); } @@ -1149,7 +1131,6 @@ (process)) { process = get_process (process); - CHECK_LIVE_PROCESS (process); return Fcons (decoding_stream_coding_system (XLSTREAM (XPROCESS (process)->coding_instream)), encoding_stream_coding_system @@ -1164,8 +1145,6 @@ { codesys = Fget_coding_system (codesys); process = get_process (process); - CHECK_LIVE_PROCESS (process); - set_decoding_stream_coding_system (XLSTREAM (XPROCESS (process)->coding_instream), codesys); return Qnil; @@ -1179,8 +1158,6 @@ { codesys = Fget_coding_system (codesys); process = get_process (process); - CHECK_LIVE_PROCESS (process); - set_encoding_stream_coding_system (XLSTREAM (XPROCESS (process)->coding_outstream), codesys); return Qnil; @@ -1189,8 +1166,6 @@ DEFUN ("set-process-coding-system", Fset_process_coding_system, 1, 3, 0, /* Set coding-systems of PROCESS to DECODING and ENCODING. -DECODING will be used to decode subprocess output and ENCODING to -encode subprocess input. */ (process, decoding, encoding)) { @@ -1212,7 +1187,7 @@ static Lisp_Object exec_sentinel_unwind (Lisp_Object datum) { - Lisp_Cons *d = XCONS (datum); + struct Lisp_Cons *d = XCONS (datum); XPROCESS (d->car)->sentinel = d->cdr; free_cons (d); return Qnil; @@ -1223,7 +1198,7 @@ { /* This function can GC */ int speccount = specpdl_depth (); - Lisp_Process *p = XPROCESS (proc); + struct Lisp_Process *p = XPROCESS (proc); Lisp_Object sentinel = p->sentinel; if (NILP (sentinel)) @@ -1268,13 +1243,13 @@ } -const char * +CONST char * signal_name (int signum) { if (signum >= 0 && signum < NSIG) - return (const char *) sys_siglist[signum]; + return (CONST char *) sys_siglist[signum]; - return (const char *) GETTEXT ("unknown signal"); + return (CONST char *) GETTEXT ("unknown signal"); } void @@ -1293,7 +1268,7 @@ /* Return a string describing a process status list. */ static Lisp_Object -status_message (Lisp_Process *p) +status_message (struct Lisp_Process *p) { Lisp_Object symbol = p->status_symbol; int code = p->exit_code; @@ -1377,7 +1352,7 @@ for (tail = Vprocess_list; CONSP (tail); tail = XCDR (tail)) { Lisp_Object proc = XCAR (tail); - Lisp_Process *p = XPROCESS (proc); + struct Lisp_Process *p = XPROCESS (proc); /* p->tick is also volatile. Same thing as above applies. */ int this_process_tick; @@ -1544,7 +1519,9 @@ if (network_connection_p (proc)) error ("Network connection %s is not a subprocess", XSTRING_DATA (XPROCESS(proc)->name)); - CHECK_LIVE_PROCESS (proc); + if (!PROCESS_LIVE_P (proc)) + error ("Process %s is not active", + XSTRING_DATA (XPROCESS(proc)->name)); MAYBE_PROCMETH (kill_child_process, (proc, signo, current_group, nomsg)); } @@ -1645,7 +1622,7 @@ name = string_data (XSYMBOL (sigcode)->name); #define handle_signal(signal) \ - else if (!strcmp ((const char *) name, #signal)) \ + else if (!strcmp ((CONST char *) name, #signal)) \ XSETINT (sigcode, signal) if (0) @@ -1834,7 +1811,7 @@ void deactivate_process (Lisp_Object proc) { - Lisp_Process *p = XPROCESS (proc); + struct Lisp_Process *p = XPROCESS (proc); USID usid; /* It's possible that we got as far in the process-creation @@ -1861,7 +1838,7 @@ p->pipe_outstream); if (usid != USID_DONTHASH) - remhash ((const void*)usid, usid_to_process); + remhash ((CONST void*)usid, usid_to_process); p->pipe_instream = Qnil; p->pipe_outstream = Qnil; @@ -1887,7 +1864,7 @@ (proc)) { /* This function can GC */ - Lisp_Process *p; + struct Lisp_Process *p; proc = get_process (proc); p = XPROCESS (proc); if (network_connection_p (proc)) @@ -1898,7 +1875,7 @@ p->tick++; process_tick++; } - else if (PROCESS_LIVE_P (p)) + else if (!NILP(p->pipe_instream)) { Fkill_process (proc, Qnil); /* Do this now, since remove_process will make sigchld_handler do nothing. */ @@ -1921,16 +1898,16 @@ { Lisp_Object tail; - for (tail = Vprocess_list; CONSP (tail); + for (tail = Vprocess_list; GC_CONSP (tail); tail = XCDR (tail)) { Lisp_Object proc = XCAR (tail); - if (PROCESSP (proc) - && (NILP (buffer) || EQ (XPROCESS (proc)->buffer, buffer))) + if (GC_PROCESSP (proc) + && (GC_NILP (buffer) || GC_EQ (XPROCESS (proc)->buffer, buffer))) { if (network_connection_p (proc)) Fdelete_process (proc); - else if (PROCESS_LIVE_P (XPROCESS (proc))) + else if (!NILP (XPROCESS (proc)->pipe_instream)) process_send_signal (proc, SIGHUP, 0, 1); } } @@ -1992,24 +1969,19 @@ void syms_of_process (void) { - INIT_LRECORD_IMPLEMENTATION (process); - defsymbol (&Qprocessp, "processp"); - defsymbol (&Qprocess_live_p, "process-live-p"); defsymbol (&Qrun, "run"); defsymbol (&Qstop, "stop"); defsymbol (&Qopen, "open"); defsymbol (&Qclosed, "closed"); - defsymbol (&Qtcp, "tcp"); - defsymbol (&Qudp, "udp"); + defsymbol (&Qtcpip, "tcp/ip"); #ifdef HAVE_MULTICAST defsymbol(&Qmulticast, "multicast"); /* Used for occasional warnings */ #endif DEFSUBR (Fprocessp); - DEFSUBR (Fprocess_live_p); DEFSUBR (Fget_process); DEFSUBR (Fget_buffer_process); DEFSUBR (Fdelete_process); @@ -2076,22 +2048,6 @@ delete_exited_processes = 1; - DEFVAR_CONST_LISP ("null-device", &Vnull_device /* -Name of the null device, which differs from system to system. -The null device is a filename that acts as a sink for arbitrary amounts of -data, which is discarded, or as a source for a zero-length file. -It is available on all the systems that we currently support, but with -different names (typically either `/dev/null' or `nul'). - -Note that there is also a /dev/zero on most modern Unix versions (including -Cygwin), which acts like /dev/null when used as a sink, but as a source -it sends a non-ending stream of zero bytes. It's used most often along -with memory-mapping. We don't provide a Lisp variable for this because -the operations needing this are lower level than what ELisp programs -typically do, and in any case no equivalent exists under native MS Windows. -*/ ); - Vnull_device = build_string (NULL_DEVICE); - DEFVAR_LISP ("process-connection-type", &Vprocess_connection_type /* Control type of device used to communicate with subprocesses. Values are nil to use a pipe, or t or `pty' to use a pty.