diff options
| author | Eli Zaretskii | 2015-11-24 18:08:39 +0200 |
|---|---|---|
| committer | Eli Zaretskii | 2015-11-24 18:08:39 +0200 |
| commit | d5fdffecdfad305d9c933ae3cad75a5e4e73878c (patch) | |
| tree | 91c34e1102fdd828c530dabb342eae7c796bd748 /src | |
| parent | a67cc630db28cf734d0e47f231add30c782bd8cf (diff) | |
| download | emacs-d5fdffecdfad305d9c933ae3cad75a5e4e73878c.tar.gz emacs-d5fdffecdfad305d9c933ae3cad75a5e4e73878c.zip | |
Fix crash at startup related to GC of font entities
* src/font.h (GC_FONT_SPEC_P, GC_FONT_ENTITY_P)
(GC_FONT_OBJECT_P, GC_XFONT_SPEC, GC_XFONT_ENTITY)
(GC_XFONT_OBJECT): New macros, for use in garbage collector.
* src/alloc.c (compact_font_cache_entry, compact_font_caches):
Don't ifdef away font cache compaction on NT_GUI, as the problems
which led to that seem to have been solved.
(compact_font_cache_entry): Use GC_FONT_SPEC_P, GC_XFONT_SPEC,
GC_XFONT_ENTITY, and GC_XFONT_OBJECT, instead of their non-GC_
cousins. (Bug#21999)
Diffstat (limited to 'src')
| -rw-r--r-- | src/alloc.c | 19 | ||||
| -rw-r--r-- | src/font.h | 42 |
2 files changed, 48 insertions, 13 deletions
diff --git a/src/alloc.c b/src/alloc.c index 99f5cdcdea2..e83b3836aa4 100644 --- a/src/alloc.c +++ b/src/alloc.c | |||
| @@ -5317,10 +5317,6 @@ total_bytes_of_live_objects (void) | |||
| 5317 | 5317 | ||
| 5318 | #ifdef HAVE_WINDOW_SYSTEM | 5318 | #ifdef HAVE_WINDOW_SYSTEM |
| 5319 | 5319 | ||
| 5320 | /* This code has a few issues on MS-Windows, see Bug#15876 and Bug#16140. */ | ||
| 5321 | |||
| 5322 | #if !defined (HAVE_NTGUI) | ||
| 5323 | |||
| 5324 | /* Remove unmarked font-spec and font-entity objects from ENTRY, which is | 5320 | /* Remove unmarked font-spec and font-entity objects from ENTRY, which is |
| 5325 | (DRIVER-TYPE NUM-FRAMES FONT-CACHE-DATA ...), and return changed entry. */ | 5321 | (DRIVER-TYPE NUM-FRAMES FONT-CACHE-DATA ...), and return changed entry. */ |
| 5326 | 5322 | ||
| @@ -5335,11 +5331,12 @@ compact_font_cache_entry (Lisp_Object entry) | |||
| 5335 | Lisp_Object obj = XCAR (tail); | 5331 | Lisp_Object obj = XCAR (tail); |
| 5336 | 5332 | ||
| 5337 | /* Consider OBJ if it is (font-spec . [font-entity font-entity ...]). */ | 5333 | /* Consider OBJ if it is (font-spec . [font-entity font-entity ...]). */ |
| 5338 | if (CONSP (obj) && FONT_SPEC_P (XCAR (obj)) | 5334 | if (CONSP (obj) && GC_FONT_SPEC_P (XCAR (obj)) |
| 5339 | && !VECTOR_MARKED_P (XFONT_SPEC (XCAR (obj))) | 5335 | && !VECTOR_MARKED_P (GC_XFONT_SPEC (XCAR (obj))) |
| 5340 | && VECTORP (XCDR (obj))) | 5336 | && VECTORP (XCDR (obj))) |
| 5341 | { | 5337 | { |
| 5342 | ptrdiff_t i, size = gc_asize (XCDR (obj)); | 5338 | ptrdiff_t i, size = gc_asize (XCDR (obj)); |
| 5339 | Lisp_Object obj_cdr = XCDR (obj); | ||
| 5343 | 5340 | ||
| 5344 | /* If font-spec is not marked, most likely all font-entities | 5341 | /* If font-spec is not marked, most likely all font-entities |
| 5345 | are not marked too. But we must be sure that nothing is | 5342 | are not marked too. But we must be sure that nothing is |
| @@ -5348,14 +5345,14 @@ compact_font_cache_entry (Lisp_Object entry) | |||
| 5348 | { | 5345 | { |
| 5349 | Lisp_Object objlist; | 5346 | Lisp_Object objlist; |
| 5350 | 5347 | ||
| 5351 | if (VECTOR_MARKED_P (XFONT_ENTITY (AREF (XCDR (obj), i)))) | 5348 | if (VECTOR_MARKED_P (GC_XFONT_ENTITY (AREF (obj_cdr, i)))) |
| 5352 | break; | 5349 | break; |
| 5353 | 5350 | ||
| 5354 | objlist = AREF (AREF (XCDR (obj), i), FONT_OBJLIST_INDEX); | 5351 | objlist = AREF (AREF (obj_cdr, i), FONT_OBJLIST_INDEX); |
| 5355 | for (; CONSP (objlist); objlist = XCDR (objlist)) | 5352 | for (; CONSP (objlist); objlist = XCDR (objlist)) |
| 5356 | { | 5353 | { |
| 5357 | Lisp_Object val = XCAR (objlist); | 5354 | Lisp_Object val = XCAR (objlist); |
| 5358 | struct font *font = XFONT_OBJECT (val); | 5355 | struct font *font = GC_XFONT_OBJECT (val); |
| 5359 | 5356 | ||
| 5360 | if (!NILP (AREF (val, FONT_TYPE_INDEX)) | 5357 | if (!NILP (AREF (val, FONT_TYPE_INDEX)) |
| 5361 | && VECTOR_MARKED_P(font)) | 5358 | && VECTOR_MARKED_P(font)) |
| @@ -5383,8 +5380,6 @@ compact_font_cache_entry (Lisp_Object entry) | |||
| 5383 | return entry; | 5380 | return entry; |
| 5384 | } | 5381 | } |
| 5385 | 5382 | ||
| 5386 | #endif /* not HAVE_NTGUI */ | ||
| 5387 | |||
| 5388 | /* Compact font caches on all terminals and mark | 5383 | /* Compact font caches on all terminals and mark |
| 5389 | everything which is still here after compaction. */ | 5384 | everything which is still here after compaction. */ |
| 5390 | 5385 | ||
| @@ -5396,7 +5391,6 @@ compact_font_caches (void) | |||
| 5396 | for (t = terminal_list; t; t = t->next_terminal) | 5391 | for (t = terminal_list; t; t = t->next_terminal) |
| 5397 | { | 5392 | { |
| 5398 | Lisp_Object cache = TERMINAL_FONT_CACHE (t); | 5393 | Lisp_Object cache = TERMINAL_FONT_CACHE (t); |
| 5399 | #if !defined (HAVE_NTGUI) | ||
| 5400 | if (CONSP (cache)) | 5394 | if (CONSP (cache)) |
| 5401 | { | 5395 | { |
| 5402 | Lisp_Object entry; | 5396 | Lisp_Object entry; |
| @@ -5404,7 +5398,6 @@ compact_font_caches (void) | |||
| 5404 | for (entry = XCDR (cache); CONSP (entry); entry = XCDR (entry)) | 5398 | for (entry = XCDR (cache); CONSP (entry); entry = XCDR (entry)) |
| 5405 | XSETCAR (entry, compact_font_cache_entry (XCAR (entry))); | 5399 | XSETCAR (entry, compact_font_cache_entry (XCAR (entry))); |
| 5406 | } | 5400 | } |
| 5407 | #endif /* not HAVE_NTGUI */ | ||
| 5408 | mark_object (cache); | 5401 | mark_object (cache); |
| 5409 | } | 5402 | } |
| 5410 | } | 5403 | } |
diff --git a/src/font.h b/src/font.h index 1d13e1cb6b0..24c058dd88b 100644 --- a/src/font.h +++ b/src/font.h | |||
| @@ -427,6 +427,13 @@ FONT_SPEC_P (Lisp_Object x) | |||
| 427 | return FONTP (x) && (ASIZE (x) & PSEUDOVECTOR_SIZE_MASK) == FONT_SPEC_MAX; | 427 | return FONTP (x) && (ASIZE (x) & PSEUDOVECTOR_SIZE_MASK) == FONT_SPEC_MAX; |
| 428 | } | 428 | } |
| 429 | 429 | ||
| 430 | /* Like FONT_SPEC_P, but can be used in the garbage collector. */ | ||
| 431 | INLINE bool | ||
| 432 | GC_FONT_SPEC_P (Lisp_Object x) | ||
| 433 | { | ||
| 434 | return FONTP (x) && (gc_asize (x) & PSEUDOVECTOR_SIZE_MASK) == FONT_SPEC_MAX; | ||
| 435 | } | ||
| 436 | |||
| 430 | /* True iff X is font-entity. */ | 437 | /* True iff X is font-entity. */ |
| 431 | INLINE bool | 438 | INLINE bool |
| 432 | FONT_ENTITY_P (Lisp_Object x) | 439 | FONT_ENTITY_P (Lisp_Object x) |
| @@ -434,6 +441,13 @@ FONT_ENTITY_P (Lisp_Object x) | |||
| 434 | return FONTP (x) && (ASIZE (x) & PSEUDOVECTOR_SIZE_MASK) == FONT_ENTITY_MAX; | 441 | return FONTP (x) && (ASIZE (x) & PSEUDOVECTOR_SIZE_MASK) == FONT_ENTITY_MAX; |
| 435 | } | 442 | } |
| 436 | 443 | ||
| 444 | /* Like FONT_ENTITY_P, but can be used in the garbage collector. */ | ||
| 445 | INLINE bool | ||
| 446 | GC_FONT_ENTITY_P (Lisp_Object x) | ||
| 447 | { | ||
| 448 | return FONTP (x) && (gc_asize (x) & PSEUDOVECTOR_SIZE_MASK) == FONT_ENTITY_MAX; | ||
| 449 | } | ||
| 450 | |||
| 437 | /* True iff X is font-object. */ | 451 | /* True iff X is font-object. */ |
| 438 | INLINE bool | 452 | INLINE bool |
| 439 | FONT_OBJECT_P (Lisp_Object x) | 453 | FONT_OBJECT_P (Lisp_Object x) |
| @@ -441,6 +455,13 @@ FONT_OBJECT_P (Lisp_Object x) | |||
| 441 | return FONTP (x) && (ASIZE (x) & PSEUDOVECTOR_SIZE_MASK) == FONT_OBJECT_MAX; | 455 | return FONTP (x) && (ASIZE (x) & PSEUDOVECTOR_SIZE_MASK) == FONT_OBJECT_MAX; |
| 442 | } | 456 | } |
| 443 | 457 | ||
| 458 | /* Like FONT_OBJECT_P, but can be used in the garbage collector. */ | ||
| 459 | INLINE bool | ||
| 460 | GC_FONT_OBJECT_P (Lisp_Object x) | ||
| 461 | { | ||
| 462 | return FONTP (x) && (gc_asize (x) & PSEUDOVECTOR_SIZE_MASK) == FONT_OBJECT_MAX; | ||
| 463 | } | ||
| 464 | |||
| 444 | /* Type checking functions for various font-related objects. */ | 465 | /* Type checking functions for various font-related objects. */ |
| 445 | 466 | ||
| 446 | INLINE void | 467 | INLINE void |
| @@ -476,6 +497,13 @@ XFONT_SPEC (Lisp_Object p) | |||
| 476 | return XUNTAG (p, Lisp_Vectorlike); | 497 | return XUNTAG (p, Lisp_Vectorlike); |
| 477 | } | 498 | } |
| 478 | 499 | ||
| 500 | INLINE struct font_spec * | ||
| 501 | GC_XFONT_SPEC (Lisp_Object p) | ||
| 502 | { | ||
| 503 | eassert (GC_FONT_SPEC_P (p)); | ||
| 504 | return XUNTAG (p, Lisp_Vectorlike); | ||
| 505 | } | ||
| 506 | |||
| 479 | INLINE struct font_entity * | 507 | INLINE struct font_entity * |
| 480 | XFONT_ENTITY (Lisp_Object p) | 508 | XFONT_ENTITY (Lisp_Object p) |
| 481 | { | 509 | { |
| @@ -483,6 +511,13 @@ XFONT_ENTITY (Lisp_Object p) | |||
| 483 | return XUNTAG (p, Lisp_Vectorlike); | 511 | return XUNTAG (p, Lisp_Vectorlike); |
| 484 | } | 512 | } |
| 485 | 513 | ||
| 514 | INLINE struct font_entity * | ||
| 515 | GC_XFONT_ENTITY (Lisp_Object p) | ||
| 516 | { | ||
| 517 | eassert (GC_FONT_ENTITY_P (p)); | ||
| 518 | return XUNTAG (p, Lisp_Vectorlike); | ||
| 519 | } | ||
| 520 | |||
| 486 | INLINE struct font * | 521 | INLINE struct font * |
| 487 | XFONT_OBJECT (Lisp_Object p) | 522 | XFONT_OBJECT (Lisp_Object p) |
| 488 | { | 523 | { |
| @@ -490,6 +525,13 @@ XFONT_OBJECT (Lisp_Object p) | |||
| 490 | return XUNTAG (p, Lisp_Vectorlike); | 525 | return XUNTAG (p, Lisp_Vectorlike); |
| 491 | } | 526 | } |
| 492 | 527 | ||
| 528 | INLINE struct font * | ||
| 529 | GC_XFONT_OBJECT (Lisp_Object p) | ||
| 530 | { | ||
| 531 | eassert (GC_FONT_OBJECT_P (p)); | ||
| 532 | return XUNTAG (p, Lisp_Vectorlike); | ||
| 533 | } | ||
| 534 | |||
| 493 | #define XSETFONT(a, b) (XSETPSEUDOVECTOR (a, b, PVEC_FONT)) | 535 | #define XSETFONT(a, b) (XSETPSEUDOVECTOR (a, b, PVEC_FONT)) |
| 494 | 536 | ||
| 495 | INLINE struct font * | 537 | INLINE struct font * |