6
6
* Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
7
7
*
8
8
* IDENTIFICATION
9
- * $PostgreSQL: pgsql/src/backend/port/win32_shmem.c,v 1.12 2009/07/24 20: 12:42 mha Exp $
9
+ * $PostgreSQL: pgsql/src/backend/port/win32_shmem.c,v 1.13 2010/01/02 12:18:45 mha Exp $
10
10
*
11
11
*-------------------------------------------------------------------------
12
12
*/
16
16
#include "storage/ipc.h"
17
17
#include "storage/pg_shmem.h"
18
18
19
- unsigned long UsedShmemSegID = 0 ;
19
+ HANDLE UsedShmemSegID = 0 ;
20
20
void * UsedShmemSegAddr = NULL ;
21
21
static Size UsedShmemSegSize = 0 ;
22
22
@@ -125,6 +125,8 @@ PGSharedMemoryCreate(Size size, bool makePrivate, int port)
125
125
hmap2 ;
126
126
char * szShareMem ;
127
127
int i ;
128
+ DWORD size_high ;
129
+ DWORD size_low ;
128
130
129
131
/* Room for a header? */
130
132
Assert (size > MAXALIGN (sizeof (PGShmemHeader )));
@@ -133,6 +135,13 @@ PGSharedMemoryCreate(Size size, bool makePrivate, int port)
133
135
134
136
UsedShmemSegAddr = NULL ;
135
137
138
+ #ifdef _WIN64
139
+ size_high = size >> 32 ;
140
+ #else
141
+ size_high = 0 ;
142
+ #endif
143
+ size_low = (DWORD ) size ;
144
+
136
145
/*
137
146
* When recycling a shared memory segment, it may take a short while
138
147
* before it gets dropped from the global namespace. So re-try after
@@ -147,11 +156,11 @@ PGSharedMemoryCreate(Size size, bool makePrivate, int port)
147
156
*/
148
157
SetLastError (0 );
149
158
150
- hmap = CreateFileMapping (( HANDLE ) 0xFFFFFFFF , /* Use the pagefile */
159
+ hmap = CreateFileMapping (INVALID_HANDLE_VALUE , /* Use the pagefile */
151
160
NULL , /* Default security attrs */
152
161
PAGE_READWRITE , /* Memory is Read/Write */
153
- 0L , /* Size Upper 32 Bits */
154
- ( DWORD ) size , /* Size Lower 32 bits */
162
+ size_high , /* Size Upper 32 Bits */
163
+ size_low , /* Size Lower 32 bits */
155
164
szShareMem );
156
165
157
166
if (!hmap )
@@ -203,7 +212,7 @@ PGSharedMemoryCreate(Size size, bool makePrivate, int port)
203
212
204
213
205
214
/* Register on-exit routine to delete the new segment */
206
- on_shmem_exit (pgwin32_SharedMemoryDelete , Int32GetDatum (( unsigned long ) hmap2 ));
215
+ on_shmem_exit (pgwin32_SharedMemoryDelete , PointerGetDatum ( hmap2 ));
207
216
208
217
/*
209
218
* Get a pointer to the new shared memory segment. Map the whole segment
@@ -235,7 +244,7 @@ PGSharedMemoryCreate(Size size, bool makePrivate, int port)
235
244
/* Save info for possible future use */
236
245
UsedShmemSegAddr = memAddress ;
237
246
UsedShmemSegSize = size ;
238
- UsedShmemSegID = ( unsigned long ) hmap2 ;
247
+ UsedShmemSegID = hmap2 ;
239
248
240
249
return hdr ;
241
250
}
@@ -266,10 +275,10 @@ PGSharedMemoryReAttach(void)
266
275
elog (FATAL , "failed to release reserved memory region (addr=%p): %lu" ,
267
276
UsedShmemSegAddr , GetLastError ());
268
277
269
- hdr = (PGShmemHeader * ) MapViewOfFileEx (( HANDLE ) UsedShmemSegID , FILE_MAP_READ | FILE_MAP_WRITE , 0 , 0 , 0 , UsedShmemSegAddr );
278
+ hdr = (PGShmemHeader * ) MapViewOfFileEx (UsedShmemSegID , FILE_MAP_READ | FILE_MAP_WRITE , 0 , 0 , 0 , UsedShmemSegAddr );
270
279
if (!hdr )
271
- elog (FATAL , "could not reattach to shared memory (key=%d , addr=%p): %lu" ,
272
- ( int ) UsedShmemSegID , UsedShmemSegAddr , GetLastError ());
280
+ elog (FATAL , "could not reattach to shared memory (key=%p , addr=%p): %lu" ,
281
+ UsedShmemSegID , UsedShmemSegAddr , GetLastError ());
273
282
if (hdr != origUsedShmemSegAddr )
274
283
elog (FATAL , "reattaching to shared memory returned unexpected address (got %p, expected %p)" ,
275
284
hdr , origUsedShmemSegAddr );
@@ -308,7 +317,7 @@ static void
308
317
pgwin32_SharedMemoryDelete (int status , Datum shmId )
309
318
{
310
319
PGSharedMemoryDetach ();
311
- if (!CloseHandle (( HANDLE ) DatumGetInt32 (shmId )))
320
+ if (!CloseHandle (DatumGetPointer (shmId )))
312
321
elog (LOG , "could not close handle to shared memory: %lu" , GetLastError ());
313
322
}
314
323
0 commit comments