Mercurial > emacs
comparison src/buffer.c @ 44617:c54f8a37564e
(MMAP_ALLOCATED_P): New macro to be set from system
configuration files.
(mmap_enlarge): Enlarge mapped regions only if MMAP_ALLOCATED_P
returns 0.
| author | Gerd Moellmann <gerd@gnu.org> |
|---|---|
| date | Tue, 16 Apr 2002 07:34:36 +0000 |
| parents | 223f1f5d160d |
| children | 8180d4f92b70 |
comparison
equal
deleted
inserted
replaced
| 44616:fe5006134263 | 44617:c54f8a37564e |
|---|---|
| 1 /* Buffer manipulation primitives for GNU Emacs. | 1 /* Buffer manipulation primitives for GNU Emacs. |
| 2 Copyright (C) 1985,86,87,88,89,93,94,95,97,98, 1999, 2000, 2001 | 2 Copyright (C) 1985,86,87,88,89,93,94,95,97,98, 1999, 2000, 2001, 2002 |
| 3 Free Software Foundation, Inc. | 3 Free Software Foundation, Inc. |
| 4 | 4 |
| 5 This file is part of GNU Emacs. | 5 This file is part of GNU Emacs. |
| 6 | 6 |
| 7 GNU Emacs is free software; you can redistribute it and/or modify | 7 GNU Emacs is free software; you can redistribute it and/or modify |
| 4341 #define MMAP_USER_AREA(P) \ | 4341 #define MMAP_USER_AREA(P) \ |
| 4342 ((POINTER_TYPE *) ((char *) (P) + MMAP_REGION_STRUCT_SIZE)) | 4342 ((POINTER_TYPE *) ((char *) (P) + MMAP_REGION_STRUCT_SIZE)) |
| 4343 | 4343 |
| 4344 #define MEM_ALIGN sizeof (double) | 4344 #define MEM_ALIGN sizeof (double) |
| 4345 | 4345 |
| 4346 /* Predicate returning true if part of the address range [START .. | |
| 4347 END[ is currently mapped. Used to prevent overwriting an existing | |
| 4348 memory mapping. | |
| 4349 | |
| 4350 Default is to conservativly assume the address range is occupied by | |
| 4351 something else. This can be overridden by system configuration | |
| 4352 files if system-specific means to determine this exists. */ | |
| 4353 | |
| 4354 #ifndef MMAP_ALLOCATED_P | |
| 4355 #define MMAP_ALLOCATED_P(start, end) 1 | |
| 4356 #endif | |
| 4357 | |
| 4346 /* Function prototypes. */ | 4358 /* Function prototypes. */ |
| 4347 | 4359 |
| 4348 static int mmap_free_1 P_ ((struct mmap_region *)); | 4360 static int mmap_free_1 P_ ((struct mmap_region *)); |
| 4349 static int mmap_enlarge P_ ((struct mmap_region *, int)); | 4361 static int mmap_enlarge P_ ((struct mmap_region *, int)); |
| 4350 static struct mmap_region *mmap_find P_ ((POINTER_TYPE *, POINTER_TYPE *)); | 4362 static struct mmap_region *mmap_find P_ ((POINTER_TYPE *, POINTER_TYPE *)); |
| 4433 success = 1; | 4445 success = 1; |
| 4434 } | 4446 } |
| 4435 } | 4447 } |
| 4436 else if (npages > 0) | 4448 else if (npages > 0) |
| 4437 { | 4449 { |
| 4438 struct mmap_region *r2; | |
| 4439 | |
| 4440 nbytes = npages * mmap_page_size; | 4450 nbytes = npages * mmap_page_size; |
| 4441 | 4451 |
| 4442 /* Try to map additional pages at the end of the region. We | 4452 /* Try to map additional pages at the end of the region. We |
| 4443 cannot do this if the address range is already occupied by | 4453 cannot do this if the address range is already occupied by |
| 4444 something else because mmap deletes any previous mapping. | 4454 something else because mmap deletes any previous mapping. |
| 4445 I'm not sure this is worth doing, let's see. */ | 4455 I'm not sure this is worth doing, let's see. */ |
| 4446 r2 = mmap_find (region_end, region_end + nbytes); | 4456 if (!MMAP_ALLOCATED_P (region_end, region_end + nbytes)) |
| 4447 if (r2 == NULL) | |
| 4448 { | 4457 { |
| 4449 POINTER_TYPE *p; | 4458 POINTER_TYPE *p; |
| 4450 | 4459 |
| 4451 p = mmap (region_end, nbytes, PROT_READ | PROT_WRITE, | 4460 p = mmap (region_end, nbytes, PROT_READ | PROT_WRITE, |
| 4452 MAP_ANON | MAP_PRIVATE | MAP_FIXED, mmap_fd, 0); | 4461 MAP_ANON | MAP_PRIVATE | MAP_FIXED, mmap_fd, 0); |
