* Pseudovectors initialization
@ 2012-06-26 7:26 Dmitry Antipov
2012-06-26 9:17 ` John Wiegley
` (4 more replies)
0 siblings, 5 replies; 11+ messages in thread
From: Dmitry Antipov @ 2012-06-26 7:26 UTC (permalink / raw)
To: Emacs development discussions
[-- Attachment #1: Type: text/plain, Size: 242 bytes --]
Windows, frames, processes and terminals are created rarely and tends
to have a long lifetime; so, IMHO, it's reasonable to pay a negligible
performance penalty to simplify initialization, readability and maintenance.
Any objections?
Dmitry
[-- Attachment #2: pseudovectors_init.patch --]
[-- Type: text/plain, Size: 9074 bytes --]
=== modified file 'src/alloc.c'
--- src/alloc.c 2012-06-26 05:00:30 +0000
+++ src/alloc.c 2012-06-26 07:09:41 +0000
@@ -3268,6 +3268,12 @@
for (i = 0; i < lisplen; ++i)
v->contents[i] = Qnil;
+ /* If the pseudovector is not a Lisp_Hash_Table and contains
+ members beyond Lisp_Objects at the beginning, zero out them. */
+ if (tag != PVEC_HASH_TABLE && memlen > lisplen)
+ memset ((char *) v + header_size + lisplen * word_size,
+ 0, (memlen - lisplen) * word_size);
+
XSETPVECTYPESIZE (v, tag, lisplen);
return v;
}
@@ -3289,24 +3295,15 @@
struct terminal *
allocate_terminal (void)
{
- struct terminal *t = ALLOCATE_PSEUDOVECTOR (struct terminal,
- next_terminal, PVEC_TERMINAL);
- /* Zero out the non-GC'd fields. FIXME: This should be made unnecessary. */
- memset (&t->next_terminal, 0,
- (char*) (t + 1) - (char*) &t->next_terminal);
-
- return t;
+ return ALLOCATE_PSEUDOVECTOR (struct terminal,
+ next_terminal, PVEC_TERMINAL);
}
struct frame *
allocate_frame (void)
{
- struct frame *f = ALLOCATE_PSEUDOVECTOR (struct frame,
- face_cache, PVEC_FRAME);
- /* Zero out the non-GC'd fields. FIXME: This should be made unnecessary. */
- memset (&f->face_cache, 0,
- (char *) (f + 1) - (char *) &f->face_cache);
- return f;
+ return ALLOCATE_PSEUDOVECTOR (struct frame,
+ face_cache, PVEC_FRAME);
}
=== modified file 'src/frame.c'
--- src/frame.c 2012-06-19 06:49:50 +0000
+++ src/frame.c 2012-06-26 07:00:39 +0000
@@ -267,63 +267,23 @@
f = allocate_frame ();
XSETFRAME (frame, f);
- f->desired_matrix = 0;
- f->current_matrix = 0;
- f->desired_pool = 0;
- f->current_pool = 0;
- f->glyphs_initialized_p = 0;
- f->decode_mode_spec_buffer = 0;
- f->visible = 0;
- f->async_visible = 0;
- f->output_data.nothing = 0;
- f->iconified = 0;
- f->async_iconified = 0;
+ /* Initialize Lisp data. Note that allocate_frame initializes all
+ Lisp data to nil, so do it only for slots which should not be nil. */
+ f->tool_bar_position = Qtop;
+
+ /* Initialize non-Lisp data. Note that allocate_frame zeroes out all
+ non-Lisp data, so do it only for slots which should not be zero.
+ To avoid subtle bugs and for the sake of readability, it's better to
+ initialize enum members explicitly even if their values are zero. */
f->wants_modeline = 1;
- f->auto_raise = 0;
- f->auto_lower = 0;
- f->no_split = 0;
f->garbaged = 1;
f->has_minibuffer = mini_p;
- f->focus_frame = Qnil;
- f->explicit_name = 0;
- f->can_have_scroll_bars = 0;
f->vertical_scroll_bar_type = vertical_scroll_bar_none;
- f->param_alist = Qnil;
- f->scroll_bars = Qnil;
- f->condemned_scroll_bars = Qnil;
- f->face_alist = Qnil;
- f->face_cache = NULL;
- f->menu_bar_items = Qnil;
- f->menu_bar_vector = Qnil;
- f->menu_bar_items_used = 0;
- f->buffer_predicate = Qnil;
- f->buffer_list = Qnil;
- f->buried_buffer_list = Qnil;
- f->namebuf = 0;
- f->title = Qnil;
- f->menu_bar_window = Qnil;
- f->tool_bar_window = Qnil;
- f->tool_bar_items = Qnil;
- f->tool_bar_position = Qtop;
- f->desired_tool_bar_string = f->current_tool_bar_string = Qnil;
- f->n_tool_bar_items = 0;
- f->left_fringe_width = f->right_fringe_width = 0;
- f->fringe_cols = 0;
- f->menu_bar_lines = 0;
- f->tool_bar_lines = 0;
- f->scroll_bar_actual_width = 0;
- f->border_width = 0;
- f->internal_border_width = 0;
f->column_width = 1; /* !FRAME_WINDOW_P value */
f->line_height = 1; /* !FRAME_WINDOW_P value */
- f->x_pixels_diff = f->y_pixels_diff = 0;
#ifdef HAVE_WINDOW_SYSTEM
f->want_fullscreen = FULLSCREEN_NONE;
#endif
- f->size_hint_flags = 0;
- f->win_gravity = 0;
- f->font_driver_list = NULL;
- f->font_data_list = NULL;
root_window = make_window ();
if (mini_p)
@@ -399,8 +359,6 @@
++window_select_count;
XSETFASTINT (XWINDOW (f->selected_window)->use_time, window_select_count);
- f->default_face_done_p = 0;
-
return f;
}
\f
=== modified file 'src/process.c'
--- src/process.c 2012-06-24 20:34:48 +0000
+++ src/process.c 2012-06-26 07:17:58 +0000
@@ -625,35 +625,18 @@
printmax_t i;
p = allocate_process ();
+ /* Initialize Lisp data. Note that allocate_process initializes all
+ Lisp data to nil, so do it only for slots which should not be nil. */
+ p->status = Qrun;
+ p->mark = Fmake_marker ();
+ /* Initialize non-Lisp data. Note that allocate_process zeroes out all
+ non-Lisp data, so do it only for slots which should not be zero. */
p->infd = -1;
p->outfd = -1;
- p->tick = 0;
- p->update_tick = 0;
- p->pid = 0;
- p->pty_flag = 0;
- p->raw_status_new = 0;
- p->status = Qrun;
- p->mark = Fmake_marker ();
- p->kill_without_query = 0;
- p->write_queue = Qnil;
-
-#ifdef ADAPTIVE_READ_BUFFERING
- p->adaptive_read_buffering = 0;
- p->read_output_delay = 0;
- p->read_output_skip = 0;
-#endif
#ifdef HAVE_GNUTLS
p->gnutls_initstage = GNUTLS_STAGE_EMPTY;
- /* Default log level. */
- p->gnutls_log_level = 0;
- /* GnuTLS handshakes attempted for this connection. */
- p->gnutls_handshakes_tried = 0;
- p->gnutls_p = 0;
- p->gnutls_state = NULL;
- p->gnutls_x509_cred = NULL;
- p->gnutls_anon_cred = NULL;
#endif
/* If name is already in use, modify it until it is unused. */
=== modified file 'src/terminal.c'
--- src/terminal.c 2012-01-19 07:21:25 +0000
+++ src/terminal.c 2012-06-26 05:46:51 +0000
@@ -225,7 +225,6 @@
struct terminal *terminal = allocate_terminal ();
Lisp_Object terminal_coding, keyboard_coding;
- terminal->name = NULL;
terminal->next_terminal = terminal_list;
terminal_list = terminal;
@@ -255,9 +254,6 @@
setup_coding_system (keyboard_coding, terminal->keyboard_coding);
setup_coding_system (terminal_coding, terminal->terminal_coding);
- terminal->param_alist = Qnil;
- terminal->charset_list = Qnil;
- terminal->Vselection_alist = Qnil;
return terminal;
}
=== modified file 'src/window.c'
--- src/window.c 2012-06-19 16:56:28 +0000
+++ src/window.c 2012-06-26 07:17:40 +0000
@@ -3242,13 +3242,12 @@
{
Lisp_Object parent;
register struct window *o, *p;
- int i;
o = XWINDOW (window);
p = allocate_window ();
- for (i = 0; i < VECSIZE (struct window); ++i)
- ((struct Lisp_Vector *) p)->contents[i]
- = ((struct Lisp_Vector *) o)->contents[i];
+ memcpy ((char *) p + sizeof (struct vectorlike_header),
+ (char *) o + sizeof (struct vectorlike_header),
+ sizeof (Lisp_Object) * VECSIZE (struct window));
XSETWINDOW (parent, p);
++sequence_number;
@@ -3277,10 +3276,8 @@
register struct window *w;
w = allocate_window ();
- /* Initialize all Lisp data. */
- w->frame = Qnil;
- w->mini = 0;
- w->next = w->prev = w->hchild = w->vchild = w->parent = Qnil;
+ /* Initialize Lisp data. Note that allocate_window initializes all
+ Lisp data to nil, so do it only for slots which should not be nil. */
XSETFASTINT (w->left_col, 0);
XSETFASTINT (w->top_line, 0);
XSETFASTINT (w->total_lines, 0);
@@ -3289,47 +3286,24 @@
w->normal_cols = make_float (1.0);
XSETFASTINT (w->new_total, 0);
XSETFASTINT (w->new_normal, 0);
- w->buffer = Qnil;
w->start = Fmake_marker ();
w->pointm = Fmake_marker ();
- w->force_start = w->optional_new_start = 0;
XSETFASTINT (w->hscroll, 0);
XSETFASTINT (w->min_hscroll, 0);
XSETFASTINT (w->use_time, 0);
++sequence_number;
XSETFASTINT (w->sequence_number, sequence_number);
- w->temslot = w->last_modified = w->last_overlay_modified = Qnil;
XSETFASTINT (w->last_point, 0);
- w->last_had_star = 0;
- w->vertical_scroll_bar = Qnil;
- w->left_margin_cols = w->right_margin_cols = Qnil;
- w->left_fringe_width = w->right_fringe_width = Qnil;
- w->fringes_outside_margins = Qnil;
- w->scroll_bar_width = Qnil;
w->vertical_scroll_bar_type = Qt;
XSETFASTINT (w->window_end_pos, 0);
XSETFASTINT (w->window_end_vpos, 0);
- w->window_end_valid = w->display_table = Qnil;
- w->update_mode_line = w->start_at_line_beg = 0;
- w->dedicated = Qnil;
- w->base_line_number = w->base_line_pos = w->region_showing = Qnil;
- w->column_number_displayed = w->redisplay_end_trigger = Qnil;
- w->combination_limit = w->window_parameters = Qnil;
- w->prev_buffers = w->next_buffers = Qnil;
- /* Initialize non-Lisp data. */
- w->desired_matrix = w->current_matrix = 0;
+
+ /* Initialize non-Lisp data. Note that allocate_window zeroes out all
+ non-Lisp data, so do it only for slots which should not be zero. */
w->nrows_scale_factor = w->ncols_scale_factor = 1;
- memset (&w->cursor, 0, sizeof (w->cursor));
- memset (&w->last_cursor, 0, sizeof (w->last_cursor));
- memset (&w->phys_cursor, 0, sizeof (w->phys_cursor));
w->phys_cursor_type = -1;
w->phys_cursor_width = -1;
- w->phys_cursor_on_p = 0;
- w->last_cursor_off_p = w->cursor_off_p = 0;
- w->must_be_updated_p = 0;
- w->pseudo_window_p = 0;
- w->frozen_window_start_p = 0;
- w->vscroll = 0;
+
/* Reset window_list. */
Vwindow_list = Qnil;
/* Return window. */
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: Pseudovectors initialization
2012-06-26 7:26 Pseudovectors initialization Dmitry Antipov
@ 2012-06-26 9:17 ` John Wiegley
2012-06-26 11:02 ` Dmitry Antipov
2012-06-26 12:33 ` Michael Welsh Duggan
` (3 subsequent siblings)
4 siblings, 1 reply; 11+ messages in thread
From: John Wiegley @ 2012-06-26 9:17 UTC (permalink / raw)
To: emacs-devel
>>>>> Dmitry Antipov <dmantipov@yandex.ru> writes:
> Windows, frames, processes and terminals are created rarely and tends to
> have a long lifetime; so, IMHO, it's reasonable to pay a negligible
> performance penalty to simplify initialization, readability and maintenance.
> Any objections?
Processes get created very frequently on my Emacs. It would be preferable to
avoid any assumptions about how Emacs is used.
John
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: Pseudovectors initialization
2012-06-26 9:17 ` John Wiegley
@ 2012-06-26 11:02 ` Dmitry Antipov
0 siblings, 0 replies; 11+ messages in thread
From: Dmitry Antipov @ 2012-06-26 11:02 UTC (permalink / raw)
To: John Wiegley; +Cc: emacs-devel
On 06/26/2012 01:17 PM, John Wiegley wrote:
> Processes get created very frequently on my Emacs. It would be preferable to
> avoid any assumptions about how Emacs is used.
As for this patch, "very frequently" means the rate of thousands, or at least
hundreds, events per second, when an overhead of memset for a 50-100 bytes area
may be visible. Fcons and Fmake_vector are good examples. I'm pretty sure you're
not talking about creating even 10 inferior processes per second.
Dmitry
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: Pseudovectors initialization
2012-06-26 7:26 Pseudovectors initialization Dmitry Antipov
2012-06-26 9:17 ` John Wiegley
@ 2012-06-26 12:33 ` Michael Welsh Duggan
2012-06-26 13:07 ` Dmitry Antipov
2012-06-26 13:15 ` Stefan Monnier
` (2 subsequent siblings)
4 siblings, 1 reply; 11+ messages in thread
From: Michael Welsh Duggan @ 2012-06-26 12:33 UTC (permalink / raw)
To: Dmitry Antipov; +Cc: Emacs development discussions
Dmitry Antipov <dmantipov@yandex.ru> writes:
[...]
> - f->focus_frame = Qnil;
> - f->explicit_name = 0;
> - f->can_have_scroll_bars = 0;
> f->vertical_scroll_bar_type = vertical_scroll_bar_none;
> - f->param_alist = Qnil;
> - f->scroll_bars = Qnil;
> - f->condemned_scroll_bars = Qnil;
> - f->face_alist = Qnil;
> - f->face_cache = NULL;
> - f->menu_bar_items = Qnil;
> - f->menu_bar_vector = Qnil;
> - f->menu_bar_items_used = 0;
> - f->buffer_predicate = Qnil;
> - f->buffer_list = Qnil;
> - f->buried_buffer_list = Qnil;
> - f->namebuf = 0;
> - f->title = Qnil;
> - f->menu_bar_window = Qnil;
> - f->tool_bar_window = Qnil;
> - f->tool_bar_items = Qnil;
Is it really safe to memset to zero that which should default to Qnil?
--
Michael Welsh Duggan
(md5i@md5i.com)
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: Pseudovectors initialization
2012-06-26 12:33 ` Michael Welsh Duggan
@ 2012-06-26 13:07 ` Dmitry Antipov
0 siblings, 0 replies; 11+ messages in thread
From: Dmitry Antipov @ 2012-06-26 13:07 UTC (permalink / raw)
To: Michael Welsh Duggan; +Cc: Emacs development discussions
On 06/26/2012 04:33 PM, Michael Welsh Duggan wrote:
> Is it really safe to memset to zero that which should default to Qnil?
No, of course.
All pseudo-vector objects has tricky layout:
pseudo_vector {
vectorlike_header;
Lisp_Object A; |
... | area visible by GC
Lisp_Object Z; |
non_lisp_object a; |
... | area invisible for GC
non_lisp_object z; |
};
Everything from area visible by GC is initialized to Qnil by
allocate_pseudovector, and ALLOCATE_PSEUDOVECTOR knows how to
evaluate this area's size. This patch zeroes just the rest,
i.e. area invisible for GC.
Dmitry
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: Pseudovectors initialization
2012-06-26 7:26 Pseudovectors initialization Dmitry Antipov
2012-06-26 9:17 ` John Wiegley
2012-06-26 12:33 ` Michael Welsh Duggan
@ 2012-06-26 13:15 ` Stefan Monnier
2012-06-26 13:52 ` Nix
2012-06-27 17:04 ` Dan Nicolaescu
4 siblings, 0 replies; 11+ messages in thread
From: Stefan Monnier @ 2012-06-26 13:15 UTC (permalink / raw)
To: Dmitry Antipov; +Cc: Emacs development discussions
> Any objections?
I don't see much performance impact. It looks OK to me (tho I can't
remember why I didn't do it when I introduced ALLOCATE_PSEUDOVECTOR).
Stefan
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: Pseudovectors initialization
2012-06-26 7:26 Pseudovectors initialization Dmitry Antipov
` (2 preceding siblings ...)
2012-06-26 13:15 ` Stefan Monnier
@ 2012-06-26 13:52 ` Nix
2012-06-27 17:04 ` Dan Nicolaescu
4 siblings, 0 replies; 11+ messages in thread
From: Nix @ 2012-06-26 13:52 UTC (permalink / raw)
To: Dmitry Antipov; +Cc: Emacs development discussions
On 26 Jun 2012, Dmitry Antipov stated:
> + /* If the pseudovector is not a Lisp_Hash_Table and contains
> + members beyond Lisp_Objects at the beginning, zero out them. */
"Zero them out".
--
NULL && (void)
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: Pseudovectors initialization
2012-06-26 7:26 Pseudovectors initialization Dmitry Antipov
` (3 preceding siblings ...)
2012-06-26 13:52 ` Nix
@ 2012-06-27 17:04 ` Dan Nicolaescu
2012-06-27 17:26 ` Dmitry Antipov
4 siblings, 1 reply; 11+ messages in thread
From: Dan Nicolaescu @ 2012-06-27 17:04 UTC (permalink / raw)
To: Dmitry Antipov; +Cc: Emacs development discussions
Dmitry Antipov <dmantipov@yandex.ru> writes:
> Windows, frames, processes and terminals are created rarely and tends
> to have a long lifetime; so, IMHO, it's reasonable to pay a negligible
> performance penalty to simplify initialization, readability and maintenance.
> Any objections?
>
> Dmitry
>
> === modified file 'src/alloc.c'
> --- src/alloc.c 2012-06-26 05:00:30 +0000
> +++ src/alloc.c 2012-06-26 07:09:41 +0000
> @@ -3268,6 +3268,12 @@
> for (i = 0; i < lisplen; ++i)
> v->contents[i] = Qnil;
>
> + /* If the pseudovector is not a Lisp_Hash_Table and contains
> + members beyond Lisp_Objects at the beginning, zero out them. */
> + if (tag != PVEC_HASH_TABLE && memlen > lisplen)
> + memset ((char *) v + header_size + lisplen * word_size,
> + 0, (memlen - lisplen) * word_size);
> +
> XSETPVECTYPESIZE (v, tag, lisplen);
> return v;
> }
> @@ -3289,24 +3295,15 @@
> struct terminal *
> allocate_terminal (void)
> {
> - struct terminal *t = ALLOCATE_PSEUDOVECTOR (struct terminal,
> - next_terminal, PVEC_TERMINAL);
> - /* Zero out the non-GC'd fields. FIXME: This should be made unnecessary. */
> - memset (&t->next_terminal, 0,
> - (char*) (t + 1) - (char*) &t->next_terminal);
> -
> - return t;
> + return ALLOCATE_PSEUDOVECTOR (struct terminal,
> + next_terminal, PVEC_TERMINAL);
> }
>
> struct frame *
> allocate_frame (void)
> {
> - struct frame *f = ALLOCATE_PSEUDOVECTOR (struct frame,
> - face_cache, PVEC_FRAME);
> - /* Zero out the non-GC'd fields. FIXME: This should be made unnecessary. */
> - memset (&f->face_cache, 0,
> - (char *) (f + 1) - (char *) &f->face_cache);
> - return f;
> + return ALLOCATE_PSEUDOVECTOR (struct frame,
> + face_cache, PVEC_FRAME);
> }
>
>
>
> === modified file 'src/frame.c'
> --- src/frame.c 2012-06-19 06:49:50 +0000
> +++ src/frame.c 2012-06-26 07:00:39 +0000
> @@ -267,63 +267,23 @@
> f = allocate_frame ();
> XSETFRAME (frame, f);
>
> - f->desired_matrix = 0;
> - f->current_matrix = 0;
> - f->desired_pool = 0;
> - f->current_pool = 0;
> - f->glyphs_initialized_p = 0;
> - f->decode_mode_spec_buffer = 0;
> - f->visible = 0;
> - f->async_visible = 0;
> - f->output_data.nothing = 0;
> - f->iconified = 0;
> - f->async_iconified = 0;
> + /* Initialize Lisp data. Note that allocate_frame initializes all
> + Lisp data to nil, so do it only for slots which should not be nil. */
> + f->tool_bar_position = Qtop;
> +
> + /* Initialize non-Lisp data. Note that allocate_frame zeroes out all
> + non-Lisp data, so do it only for slots which should not be zero.
> + To avoid subtle bugs and for the sake of readability, it's better to
> + initialize enum members explicitly even if their values are zero. */
> f->wants_modeline = 1;
> - f->auto_raise = 0;
> - f->auto_lower = 0;
> - f->no_split = 0;
> f->garbaged = 1;
> f->has_minibuffer = mini_p;
> - f->focus_frame = Qnil;
Is removing this, or removing anything that is set to Qnil safe?
It might be from case to case, but it's not obvious...
> - f->explicit_name = 0;
> - f->can_have_scroll_bars = 0;
> f->vertical_scroll_bar_type = vertical_scroll_bar_none;
> - f->param_alist = Qnil;
> - f->scroll_bars = Qnil;
> - f->condemned_scroll_bars = Qnil;
> - f->face_alist = Qnil;
> - f->face_cache = NULL;
> - f->menu_bar_items = Qnil;
> - f->menu_bar_vector = Qnil;
> - f->menu_bar_items_used = 0;
> - f->buffer_predicate = Qnil;
> - f->buffer_list = Qnil;
> - f->buried_buffer_list = Qnil;
> - f->namebuf = 0;
> - f->title = Qnil;
> - f->menu_bar_window = Qnil;
> - f->tool_bar_window = Qnil;
> - f->tool_bar_items = Qnil;
> - f->tool_bar_position = Qtop;
> - f->desired_tool_bar_string = f->current_tool_bar_string = Qnil;
> - f->n_tool_bar_items = 0;
> - f->left_fringe_width = f->right_fringe_width = 0;
> - f->fringe_cols = 0;
> - f->menu_bar_lines = 0;
> - f->tool_bar_lines = 0;
> - f->scroll_bar_actual_width = 0;
> - f->border_width = 0;
> - f->internal_border_width = 0;
> f->column_width = 1; /* !FRAME_WINDOW_P value */
> f->line_height = 1; /* !FRAME_WINDOW_P value */
> - f->x_pixels_diff = f->y_pixels_diff = 0;
> #ifdef HAVE_WINDOW_SYSTEM
> f->want_fullscreen = FULLSCREEN_NONE;
> #endif
> - f->size_hint_flags = 0;
> - f->win_gravity = 0;
> - f->font_driver_list = NULL;
> - f->font_data_list = NULL;
>
> root_window = make_window ();
> if (mini_p)
> @@ -399,8 +359,6 @@
> ++window_select_count;
> XSETFASTINT (XWINDOW (f->selected_window)->use_time, window_select_count);
>
> - f->default_face_done_p = 0;
> -
> return f;
> }
> \f
>
> === modified file 'src/process.c'
> --- src/process.c 2012-06-24 20:34:48 +0000
> +++ src/process.c 2012-06-26 07:17:58 +0000
> @@ -625,35 +625,18 @@
> printmax_t i;
>
> p = allocate_process ();
> + /* Initialize Lisp data. Note that allocate_process initializes all
> + Lisp data to nil, so do it only for slots which should not be nil. */
> + p->status = Qrun;
> + p->mark = Fmake_marker ();
>
> + /* Initialize non-Lisp data. Note that allocate_process zeroes out all
> + non-Lisp data, so do it only for slots which should not be zero. */
> p->infd = -1;
> p->outfd = -1;
> - p->tick = 0;
> - p->update_tick = 0;
> - p->pid = 0;
> - p->pty_flag = 0;
> - p->raw_status_new = 0;
> - p->status = Qrun;
> - p->mark = Fmake_marker ();
> - p->kill_without_query = 0;
> - p->write_queue = Qnil;
> -
> -#ifdef ADAPTIVE_READ_BUFFERING
> - p->adaptive_read_buffering = 0;
> - p->read_output_delay = 0;
> - p->read_output_skip = 0;
> -#endif
>
> #ifdef HAVE_GNUTLS
> p->gnutls_initstage = GNUTLS_STAGE_EMPTY;
> - /* Default log level. */
> - p->gnutls_log_level = 0;
> - /* GnuTLS handshakes attempted for this connection. */
> - p->gnutls_handshakes_tried = 0;
> - p->gnutls_p = 0;
> - p->gnutls_state = NULL;
> - p->gnutls_x509_cred = NULL;
> - p->gnutls_anon_cred = NULL;
> #endif
>
> /* If name is already in use, modify it until it is unused. */
>
> === modified file 'src/terminal.c'
> --- src/terminal.c 2012-01-19 07:21:25 +0000
> +++ src/terminal.c 2012-06-26 05:46:51 +0000
> @@ -225,7 +225,6 @@
> struct terminal *terminal = allocate_terminal ();
> Lisp_Object terminal_coding, keyboard_coding;
>
> - terminal->name = NULL;
> terminal->next_terminal = terminal_list;
> terminal_list = terminal;
>
> @@ -255,9 +254,6 @@
> setup_coding_system (keyboard_coding, terminal->keyboard_coding);
> setup_coding_system (terminal_coding, terminal->terminal_coding);
>
> - terminal->param_alist = Qnil;
> - terminal->charset_list = Qnil;
> - terminal->Vselection_alist = Qnil;
> return terminal;
> }
>
>
> === modified file 'src/window.c'
> --- src/window.c 2012-06-19 16:56:28 +0000
> +++ src/window.c 2012-06-26 07:17:40 +0000
> @@ -3242,13 +3242,12 @@
> {
> Lisp_Object parent;
> register struct window *o, *p;
> - int i;
>
> o = XWINDOW (window);
> p = allocate_window ();
> - for (i = 0; i < VECSIZE (struct window); ++i)
> - ((struct Lisp_Vector *) p)->contents[i]
> - = ((struct Lisp_Vector *) o)->contents[i];
> + memcpy ((char *) p + sizeof (struct vectorlike_header),
> + (char *) o + sizeof (struct vectorlike_header),
> + sizeof (Lisp_Object) * VECSIZE (struct window));
> XSETWINDOW (parent, p);
>
> ++sequence_number;
> @@ -3277,10 +3276,8 @@
> register struct window *w;
>
> w = allocate_window ();
> - /* Initialize all Lisp data. */
> - w->frame = Qnil;
> - w->mini = 0;
> - w->next = w->prev = w->hchild = w->vchild = w->parent = Qnil;
> + /* Initialize Lisp data. Note that allocate_window initializes all
> + Lisp data to nil, so do it only for slots which should not be nil. */
> XSETFASTINT (w->left_col, 0);
> XSETFASTINT (w->top_line, 0);
> XSETFASTINT (w->total_lines, 0);
> @@ -3289,47 +3286,24 @@
> w->normal_cols = make_float (1.0);
> XSETFASTINT (w->new_total, 0);
> XSETFASTINT (w->new_normal, 0);
> - w->buffer = Qnil;
> w->start = Fmake_marker ();
> w->pointm = Fmake_marker ();
> - w->force_start = w->optional_new_start = 0;
> XSETFASTINT (w->hscroll, 0);
> XSETFASTINT (w->min_hscroll, 0);
> XSETFASTINT (w->use_time, 0);
> ++sequence_number;
> XSETFASTINT (w->sequence_number, sequence_number);
> - w->temslot = w->last_modified = w->last_overlay_modified = Qnil;
> XSETFASTINT (w->last_point, 0);
> - w->last_had_star = 0;
> - w->vertical_scroll_bar = Qnil;
> - w->left_margin_cols = w->right_margin_cols = Qnil;
> - w->left_fringe_width = w->right_fringe_width = Qnil;
> - w->fringes_outside_margins = Qnil;
> - w->scroll_bar_width = Qnil;
> w->vertical_scroll_bar_type = Qt;
> XSETFASTINT (w->window_end_pos, 0);
> XSETFASTINT (w->window_end_vpos, 0);
> - w->window_end_valid = w->display_table = Qnil;
> - w->update_mode_line = w->start_at_line_beg = 0;
> - w->dedicated = Qnil;
> - w->base_line_number = w->base_line_pos = w->region_showing = Qnil;
> - w->column_number_displayed = w->redisplay_end_trigger = Qnil;
> - w->combination_limit = w->window_parameters = Qnil;
> - w->prev_buffers = w->next_buffers = Qnil;
> - /* Initialize non-Lisp data. */
> - w->desired_matrix = w->current_matrix = 0;
> +
> + /* Initialize non-Lisp data. Note that allocate_window zeroes out all
> + non-Lisp data, so do it only for slots which should not be zero. */
> w->nrows_scale_factor = w->ncols_scale_factor = 1;
> - memset (&w->cursor, 0, sizeof (w->cursor));
> - memset (&w->last_cursor, 0, sizeof (w->last_cursor));
> - memset (&w->phys_cursor, 0, sizeof (w->phys_cursor));
> w->phys_cursor_type = -1;
> w->phys_cursor_width = -1;
> - w->phys_cursor_on_p = 0;
> - w->last_cursor_off_p = w->cursor_off_p = 0;
> - w->must_be_updated_p = 0;
> - w->pseudo_window_p = 0;
> - w->frozen_window_start_p = 0;
> - w->vscroll = 0;
> +
> /* Reset window_list. */
> Vwindow_list = Qnil;
> /* Return window. */
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: Pseudovectors initialization
2012-06-27 17:04 ` Dan Nicolaescu
@ 2012-06-27 17:26 ` Dmitry Antipov
2012-06-27 21:22 ` Stefan Monnier
0 siblings, 1 reply; 11+ messages in thread
From: Dmitry Antipov @ 2012-06-27 17:26 UTC (permalink / raw)
To: Dan Nicolaescu; +Cc: Emacs development discussions
On 06/27/2012 09:04 PM, Dan Nicolaescu wrote:
> Is removing this, or removing anything that is set to Qnil safe?
> It might be from case to case, but it's not obvious...
It's verified to be safe for windows, frames, processes and terminals.
ALLOCATE_PSEUDOVECTOR evaluates how many Lisp_Objects are located
after vectorlike_header, and then calls allocate_pseudovector to
initialize all of them to Qnil. Next, allocate_{window,frame,process,
terminal} zeroes the rest. Thus, you need to initialize Lisp_Object
slot only if it should be non-nil and other slot only if it should
be non-zero.
Dmitry
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: Pseudovectors initialization
2012-06-27 17:26 ` Dmitry Antipov
@ 2012-06-27 21:22 ` Stefan Monnier
2012-06-27 21:31 ` Andreas Schwab
0 siblings, 1 reply; 11+ messages in thread
From: Stefan Monnier @ 2012-06-27 21:22 UTC (permalink / raw)
To: Dmitry Antipov; +Cc: Dan Nicolaescu, Emacs development discussions
>> Is removing this, or removing anything that is set to Qnil safe?
>> It might be from case to case, but it's not obvious...
> It's verified to be safe for windows, frames, processes and terminals.
> ALLOCATE_PSEUDOVECTOR evaluates how many Lisp_Objects are located
> after vectorlike_header, and then calls allocate_pseudovector to
> initialize all of them to Qnil. Next, allocate_{window,frame,process,
> terminal} zeroes the rest. Thus, you need to initialize Lisp_Object
> slot only if it should be non-nil and other slot only if it should
> be non-zero.
There's another exception: slots which are of type Lisp_Object but are
not traced normally by the GC (i.e. are placed in the "non-Lisp" part of the
pseudo-vector). They're rare, tho (maybe the buffer's undo-log is one
of them).
Stefan
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: Pseudovectors initialization
2012-06-27 21:22 ` Stefan Monnier
@ 2012-06-27 21:31 ` Andreas Schwab
0 siblings, 0 replies; 11+ messages in thread
From: Andreas Schwab @ 2012-06-27 21:31 UTC (permalink / raw)
To: Stefan Monnier
Cc: Dan Nicolaescu, Dmitry Antipov, Emacs development discussions
Stefan Monnier <monnier@IRO.UMontreal.CA> writes:
> There's another exception: slots which are of type Lisp_Object but are
> not traced normally by the GC (i.e. are placed in the "non-Lisp" part of the
> pseudo-vector).
The key-value pairs of hash tables are such an example. They need to be
handled specially by GC due to weak hash tables.
> They're rare, tho (maybe the buffer's undo-log is one of them).
Buffers are not pseudovectors, though.
Andreas.
--
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5
"And now for something completely different."
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2012-06-27 21:31 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-06-26 7:26 Pseudovectors initialization Dmitry Antipov
2012-06-26 9:17 ` John Wiegley
2012-06-26 11:02 ` Dmitry Antipov
2012-06-26 12:33 ` Michael Welsh Duggan
2012-06-26 13:07 ` Dmitry Antipov
2012-06-26 13:15 ` Stefan Monnier
2012-06-26 13:52 ` Nix
2012-06-27 17:04 ` Dan Nicolaescu
2012-06-27 17:26 ` Dmitry Antipov
2012-06-27 21:22 ` Stefan Monnier
2012-06-27 21:31 ` Andreas Schwab
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).