[Gc] To Ivan: after merge "Patch for WinCE"

Zeyi Lee biosli at hotmail.com
Thu Aug 20 05:19:11 PDT 2009


Dear Ivan:
         I've downloaded the latest gc(ChangeLog date: 2009-08-11), and then 
merged your patch code for WinCE (Part 1/2/3).
                  
         I found there are several types of issues as following:
         In diff144c
         diff -ru CVS_plus_diff112/bdwgc/win32_threads.c 
updated/bdwgc/win32_threads.c
--- CVS_plus_diff112/bdwgc/win32_threads.c  2009-08-02 18:02:12.000000000 +0400
+++ updated/bdwgc/win32_threads.c        2009-08-06 12:17:44.000000000 +0400
@@ -491,7 +504,9 @@
     } else {
       return (GC_thread)(dll_thread_table + i);
     }
-  } else {
+  }
+#endif
+  {
     word hv = ((word)thread_id) % THREAD_TABLE_SZ;
     register GC_thread p = GC_threads[hv];
I thought the added lines may could change like this:
@@ -491,7 +504,9 @@
     } else {
       return (GC_thread)(dll_thread_table + i);
     }
-  } else {
+  } else
+#endif
+  {
     word hv = ((word)thread_id) % THREAD_TABLE_SZ;
     register GC_thread p = GC_threads[hv];
The same issue :
@@ -718,7 +737,9 @@
        i++);
     if (i > my_max) return 0;
     return (GC_thread)(dll_thread_table + i);
-  } else {
+  }
+#endif
+  {
     /* We first try the cache.  If that fails, we use a very slow */
     /* approach.                                                             
*/
     int hv_guess = GET_PTHREAD_MAP_CACHE(id) % THREAD_TABLE_SZ;
change like:
@@ -718,7 +737,9 @@
        i++);
     if (i > my_max) return 0;
     return (GC_thread)(dll_thread_table + i);
-  } else {
+  } else
+#endif
+  {
     /* We first try the cache.  If that fails, we use a very slow */
     /* approach.                                                             
*/
     int hv_guess = GET_PTHREAD_MAP_CACHE(id) % THREAD_TABLE_SZ;
 
When I finished the above-mentioned process, I started to compile the project. 
Then i got error as below:
1>Compiling...
1>misc.c
1>.\source\misc.c(871) : fatal error C1083: Cannot open include 
file: 'crtdbg.h': No such file or directory
WinCE doesn't support "debug"function.
Hence, I think i have to add a crtdbg.h for WinCE to libgc? Like 
this:http://www.codeproject.com/KB/mobile/ce_crtdbg.aspx?msg=1055787
Meanwhile I changed misc.c provisional as following:
--- C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/misc.c-revBASE.svn000.tmp.c        Aug 
20 11:29:44 2009
+++ D:/WorkBackup/My_Test_Project/libGCWinCE/libgc/source/misc.c    Aug 20 
11:19:27 2009
@@ -867,7 +867,7 @@
 
 
 #if defined(MSWIN32) || defined(MSWINCE)
-# if defined(_MSC_VER) && defined(_DEBUG)
+# if defined(_MSC_VER) && defined(_DEBUG) && !defined(MSWINCE)
 #  include <crtdbg.h>
 # endif
 
@@ -941,7 +941,15 @@
       if (!tmp)
          DebugBreak();
 #     if defined(_MSC_VER) && defined(_DEBUG)
-          _CrtDbgReport(_CRT_WARN, NULL, 0, NULL, "%.*s", len, buf);
+#              if defined(MSWINCE)
+                  {
+                          WCHAR temp[1024];
+                          MultiByteToWideChar(CP_ACP, 0, buf, len, temp, 
1024);
+                          OutputDebugString(temp);
+                  }      
+#              else
+                          _CrtDbgReport(_CRT_WARN, NULL, 0, NULL, "%.*s", 
len, buf);
+#              endif
 #     endif
       IF_NEED_TO_LOCK(LeaveCriticalSection(&GC_write_cs));
       return tmp ? (int)written : -1;
 
The compiling went through but i was notified by a link error as shown below:
2>Linking...
2>libgc_smt2005_d.lib(os_dep.obj) : error LNK2019: unresolved external symbol 
backtrace referenced in function GC_save_callers
2>libgc_smt2005_d.lib(os_dep.obj) : error LNK2019: unresolved external symbol 
backtrace_symbols referenced in function GC_print_callers
     So, I commented on the SAVE_CALL_CHAIN and SAVE_CALL_COUNT.
     It ran with run-time error:
     Last error code: 87
DuplicateHandle failed
I found DuplicateHandle function help in MSDN for WINCE 5.0: 
http://msdn.microsoft.com/en-us/library/ms885208.aspx
Below is its description by type.
DuplicateHandle can duplicate handles only to the types of objects in the 
following table.
Handle	Description
Event	Returned by CreateEvent or OpenEvent.

Mutex	Returned by CreateMutex.

Semaphore	Returned by CreateSemaphore.

 
        I see NO functions in WinCE 5.0 can duplicate handles returned by 
CreateTread.
         Could I change the code like this:
--- C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/win32_threads.-revBASE.svn001.tmp.c Aug 
20 13:11:16 2009
+++ D:/WorkBackup/My_Test_Project/libGCWinCE/libgc/source/win32_threads.c    
Aug 20 13:08:39 2009
@@ -416,16 +416,21 @@
 #   define GetCurrentThread() (HANDLE)-2L /* "thread_self" pseudohandle */
 # endif
                   
-  if (!DuplicateHandle(GetCurrentProcess(),
-                           GetCurrentThread(),
-                         GetCurrentProcess(),
-                         (HANDLE*)&(me -> handle),
-                         0,
-                         0,
-                         DUPLICATE_SAME_ACCESS)) {
-        GC_err_printf("Last error code: %d\n", (int)GetLastError());
-        ABORT("DuplicateHandle failed");
-  }
+#ifdef UNDER_CE
+       /* DuplicateHandle does not exist on WinCE */
+       me -> handle = GetCurrentThread();
+#else
+       if (!DuplicateHandle(GetCurrentProcess(),
+                GetCurrentThread(),
+                GetCurrentProcess(),
+                (HANDLE*)&(me -> handle),
+                0,
+                0,
+                DUPLICATE_SAME_ACCESS)) {
+                          GC_err_printf("Last error code: %d\n", (int)
GetLastError());
+                          ABORT("DuplicateHandle failed");
+       }
+#endif
   me -> last_stack_min = ADDR_LIMIT;
   me -> stack_base = sb -> mem_base;
 # ifdef IA64
Could you pls help review it? Great thanks in advance!
Warmest regards,
GC Beginner
Zeyi Lee





More information about the Gc mailing list