diff lphobos/gc/win32.d @ 473:373489eeaf90

Applied downs' lphobos update
author Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
date Mon, 04 Aug 2008 19:28:49 +0200
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lphobos/gc/win32.d	Mon Aug 04 19:28:49 2008 +0200
@@ -0,0 +1,168 @@
+
+// Copyright (C) 2001-2002 by Digital Mars
+// All Rights Reserved
+// www.digitalmars.com
+// Written by Walter Bright
+
+import std.c.windows.windows;
+
+alias int pthread_t;
+
+/***********************************
+ * Map memory.
+ */
+
+void *os_mem_map(uint nbytes)
+{
+    return VirtualAlloc(null, nbytes, MEM_RESERVE, PAGE_READWRITE);
+}
+
+/***********************************
+ * Commit memory.
+ * Returns:
+ *	0	success
+ *	!=0	failure
+ */
+
+int os_mem_commit(void *base, uint offset, uint nbytes)
+{
+    void *p;
+
+    p = VirtualAlloc(base + offset, nbytes, MEM_COMMIT, PAGE_READWRITE);
+    return cast(int)(p == null);
+}
+
+
+/***********************************
+ * Decommit memory.
+ * Returns:
+ *	0	success
+ *	!=0	failure
+ */
+
+int os_mem_decommit(void *base, uint offset, uint nbytes)
+{
+    return cast(int)VirtualFree(base + offset, nbytes, MEM_DECOMMIT) == 0; 
+}
+
+/***********************************
+ * Unmap memory allocated with os_mem_map().
+ * Memory must have already been decommitted.
+ * Returns:
+ *	0	success
+ *	!=0	failure
+ */
+
+int os_mem_unmap(void *base, uint nbytes)
+{
+    return cast(int)VirtualFree(base, 0, MEM_RELEASE) == 0; 
+}
+
+
+/********************************************
+ */
+
+pthread_t pthread_self()
+{
+    //printf("pthread_self() = %x\n", GetCurrentThreadId());
+    return cast(pthread_t) GetCurrentThreadId();
+}
+
+/**********************************************
+ * Determine "bottom" of stack (actually the top on Win32 systems).
+ */
+
+void *os_query_stackBottom()
+{
+    asm
+    {
+	naked			;
+	mov	EAX,FS:4	;
+	ret			;
+    }
+}
+
+/**********************************************
+ * Determine base address and size of static data segment.
+ */
+
+version (GNU)
+{
+// This is MinGW specific
+extern (C)
+{
+    // TODO: skip the .rdata between .data and .bss?
+    extern int _data_start__;
+    extern int _bss_end__;
+}
+
+void os_query_staticdataseg(void **base, uint *nbytes)
+{
+    *base = cast(void *)&_data_start__;
+    *nbytes = cast(uint)(cast(char *)&_bss_end__ - cast(char *)&_data_start__);
+}
+
+}
+else
+{
+    
+extern (C)
+{
+    extern int _xi_a;	// &_xi_a just happens to be start of data segment
+    extern int _edata;	// &_edata is start of BSS segment
+    extern int _end;	// &_end is past end of BSS
+}
+
+void os_query_staticdataseg(void **base, uint *nbytes)
+{
+    *base = cast(void *)&_xi_a;
+    *nbytes = cast(uint)(cast(char *)&_end - cast(char *)&_xi_a);
+}
+
+}
+/++++
+
+void os_query_staticdataseg(void **base, uint *nbytes)
+{
+    static char dummy = 6;
+    SYSTEM_INFO si;
+    MEMORY_BASIC_INFORMATION mbi;
+    char *p;
+    void *bottom = null;
+    uint size = 0;
+
+    // Tests show the following does not work reliably.
+    // The reason is that the data segment is arbitrarily divided
+    // up into PAGE_READWRITE and PAGE_WRITECOPY.
+    // This means there are multiple regions to query, and
+    // can even wind up including the code segment.
+    assert(0);				// fix implementation
+
+    GetSystemInfo(&si);
+    p = (char *)((uint)(&dummy) & ~(si.dwPageSize - 1));
+    while (VirtualQuery(p, &mbi, sizeof(mbi)) == sizeof(mbi) &&
+        mbi.Protect & (PAGE_READWRITE | PAGE_WRITECOPY) &&
+        !(mbi.Protect & PAGE_GUARD) &&
+        mbi.AllocationBase != 0)
+    {
+	bottom = (void *)mbi.BaseAddress;
+	size = (uint)mbi.RegionSize;
+
+	printf("dwPageSize        = x%x\n", si.dwPageSize);
+	printf("&dummy            = %p\n", &dummy);
+	printf("BaseAddress       = %p\n", mbi.BaseAddress);
+	printf("AllocationBase    = %p\n", mbi.AllocationBase);
+	printf("AllocationProtect = x%x\n", mbi.AllocationProtect);
+	printf("RegionSize        = x%x\n", mbi.RegionSize);
+	printf("State             = x%x\n", mbi.State);
+	printf("Protect           = x%x\n", mbi.Protect);
+	printf("Type              = x%x\n\n", mbi.Type);
+
+	p -= si.dwPageSize;
+    }
+
+    *base = bottom;
+    *nbytes = size;
+}
+
+++++/