annotate src/unexaix.c @ 110:2968112113f9

Initial revision
author Jim Blandy <jimb@redhat.com>
date Tue, 23 Oct 1990 19:15:41 +0000
parents
children 08356dc1077c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
110
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1 /* Dumping and loading data areas, for Emacs under AIX.
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2 (It may also work on other kinds of system V.)
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3 Copyright (C) 1990 Free Software Foundation, Inc.
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5 This file is part of GNU Emacs.
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
7 GNU Emacs is free software; you can redistribute it and/or modify
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
8 it under the terms of the GNU General Public License as published by
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
9 the Free Software Foundation; either version 1, or (at your option)
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
10 any later version.
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
11
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
12 GNU Emacs is distributed in the hope that it will be useful,
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
15 GNU General Public License for more details.
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
16
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
17 You should have received a copy of the GNU General Public License
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
18 along with GNU Emacs; see the file COPYING. If not, write to
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
19 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
20
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
21 /* This is based on a public domain program written by IBM. */
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
22
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
23 /*************** SYSTEM DEFINES *********************************/
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
24
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
25 #include "config.h"
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
26 #include "paths.h"
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
27 #include <sys/types.h>
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
28 #include <sys/files.h>
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
29 #include <fcntl.h>
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
30 #include <sys/mode.h>
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
31 #include <sys/ipc.h>
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
32 #include <sys/shm.h>
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
33 #include <malloc.h>
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
34 #include <stdio.h> /* MWW */
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
35 #include "lisp.h"
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
36
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
37 /*************** LOCAL DEFINES **********************************/
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
38
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
39 struct data_header /* saved data header */
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
40 {
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
41 char *start; /* dump _data addr */
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
42 char *end; /* dump _end addr */
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
43 char *sbrk1; /* dump original sbrk addr */
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
44 char *sbrk2; /* dump final sbrk addr */
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
45 int puresize; /* size of pure data dumped */
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
46 };
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
47
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
48 #define EMACSSHMKEY "EMACSSHMKEY"
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
49 #define EMACS_DATA_FILE "EMACS-DATA"
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
50 #define NEW_SHMGET_FLAGS (IPC_CREAT | S_IWUSR | S_IRUSR \
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
51 | S_IWGRP | S_IRGRP | S_IWOTH | S_IROTH)
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
52 #define OLD_SHMAT_FLAGS SHM_RDONLY
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
53 #define OLD_SHMGET_FLAGS (S_IRUSR | S_IRGRP | S_IROTH)
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
54 #define OLD_OPEN_FLAGS O_RDONLY
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
55 #define NEW_OPEN_FLAGS (O_RDWR | O_CREAT | O_TRUNC)
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
56
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
57 /*************** EXTERNAL / GLOBAL DATA AREA ********************/
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
58
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
59 extern char _data; /* start of data addr */
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
60 extern char _end; /* end of all data + 1 addr */
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
61 static char *original_sbrk; /* sbrk when dump first run */
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
62
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
63 void
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
64 map_in_data (use_dumped_data)
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
65 int use_dumped_data;
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
66 {
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
67 int bufsize; /* malloc buffer size */
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
68 struct data_header dh; /* saved data header */
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
69 int fd; /* saved data file descriptor */
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
70 char *finaladdr; /* last addr in bucket */
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
71 char *ipckey = getenv (EMACSSHMKEY); /* env ipc key string */
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
72 int length; /* dumped data lengths */
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
73 char *newaddr; /* new malloc buffer addr */
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
74 int numblks; /* number of remaining mallocs */
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
75 int shmid; /* shared memory id */
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
76 key_t shmkey; /* shared memory key */
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
77 /* Note that using malloc here may not be safe. */
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
78 char name[sizeof (PATH_EXEC) + sizeof (EMACS_DATA_FILE) + 2];
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
79
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
80 /* Consume remaining malloc space without increasing */
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
81 /* the end of data space */
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
82 original_sbrk = sbrk (0);
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
83 for (bufsize = 16; bufsize < getpagesize (); bufsize *= 2)
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
84 {
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
85 while ((newaddr = (char *)malloc (bufsize - 8)) < original_sbrk)
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
86 ;
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
87 for (numblks = (getpagesize () / bufsize) - 1; numblks > 0; numblks--)
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
88 malloc (bufsize - 8);
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
89 finaladdr = sbrk (0);
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
90 }
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
91 original_sbrk = sbrk (0);
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
92
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
93 /* If we don't want the dumped data, get an unshared segment. */
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
94 if (!use_dumped_data)
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
95 {
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
96 shmid = shmget (IPC_PRIVATE, PURESIZE, NEW_SHMGET_FLAGS);
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
97 if (shmid == -1
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
98 || shmat (shmid, (char *)PURE_SEG_BITS, 0) == -1)
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
99 {
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
100 fprintf (stderr, "emacs: failure obtaining new unshared memory segment.\n");
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
101 exit (1);
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
102 }
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
103 return;
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
104 }
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
105
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
106 /* Compute the file name with the dumped data. */
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
107 strcpy (name, PATH_EXEC);
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
108 strcat (name, "/");
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
109 strcat (name, EMACS_DATA_FILE);
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
110
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
111 /* Open the file and make sure the addresses have not changed. */
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
112 fd = open (name, OLD_OPEN_FLAGS, 0);
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
113 if (fd < 0)
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
114 {
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
115 fprintf (stderr, "emacs: failure opening `%s'\n", name);
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
116 exit (1);
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
117 }
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
118 if (read (fd, (char *)&dh, sizeof (dh)) != sizeof (dh)
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
119 || dh.start != &_data
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
120 || dh.end != &_end
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
121 || dh.sbrk1 != original_sbrk
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
122 || dh.puresize != PURESIZE)
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
123 {
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
124 fprintf (stderr, "emacs: header mismatch in `%s'\n", name);
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
125 exit (1);
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
126 }
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
127
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
128 /* Load in the unshared contents. */
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
129 if (!(length = dh.end - dh.start)
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
130 || read (fd, (char *)&_data, length) != length
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
131 || !(length = dh.sbrk2 - dh.sbrk1)
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
132 || brk (dh.sbrk2) == -1
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
133 || read (fd, dh.sbrk1, length) != length)
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
134 {
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
135 fprintf (stderr, "emacs: failure loading unshared data.\n");
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
136 exit (1);
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
137 }
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
138
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
139 /* Determine ipc key from environment or default */
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
140 if (ipckey && *ipckey)
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
141 shmkey = atoi (ipckey);
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
142 else
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
143 shmkey = SHMKEY;
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
144
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
145 /* Attach to "pure data" shared memory segment */
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
146 if ((shmid = shmget (shmkey, 0, 0)) == -1
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
147 || (newaddr = shmat (shmid, (char *)PURE_SEG_BITS, OLD_SHMAT_FLAGS)) == -1)
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
148 {
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
149 /* We were unable to open an existing segment. Make a new one. */
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
150 struct shmid_ds buf;
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
151
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
152 /* First get rid of the one we tried to get. */
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
153 shmdt ((char *)PURE_SEG_BITS);
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
154 shmctl (shmid, IPC_RMID, 0);
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
155
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
156 /* If we could not write the data file,
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
157 don't make a shared segment that we could write.
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
158 Make an unshared segment instead. */
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
159 if (access (name, W_OK) == 0)
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
160 {
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
161 shmid = shmget (IPC_PRIVATE, PURESIZE, NEW_SHMGET_FLAGS);
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
162 if (shmid == -1
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
163 || shmat (shmid, (char *)PURE_SEG_BITS, 0) == -1)
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
164 {
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
165 fprintf (stderr, "emacs: failure obtaining new unshared memory segment.\n");
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
166 exit (1);
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
167 }
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
168
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
169 /* Load the proper data into it. */
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
170 if (read (fd, PURE_SEG_BITS, PURESIZE) != PURESIZE)
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
171 {
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
172 fprintf (stderr, "emacs: failure loading shared memory data.\n");
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
173 shmdt ((char *)PURE_SEG_BITS);
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
174 shmctl (shmid, IPC_RMID, 0);
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
175 exit (1);
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
176 }
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
177
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
178 close (fd);
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
179 return;
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
180 }
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
181
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
182 /* Allocate the new shared segment and arrange to write it. */
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
183 if ((shmid = shmget (shmkey, PURESIZE, NEW_SHMGET_FLAGS)) == -1
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
184 || shmat (shmid, (char *)PURE_SEG_BITS, 0) == -1)
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
185 {
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
186 fprintf (stderr, "emacs: failure obtaining new shared memory segment.\n");
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
187 shmdt ((char *)PURE_SEG_BITS);
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
188 shmctl (shmid, IPC_RMID, 0);
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
189 exit (1);
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
190 }
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
191
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
192 /* Load the proper data into it. */
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
193 if (read (fd, PURE_SEG_BITS, PURESIZE) != PURESIZE)
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
194 {
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
195 fprintf (stderr, "emacs: failure loading shared memory data.\n");
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
196 shmdt ((char *)PURE_SEG_BITS);
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
197 shmctl (shmid, IPC_RMID, 0);
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
198 exit (1);
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
199 }
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
200
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
201 /* Detach from the segment and bring it back readonly. */
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
202 shmdt ((char *)PURE_SEG_BITS);
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
203
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
204 shmctl (shmid, IPC_STAT, &buf);
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
205 buf.shm_perm.mode = OLD_SHMGET_FLAGS;
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
206 shmctl (shmid, IPC_SET, &buf);
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
207
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
208 newaddr = shmat (shmid, (char *)PURE_SEG_BITS, OLD_SHMAT_FLAGS);
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
209 if (newaddr == -1)
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
210 {
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
211 fprintf (stderr, "emacs: failure reattaching shared memory segment.\n");
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
212 shmctl (shmid, IPC_RMID, 0);
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
213 exit (1);
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
214 }
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
215 }
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
216
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
217 close (fd);
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
218 }
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
219
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
220 /* Dump the appropriate parts of memory into a file named NEW
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
221 from which the shared segment can be initialized. */
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
222
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
223 void
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
224 map_out_data (new)
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
225 char *new;
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
226 {
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
227 struct data_header dh; /* saved data header */
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
228 int fd; /* saved data file descriptor */
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
229 int length; /* dumped data length; */
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
230
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
231
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
232 /* Create "saved data" file header */
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
233 dh.start = &_data;
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
234 dh.end = &_end;
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
235 dh.sbrk1 = original_sbrk;
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
236 dh.sbrk2 = sbrk (0);
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
237 dh.puresize = PURESIZE;
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
238
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
239 /* Create new "saved data" dump file */
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
240 unlink (new);
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
241 fd = open (new, NEW_OPEN_FLAGS, 0666);
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
242 if (fd < 0)
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
243 report_file_error ("Opening dump file", Fcons (build_string (new), Qnil));
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
244
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
245 /* Write saved header and data */
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
246 length = sizeof (dh);
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
247 if (write (fd, (char *)&dh, length) != length)
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
248 report_file_error ("Writing dump file header",
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
249 Fcons (build_string (new), Qnil));
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
250 length = dh.end - dh.start;
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
251 if (write (fd, dh.start, length) != length)
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
252 report_file_error ("Writing low core in dump file",
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
253 Fcons (build_string (new), Qnil));
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
254 length = dh.sbrk2 - dh.sbrk1;
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
255 if (write (fd, dh.sbrk1, length) != length)
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
256 report_file_error ("Writing heap in dump file",
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
257 Fcons (build_string (new), Qnil));
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
258 length = PURESIZE;
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
259 if (write (fd, PURE_SEG_BITS, length) != length)
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
260 report_file_error ("Writing pure data in dump file",
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
261 Fcons (build_string (new), Qnil));
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
262 close (fd);
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
263 }