Commit 6bfd98e7 authored by Stefan Monnier's avatar Stefan Monnier

* process.h (struct Lisp_Process): Replace Lisp_Objects `pid',

`raw_status_high', and `raw_status_low' with plain integers, and move
them to the end of the structure.

* alloc.c (allocate_process): Use PSEUDOVECSIZE to initialize the
pseudovector's size field so only the Lisp_Object fields get GC'd.

* process.c (update_status, make_process, Fdelete_process)
(Fprocess_status, list_processes_1, start_process_unwind)
(create_process, Fmake_network_process, server_accept_connection)
(wait_reading_process_output, send_process, Fprocess_running_child_p)
(process_send_signal, proc_encode_coding_system, Fprocess_send_eof)
(sigchld_handler, status_notify): Adjust to new non-Lisp fields for
`pid' and `raw_status'.
(Fprocess_id, Fsignal_process): Same, and additionally use floats when
representing PIDs that are larger than most-positive-fixnum.
parent 67438f77
2006-04-08 Stefan Monnier <monnier@iro.umontreal.ca>
* process.h (struct Lisp_Process): Replace Lisp_Objects `pid',
`raw_status_high', and `raw_status_low' with plain integers, and move
them to the end of the structure.
* alloc.c (allocate_process): Use PSEUDOVECSIZE to initialize the
pseudovector's size field so only the Lisp_Object fields get GC'd.
* process.c (update_status, make_process, Fdelete_process)
(Fprocess_status, list_processes_1, start_process_unwind)
(create_process, Fmake_network_process, server_accept_connection)
(wait_reading_process_output, send_process, Fprocess_running_child_p)
(process_send_signal, proc_encode_coding_system, Fprocess_send_eof)
(sigchld_handler, status_notify): Adjust to new non-Lisp fields for
`pid' and `raw_status'.
(Fprocess_id, Fsignal_process): Same, and additionally use floats when
representing PIDs that are larger than most-positive-fixnum.
* keymap.c (describe_map): Only use XINT if we checked INTEGERP.
* lisp.h (OFFSETOF, PSEUDOVECSIZE): New macros.
2006-04-08 Eli Zaretskii <eliz@gnu.org>
* w32fns.c (Fx_show_tip): Add 3 to the 5th arg of SetWindowPos.
......
......@@ -3003,13 +3003,17 @@ allocate_frame ()
struct Lisp_Process *
allocate_process ()
{
EMACS_INT len = VECSIZE (struct Lisp_Process);
struct Lisp_Vector *v = allocate_vectorlike (len, MEM_TYPE_PROCESS);
/* Memory-footprint of the object in nb of Lisp_Object fields. */
EMACS_INT memlen = VECSIZE (struct Lisp_Process);
/* Size if we only count the actual Lisp_Object fields (which need to be
traced by the GC). */
EMACS_INT lisplen = PSEUDOVECSIZE (struct Lisp_Process, pid);
struct Lisp_Vector *v = allocate_vectorlike (memlen, MEM_TYPE_PROCESS);
EMACS_INT i;
for (i = 0; i < len; ++i)
for (i = 0; i < lisplen; ++i)
v->contents[i] = Qnil;
v->size = len;
v->size = lisplen;
return (struct Lisp_Process *) v;
}
......@@ -5558,6 +5562,10 @@ mark_object (arg)
if (size & PSEUDOVECTOR_FLAG)
size &= PSEUDOVECTOR_SIZE_MASK;
/* Note that this size is not the memory-footprint size, but only
the number of Lisp_Object fields that we should trace.
The distinction is used e.g. by Lisp_Process which places extra
non-Lisp_Object fields at the end of the structure. */
for (i = 0; i < size; i++) /* and then mark its elements */
mark_object (ptr->contents[i]);
}
......
This diff is collapsed.
......@@ -51,8 +51,6 @@ struct Lisp_Process
Lisp_Object log;
/* Buffer that output is going to */
Lisp_Object buffer;
/* Number of this process */
Lisp_Object pid;
/* t if this is a real child process.
For a net connection, it is a plist based on the arguments to make-network-process. */
Lisp_Object childp;
......@@ -63,10 +61,6 @@ struct Lisp_Process
/* Non-nil means kill silently if Emacs is exited.
This is the inverse of the `query-on-exit' flag. */
Lisp_Object kill_without_query;
/* Record the process status in the raw form in which it comes from `wait'.
This is to avoid consing in a signal handler. */
Lisp_Object raw_status_low;
Lisp_Object raw_status_high;
/* Symbol indicating status of process.
This may be a symbol: run, open, or closed.
Or it may be a list, whose car is stop, exit or signal
......@@ -112,6 +106,19 @@ struct Lisp_Process
Lisp_Object read_output_delay;
/* Skip reading this process on next read. */
Lisp_Object read_output_skip;
/* After this point, there are no Lisp_Objects any more. */
/* Number of this process.
allocate_process assumes this is the first non-Lisp_Object field.
A value 0 is used for pseudo-processes such as network connections. */
pid_t pid;
/* Record the process status in the raw form in which it comes from `wait'.
This is to avoid consing in a signal handler. The `raw_status_new'
flag indicates that `raw_status' contains a new status that still
needs to be synced to `status'. */
int raw_status_new : 1;
int raw_status;
};
/* Every field in the preceding structure except for the first two
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment