projects
/
mono.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge pull request #703 from ysw/master
[mono.git]
/
libgc
/
misc.c
diff --git
a/libgc/misc.c
b/libgc/misc.c
index 5b10feeb961faa9badb793eae3b4659ed24cab5c..53d47c53dbc86338b6b06c00141da1b8a8766098 100644
(file)
--- a/
libgc/misc.c
+++ b/
libgc/misc.c
@@
-64,7
+64,10
@@
/* Used only for assertions, and to prevent */
/* recursive reentry in the system call wrapper. */
# endif
/* Used only for assertions, and to prevent */
/* recursive reentry in the system call wrapper. */
# endif
-# else
+# elif defined(SN_TARGET_PS3)
+ #include <pthread.h>
+ pthread_mutex_t GC_allocate_ml;
+# else
--> declare allocator lock here
# endif
# endif
--> declare allocator lock here
# endif
# endif
@@
-81,6
+84,8
@@
/* dyn_load.c isn't linked in. */
#ifdef DYNAMIC_LOADING
# define GC_REGISTER_MAIN_STATIC_DATA() GC_register_main_static_data()
/* dyn_load.c isn't linked in. */
#ifdef DYNAMIC_LOADING
# define GC_REGISTER_MAIN_STATIC_DATA() GC_register_main_static_data()
+#elif defined(GC_DONT_REGISTER_MAIN_STATIC_DATA)
+# define GC_REGISTER_MAIN_STATIC_DATA() FALSE
#else
# define GC_REGISTER_MAIN_STATIC_DATA() TRUE
#endif
#else
# define GC_REGISTER_MAIN_STATIC_DATA() TRUE
#endif
@@
-246,7
+251,7
@@
void *arg2;
byte_sz = WORDS_TO_BYTES(word_sz);
if (GC_all_interior_pointers) {
/* We need one extra byte; don't fill in GC_size_map[byte_sz] */
byte_sz = WORDS_TO_BYTES(word_sz);
if (GC_all_interior_pointers) {
/* We need one extra byte; don't fill in GC_size_map[byte_sz] */
- byte_sz
--
;
+ byte_sz
-= EXTRA_BYTES
;
}
for (j = low_limit; j <= byte_sz; j++) GC_size_map[j] = word_sz;
}
for (j = low_limit; j <= byte_sz; j++) GC_size_map[j] = word_sz;
@@
-466,10
+471,23
@@
size_t GC_get_total_bytes GC_PROTO(())
return ((size_t) WORDS_TO_BYTES(GC_words_allocd+GC_words_allocd_before_gc));
}
return ((size_t) WORDS_TO_BYTES(GC_words_allocd+GC_words_allocd_before_gc));
}
+int GC_get_suspend_signal GC_PROTO(())
+{
+#if defined(SIG_SUSPEND) && defined(GC_PTHREADS) && !defined(GC_MACOSX_THREADS) && !defined(GC_OPENBSD_THREADS)
+ return SIG_SUSPEND;
+#else
+ return -1;
+#endif
+}
+
GC_bool GC_is_initialized = FALSE;
void GC_init()
{
GC_bool GC_is_initialized = FALSE;
void GC_init()
{
+#if defined(SN_TARGET_PS3)
+ pthread_mutexattr_t mattr;
+#endif
+
DCL_LOCK_STATE;
DISABLE_SIGNALS();
DCL_LOCK_STATE;
DISABLE_SIGNALS();
@@
-477,9
+495,9
@@
void GC_init()
#if defined(GC_WIN32_THREADS) && !defined(GC_PTHREADS)
if (!GC_is_initialized) {
BOOL (WINAPI *pfn) (LPCRITICAL_SECTION, DWORD) = NULL;
#if defined(GC_WIN32_THREADS) && !defined(GC_PTHREADS)
if (!GC_is_initialized) {
BOOL (WINAPI *pfn) (LPCRITICAL_SECTION, DWORD) = NULL;
- HMODULE hK32 = GetModuleHandle(
"kernel32.dll"
);
+ HMODULE hK32 = GetModuleHandle(
_T("kernel32.dll")
);
if (hK32)
if (hK32)
-
(FARPROC)
pfn = GetProcAddress(hK32,
+ pfn = GetProcAddress(hK32,
"InitializeCriticalSectionAndSpinCount");
if (pfn)
pfn(&GC_allocate_ml, 4000);
"InitializeCriticalSectionAndSpinCount");
if (pfn)
pfn(&GC_allocate_ml, 4000);
@@
-487,6
+505,13
@@
void GC_init()
InitializeCriticalSection (&GC_allocate_ml);
}
#endif /* MSWIN32 */
InitializeCriticalSection (&GC_allocate_ml);
}
#endif /* MSWIN32 */
+#if defined(SN_TARGET_PS3)
+ pthread_mutexattr_init (&mattr);
+
+ pthread_mutex_init (&GC_allocate_ml, &mattr);
+ pthread_mutexattr_destroy (&mattr);
+
+#endif
LOCK();
GC_init_inner();
LOCK();
GC_init_inner();
@@
-659,7
+684,7
@@
void GC_init_inner()
# if defined(SEARCH_FOR_DATA_START)
GC_init_linux_data_start();
# endif
# if defined(SEARCH_FOR_DATA_START)
GC_init_linux_data_start();
# endif
-# if
(defined(NETBSD) || defined(OPENBSD)
) && defined(__ELF__)
+# if
defined(NETBSD
) && defined(__ELF__)
GC_init_netbsd_elf();
# endif
# if defined(GC_PTHREADS) || defined(GC_SOLARIS_THREADS) \
GC_init_netbsd_elf();
# endif
# if defined(GC_PTHREADS) || defined(GC_SOLARIS_THREADS) \
@@
-804,7
+829,10
@@
void GC_init_inner()
void GC_enable_incremental GC_PROTO(())
{
void GC_enable_incremental GC_PROTO(())
{
-# if !defined(SMALL_CONFIG)
+# if !defined(SMALL_CONFIG) && !defined(KEEP_BACK_PTRS)
+ /* If we are keeping back pointers, the GC itself dirties all */
+ /* pages on which objects have been marked, making */
+ /* incremental GC pointless. */
if (!GC_find_leak) {
DCL_LOCK_STATE;
if (!GC_find_leak) {
DCL_LOCK_STATE;
@@
-975,7
+1003,11
@@
long a, b, c, d, e, f;
buf[1024] = 0x15;
(void) sprintf(buf, format, a, b, c, d, e, f);
if (buf[1024] != 0x15) ABORT("GC_printf clobbered stack");
buf[1024] = 0x15;
(void) sprintf(buf, format, a, b, c, d, e, f);
if (buf[1024] != 0x15) ABORT("GC_printf clobbered stack");
+#ifdef NACL
+ WRITE(GC_stdout, buf, strlen(buf));
+#else
if (WRITE(GC_stdout, buf, strlen(buf)) < 0) ABORT("write to stdout failed");
if (WRITE(GC_stdout, buf, strlen(buf)) < 0) ABORT("write to stdout failed");
+#endif
}
void GC_err_printf(format, a, b, c, d, e, f)
}
void GC_err_printf(format, a, b, c, d, e, f)
@@
-987,13
+1019,21
@@
long a, b, c, d, e, f;
buf[1024] = 0x15;
(void) sprintf(buf, format, a, b, c, d, e, f);
if (buf[1024] != 0x15) ABORT("GC_err_printf clobbered stack");
buf[1024] = 0x15;
(void) sprintf(buf, format, a, b, c, d, e, f);
if (buf[1024] != 0x15) ABORT("GC_err_printf clobbered stack");
+#ifdef NACL
+ WRITE(GC_stderr, buf, strlen(buf));
+#else
if (WRITE(GC_stderr, buf, strlen(buf)) < 0) ABORT("write to stderr failed");
if (WRITE(GC_stderr, buf, strlen(buf)) < 0) ABORT("write to stderr failed");
+#endif
}
void GC_err_puts(s)
GC_CONST char *s;
{
}
void GC_err_puts(s)
GC_CONST char *s;
{
+#ifdef NACL
+ WRITE(GC_stderr, s, strlen(s));
+#else
if (WRITE(GC_stderr, s, strlen(s)) < 0) ABORT("write to stderr failed");
if (WRITE(GC_stderr, s, strlen(s)) < 0) ABORT("write to stderr failed");
+#endif
}
#if defined(LINUX) && !defined(SMALL_CONFIG)
}
#if defined(LINUX) && !defined(SMALL_CONFIG)