summaryrefslogtreecommitdiff
path: root/pthread_support.c
Commit message (Collapse)AuthorAge
* Fix GC_remove_all_threads_but_me to cleanup thread-specific data storageIvan Maidanski2012-04-22
| | | | | * pthread_support.c (GC_remove_all_threads_but_me): Call GC_remove_specific after destroying thread-local list.
* FIX: Disable incremental mode on Darwin if fork handling requestedIvan Maidanski2012-04-03
| | | | | | | | | | | | | * doc/README.macros (NO_HANDLE_FORK): Replace back with HANDLE_FORK and update. * include/private/gcconfig.h (CAN_HANDLE_FORK): Define also for Darwin in case of MPROTECT_VDB. * misc.c (GC_set_handle_fork): Handle Darwin properly; add comment. * os_dep.c (GC_dirty_init): Do not turn on GC_dirty_maintained for Darwin if GC_handle_fork is on; add comment; remove FIXME. * pthread_support.c (GC_fork_prepare_proc): Remove WARN for Darwin (since GC_dirty_maintained is off in that case). * pthread_support.c (GC_fork_child_proc): Remove comment (for Darwin).
* Add public GC_set_handle_fork to control forked child handling supportIvan Maidanski2012-04-03
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | (Apply commit 1e882b9 from 'master' branch) * include/gc.h (GC_set_handle_fork): New API function. * misc.c (GC_set_handle_fork): Likewise. * include/private/gc_priv.h (GC_handle_fork): New internal variable declaration (only if CAN_HANDLE_FORK). * misc.c (GC_handle_fork): New internal variable (defined only if CAN_HANDLE_FORK); initialize to TRUE if HANDLE_FORK. * include/private/gcconfig.h (HANDLE_FORK): Replace with CAN_HANDLE_FORK. * pthread_support.c (HANDLE_FORK): Likewise. * win32_threads.c (HANDLE_FORK): Likewise. * include/private/gcconfig.h (CAN_HANDLE_FORK): Always define macro if HANDLE_FORK. * pthread_support.c (GC_thr_init): Replace HANDLE_FORK with CAN_HANDLE_FORK; call pthread_atfork only if GC_handle_fork; update the comment. * win32_threads.c (GC_thr_init): Likewise. * tests/test.c (NO_TEST_HANDLE_FORK): Define new macro if fork handling is not supported (or is a no-op) on the target. * tests/test.c (INIT_FORK_SUPPORT): New macro (invoke GC_set_handle_fork unless NO_TEST_HANDLE_FORK). * tests/test.c (GC_OPT_INIT): New macro (defined to GC_INIT or empty). * tests/test.c (GC_COND_INIT): Use INIT_FORK_SUPPORT and GC_OPT_INIT. * tests/test.c (run_one_test): Test NO_TEST_HANDLE_FORK (instead of target-specific macros). * win32_threads.c (GC_remove_all_threads_but_me, GC_fork_prepare_proc, GC_fork_parent_proc, GC_fork_child_proc): Do not test GC_PTHREADS. * configure.ac (HANDLE_FORK, NO_HANDLE_FORK): Update message.
* Check pthread_atfork result (POSIX threads)Ivan Maidanski2012-04-03
| | | | | * pthread_support.c (GC_thr_init): Abort on pthread_atfork failure (only if HANDLE_FORK).
* Fix GC_remove_all_threads_but_me for fork-unfriendly TLS implementationsIvan Maidanski2012-02-26
| | | | | | | | | * pthread_support.c (GC_remove_all_threads_but_me): Refine comment for stop_info.mach_thread update. * pthread_support.c (GC_remove_all_threads_but_me): Call GC_setspecific (if THREAD_LOCAL_ALLOC) to re-assign thread-local pointer to 'tlfs' (identified by GC_thread_key) of the current thread (except for USE_CUSTOM_SPECIFIC).
* Fix fork() handling for Darwin partiallyIvan Maidanski2012-02-24
| | | | | | | | | | | | | | (still not handled well for Darwin if GC incremental mode is on) * os_dep.c (GC_dirty_init): Add FIXME regarding fork (Darwin). * pthread_support.c (GC_remove_all_threads_but_me): Update mach_thread for "me" (Darwin). * pthread_support.c (GC_fork_prepare_proc): Output warning if GC_dirty_maintained (if DARWIN and MPROTECT_VDB). * pthread_support.c (GC_fork_prepare_proc, GC_fork_child_proc): Add FIXME (for Darwin). * tests/test.c (run_one_test): Do not test fork() for Darwin with incremental mode on (if HANDLE_FORK); add FIXME.
* Workaround some Linux/arm kernels bug to get correct GC_nprocs valueIvan Maidanski2012-01-26
| | | | | | | | | | | * pthread_support.c (STAT_READ, STAT_BUF_SIZE): Move the definition out of PLATFORM_ANDROID condition. * pthread_support.c (GC_get_nprocs_present): New static function obtaining number of avalable CPUs from "/sys/devices/system/cpu/present" (only Linux/arm excluding NaCl). * pthread_support.c (GC_thr_init): Invoke GC_get_nprocs_present (unless set from the environment variable) to workaround a bug in some Linux/arm kernels (including Android).
* Fix GC_get_nprocs (Linux) returned variable typeIvan Maidanski2012-01-26
| | | | | | * pthread_support.c (GC_get_nprocs): Change "result" local variable type to int from word (to match returned value type); remove redundant cast; initialize "result" variable just before its use.
* Implement precise value boundary check in GC_is_thread_tsd_validIvan Maidanski2011-11-15
| | | | | | * pthread_support.c (GC_is_thread_tsd_valid): Check tsd more correctly using GC_thread and thread_local_freelists declarations; remove FIXME. * win32_threads.c (GC_is_thread_tsd_valid): Likewise.
* Resolve "comparison of signed and unsigned values" compiler warnings.Ivan Maidanski2011-09-12
| | | | | | | | | | | | | | | | | | | | | (Apply commit 96f7891) * cord/cordprnt.c (CORD_vsprintf): Cast "prec" and "width" local variables to size_t. * dyn_load.c (GC_register_dynamic_libraries_dl_iterate_phdr): Change type of "i" local variable to int. * pthread_support.c (start_mark_threads): Likewise. * os_dep.c (GC_repeat_read): Change type of "num_read" to size_t. * os_dep.c (GC_get_maps): Change type of "result" local variable from int to ssize_t; cast "result" to size_t in comparison. * pthread_support.c (GC_remove_all_threads_but_me): Cast "result" to int. * pthread_support.c (GC_wait_for_gc_completion): Change type of "old_gc_no" local variable to word. * pthread_support.c (GC_lock): Change type of "i" local variable to unsigned. * tests/staticrootstest.c (main): Cast sizeof() value to int in comparisons.
* Support multi-threading for RTEMS target.Jie Liu2011-09-09
| | | | | | | | | | | | | | | | | | | | | | | | | (Apply commit e773036) * configure.ac: Add GC_RTEMS_PTHREADS AH_TEMPLATE and configure for rtems. * os_dep.c: Add GC_get_stack_base if GC_RTEMS_PTHREADS for rtems. * pthread_stop_world.c (GC_stop_init): Add ifdef SA_RESTART. * pthread_stop_world.c (GC_stop_init): Use sigprocmask for rtems when defined GC_RTEMS_PTHREADS. * pthread_support.c: Exclude sys/mman.h for rtems. * pthread_support.c (GC_thr_init): Set default GC_nprocs (1) for rtems. * include/gc_config_macros.h: Define GC_RTEMS_PTHREADS for rtems pthread and define GC_NO_DLOPEN for rtems. * include/private/gc_locks.h: Define USE_PTHREAD_LOCKS for rtems. * include/private/gcconfig.h: Use rtems_get_stack_bottom() for InitStackBottom; and use SIGUSR1 for SIG_SUSPEND, SIGUSR2 for SIG_THR_RESTART on rtems. * include/private/thread_local_alloc.h: Use USE_PTHREAD_SPECIFIC for rtems. * tests/test.c (Init): Use exit(0) for rtems instead of return. * configure: Regenerate. * include/private/config.h.in: Ditto.
* 2011-07-05 Ivan Maidanski <ivmai@mail.ru>ivmai2011-07-26
| | | | | | | | | | | | | | * misc.c (GC_init): Use HOTTER_THAN (instead of STACK_GROWS_DOWN) for GC_stackbottom assertion. * os_dep.c (GC_enclosing_mapping): Define only if IA64 or INCLUDE_LINUX_THREAD_DESCR; make GC_INNER. * pthread_support.c (GC_enclosing_mapping): Declare (only if INCLUDE_LINUX_THREAD_DESCR). * os_dep.c (GC_get_main_stack_base): Don't call pthread_getattr_np if REDIRECT_MALLOC as the former is observed to call redirected malloc (while GC is not initialized yet) on some Linux platforms. * include/private/gc_priv.h (MAX_HEAP_SECTS): Don't use a smaller value for SMALL_CONFIG if USE_PROC_FOR_LIBRARIES defined.
* 2011-07-05 Ivan Maidanski <ivmai@mail.ru>ivmai2011-07-26
| | | | | | | | | | * malloc.c (GC_init_lib_bounds): Call GC_init (to ensure GC is initialized before doing GC_text_mapping). * misc.c (GC_init): Add a check for GC_init recursion in case of malloc is redirected (abort with the corresponding message). * pthread.c (GC_thr_init): Place GC_add_roots_inner call into "else" branch to prevent "local variable might be uninitialized" compiler warning; add comment.
* 2011-06-30 Ivan Maidanski <ivmai@mail.ru>ivmai2011-07-26
| | | | | | | | | * pthread_support.c (GC_segment_is_thread_stack): Replace '&' operator with '&&' one in conditional expressions. * specific.c (remove_specific): Dereference "entry" local variable only if it is non-NULL. * include/gc.h (GC_NEW): Refine the comment (about the returned value).
* 2011-05-31 Ivan Maidanski <ivmai@mail.ru>ivmai2011-07-26
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * alloc.c (GC_add_current_malloc_heap, GC_build_back_graph, GC_traverse_back_graph): Move prototype to gc_priv.h. * checksums.c (GC_page_was_ever_dirty): Ditto. * dbg_mlc.c (GC_default_print_heap_obj_proc): Ditto. * dyn_load.c (GC_parse_map_entry, GC_get_maps, GC_segment_is_thread_stack, GC_roots_present, GC_is_heap_base, GC_get_next_stack): Ditto. * finalize.c (GC_reset_finalizer_nested, GC_check_finalizer_nested): Ditto. * gcj_mlc.c (GC_start_debugging, GC_store_debug_info): Ditto. * malloc.c (GC_extend_size_map, GC_text_mapping): Ditto. * mark_rts.c (GC_mark_thread_local_free_lists): Ditto. * misc.c (GC_register_main_static_data, GC_init_win32, GC_setpagesize, GC_init_linux_data_start, GC_set_and_save_fault_handler, GC_init_dyld, GC_init_netbsd_elf, GC_initialize_offsets, GC_bl_init, GC_do_blocking_inner, GC_bl_init_no_interiors): Ditto. * os_dep.c (GC_greatest_stack_base_below, GC_push_all_stacks): Ditto. * reclaim.c (GC_check_leaked): Ditto. * win32_threads.c (GC_gww_dirty_init): Ditto. * darwin_stop_world.c (GC_is_mach_marker, GC_mprotect_stop, GC_mprotect_resume): Move prototype to darwin_stop_world.h. * pthread_support.c (GC_FindTopOfStack): Ditto. * dyn_load.c (GC_cond_add_roots): Merge adjacent definitions. * mark.c (GC_page_was_ever_dirty): Remove (as already declared). * mark_rts.c (GC_roots_present): Change return type to void pointer (to match the prototype); return NULL instead of FALSE. * mark_rts.c (GC_add_roots_inner): Cast GC_roots_present() result. * os_dep.c (NEED_PROC_MAPS): Move definition to gcconfig.h. * os_dep.c (GC_write_fault_handler): Make STATIC. * os_dep.c (GC_set_write_fault_handler): New function (only if GC_WIN32_THREADS). * pthread_start.c (GC_start_rtn_prepare_thread, GC_thread_exit_proc): Move prototype to pthread_support.h. * pthread_support.c (GC_nacl_initialize_gc_thread, GC_nacl_shutdown_gc_thread, GC_unblock_gc_signals): Ditto. * pthread_support.c (GC_stop_init): Move prototype to pthread_stop_world.h. * thread_local_alloc.c (GC_check_tls_for): Reformat comment. * win32_threads.c (GC_write_fault_handler): Remove prototype. * win32_threads.c (GC_register_my_thread_inner): Call GC_set_write_fault_handler instead of SetUnhandledExceptionFilter (only if MPROTECT_VDB). * doc/README.win32: Add information about DMC. * include/private/gc_priv.h (GC_set_write_fault_handler): New prototype (only if GC_WIN32_THREADS and MPROTECT_VDB).
* 2011-05-17 Ivan Maidanski <ivmai@mail.ru>ivmai2011-07-26
| | | | | | | | | | | | * pthread_support.c (pthread_join): Add assertion (check thread is finished). * pthread_support.c (GC_register_my_thread): Don't detach the thread if invoked from the thread destructor. * win32_threads.c (GC_register_my_thread): Ditto. * win32_threads.c (GC_unregister_my_thread): Don't delete the thread (just set FINISHED) if the thread is not detached (only if GC_PTHREADS); add assertion (check the thread is not finished). * tests/threadkey_test.c (main): Join some created threads.
* 2011-05-17 Ivan Maidanski <ivmai@mail.ru>ivmai2011-07-26
| | | | | | | | | | | | | * pthread_support.c (GC_delete_gc_thread): Rename "gc_id" local variable to "t". * win32_threads.c (GC_delete_gc_thread): Ditto. * pthread_support.c (pthread_join, pthread_detach, pthread_cancel): Rename "thread_gc_id" local variable to "t". * win32_threads.c (GC_pthread_detach): Ditto. * win32_threads.c (GC_delete_gc_thread): Remove "gc_nvid" local variable. * win32_threads.c (GC_pthread_join): Rename "joinee" local variable to "t".
* 2011-05-16 Ivan Maidanski <ivmai@mail.ru>ivmai2011-07-26
| | | | | | | | | | | | | * pthread_stop_world.c (pthread_sigmask): Undefine even if not DEBUG_THREADS. * pthread_stop_world.c (GC_unblock_gc_signals): New function (only if GC_EXPLICIT_SIGNALS_UNBLOCK). * pthread_support.c (GC_unblock_gc_signals): New prototype. * pthread_support.c (GC_register_my_thread_inner, GC_register_my_thread): Call GC_unblock_gc_signals (only if GC_EXPLICIT_SIGNALS_UNBLOCK); add comment. * include/private/gcconfig.h (GC_EXPLICIT_SIGNALS_UNBLOCK): New macro.
* 2011-05-13 Ivan Maidanski <ivmai@mail.ru>ivmai2011-07-26
| | | | | | | | | | | | | | | | * dyn_load.c (GC_FirstDLOpenedLinkMap): Remove unused "r" local variable. * pthread_support.c (GC_unregister_my_thread_inner): Revert back GC_remove_specific invocation; add a comment. * include/private/thread_local_alloc.h (GC_remove_specific): Revert back. * specific.c: Expand all tabs to spaces. * specific.c (slow_getspecific): Cast qtid to AO_t. * include/private/specific.h (quick_thread_id): Reformat comment. * include/private/specific.h (key_create, setspecific, remove_specific): Remove "extern" keyword. * include/private/specific.h (getspecific): Change type of "qtid" local variable to unsigned long.
* 2011-05-11 Ivan Maidanski <ivmai@mail.ru>ivmai2011-07-26
| | | | | | | | * pthread_support.c (GC_check_tls): Fix "#endif" comment. * include/gc.h (GC_REDIRECT_TO_LOCAL): Remove deprecated comment. * include/private/thread_local_alloc.h (THREAD_LOCAL_ALLOC): Remove redundant test of the macro. * include/private/thread_local_alloc.h: Reformat the code.
* 2011-05-11 Ivan Maidanski <ivmai@mail.ru>ivmai2011-07-26
| | | | | | | | | | | | | | | | | | | | | | | | * backgraph.c (add_edge): Recognize DEBUG_PRINT_BIG_N_EDGES macro. * os_dep.c (GC_set_and_save_fault_handler): Recognize SIGACTION_FLAGS_NODEFER_HACK macro. * pthread_support.c (mark_mutex): Recognize GLIBC_2_1_MUTEX_HACK macro. * pthread_support.c (GC_acquire_mark_lock): Remove commented out code. * include/gc_inline.h (GC_MALLOC_WORDS, GC_MALLOC_ATOMIC_WORDS, GC_CONS): Remove trailing space (before back-slash). * include/private/gc_hdrs.h (GET_BI, GET_HDR_ADDR): Ditto. * include/private/gc_pmark.h (PUSH_OBJ, PUSH_CONTENTS, SET_MARK_BIT_EXIT_IF_SET, LONG_MULT, PUSH_CONTENTS_HDR, GC_PUSH_ONE_STACK, GC_PUSH_ONE_HEAP): Ditto. * include/private/thread_local_alloc.h (GC_key_create): Ditto. * include/private/gc_priv.h (SUNOS5SIGS): Don't include sys/siginfo.h on Linux. * include/private/gcconfig.h: Reformat comments (and some code). * include/private/gcconfig.h (FORCE_WRITE_PREFETCH): New macro recognized, force PREFETCH_FOR_WRITE to be defined on x86. * include/private/gcconfig.h (USE_HPUX_FIXED_STACKBOTTOM): New macro recognized (for HP/UX).
* 2011-05-11 Ivan Maidanski <ivmai@mail.ru>ivmai2011-07-26
| | | | | | | | | | | | | | | | | | * pthread_support.c (GC_unregister_my_thread_inner): Don't call GC_remove_specific. * include/private/thread_local_alloc.h (GC_remove_specific): Remove (since it is empty for all targets). * pthread_support.c (GC_record_stack_base): New inline function. * win32_threads.c (GC_record_stack_base): Ditto. * pthread_support.c (GC_register_my_thread_inner): Invoke GC_record_stack_base. * win32_threads.c (GC_register_my_thread_inner): Ditto. * pthread_support.c (GC_register_my_thread): If thread is FINISHED then call GC_record_stack_base, clear FINISHED, initialize thread-local list and return success. * win32_threads.c (GC_register_my_thread): Ditto. * include/gc.h (GC_register_my_thread): Update documentation. * include/private/thread_local_alloc.h (GC_thread_key): Ditto.
* 2011-05-10 Ivan Maidanski <ivmai@mail.ru>ivmai2011-07-26
| | | | | | | | | | | | | | | | | | | | | * pthread_start.c (GC_start_rtn_prepare_thread): Change return type to GC_thread. * pthread_start.c (GC_inner_start_routine): Pass the current thread descriptor to pthread_cleanup_push (same as in win32_threads.c). * pthread_stop_world.c (GC_push_all_stacks): Rename "me" local variable to "self". * win32_threads.c (GC_push_all_stacks): Ditto. * pthread_stop_world.c (GC_suspend_all, GC_start_world): Rename "my_thread" local variable to "self". * pthread_support.c (GC_unregister_my_thread_inner): New static function. * pthread_support.c (GC_unregister_my_thread, GC_thread_exit_proc): Use GC_unregister_my_thread_inner. * win32_threads.c (GC_register_my_thread, GC_unregister_my_thread, GC_do_blocking_inner): Rename "t" local variable to "thread_id". * win32_threads.c (GC_wait_marker, GC_notify_all_marker): Rename "id" local variable to "thread_id".
* 2011-05-10 Ivan Maidanski <ivmai@mail.ru>ivmai2011-07-26
| | | | | | | | | | | * pthread_support.c (GC_unregister_my_thread): Call pthread_self only once. * win32_threads.c (GC_pthread_start_inner): Ditto. * pthread_support.c (GC_unregister_my_thread): Add debug output. * win32_threads.c (GC_unregister_my_thread): Ditto. * pthread_support.c (GC_register_my_thread, GC_start_rtn_prepare_thread): Rename "my_pthread" local variable to "self".
* 2011-04-26 Ivan Maidanski <ivmai@mail.ru>ivmai2011-07-26
| | | | | | | | | | | | | | | | * .cvsignore (initsecondarythread, test_cpp): Add. * os_dep.c (GC_linux_stack_base): Rename to GC_linux_main_stack_base. * os_dep.c (GC_freebsd_stack_base): Rename to GC_freebsd_main_stack_base; adjust error message. * pthread_stop_world.c (GC_stop_init): Use GC_SEM_INIT_PSHARED as an argument for sem_init(). * pthread_support.c (pthread_create): Ditto. * pthread_support.c (pthread_create): Abort in case sem_init() fails. * include/private/gc_priv.h (GC_SEM_INIT_PSHARED): Define. * tests/initsecondarythread.c: Include gcconfig.h; call GC_INIT from main() if it should be done from the primordial thread only.
* 2011-04-24 Ivan Maidanski <ivmai@mail.ru>ivmai2011-07-26
| | | | | | | | * pthread_support.c (GC_get_nprocs): Don't define for Android. * pthread_support.c (GC_dummy_thread_local): Don't test GC_LINUX_THREADS. * include/gc_config_macros.h (GC_ADD_CALLER, GC_RETURN_ADDR): Define for Android.
* 2011-04-22 Ivan Maidanski <ivmai@mail.ru>ivmai2011-07-26
| | | | | | | | | | | | | | | | * os_dep.c (GC_get_maps): Always close the file. * pthread_support.c (GC_get_nprocs): Ditto. * os_dep.c (READ): Define similarly across the file (without parameters). * pthread_support.c (GC_get_nprocs): Use signed int type for "i" and "len" local variables (since read() may return -1). * include/private/gc_pmark.h (LONG_MULT): Add prefix/suffix double underscore; add "volatile" for asm. * include/private/gc_pmark.h (LONG_MULT): Add missing parentheses. * include/private/gc_priv.h (OR_WORD): Ditto. * include/private/gc_priv.h (OR_WORD): Remove unnecessary brackets and ';' symbol.
* 2011-04-22 Ivan Maidanski <ivmai@mail.ru>ivmai2011-07-26
| | | | | | | | | | * os_dep.c (GC_get_stack_base): Implement for Android (same as for Linux). * pthread_support.c (GC_get_nprocs): Return 1 (instead of -1) if failed to open "stat" file (not to issue a warning twice); update the comment. * pthread_support.c (GC_thr_init): Call sysconf() on Android to get the number of CPUs.
* 2011-04-03 Ivan Maidanski <ivmai@mail.ru>ivmai2011-07-26
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * allchblk.c (GC_freehblk): Use GC_log_printf instead of GC_printf inside "if (GC_print_stats)" branch. * alloc.c (GC_collect_or_expand): Ditto. * dyn_load.c (GC_register_dynamic_libraries): Ditto. * headers.c (GC_scratch_alloc): Ditto. * os_dep.c (GC_get_maps, GC_remap, PROTECT, GC_write_fault_handler, GC_dirty_init, GC_mprotect_thread): Ditto. * alloc.c (min_bytes_allocd): Use GC_log_printf instead of GC_printf for DEBUG_THREADS output. * darwin_stop_world.c (GC_stack_range_for, GC_suspend_thread_list, GC_stop_world, GC_thread_resume, GC_start_world): Ditto. * pthread_start.c (GC_inner_start_routine): Ditto. * pthread_stop_world.c (GC_suspend_handler, GC_restart_handler, GC_push_all_stacks, GC_suspend_all, GC_stop_world, GC_start_world): Ditto. * pthread_support.c (GC_mark_thread, GC_get_nprocs, GC_start_rtn_prepare_thread, pthread_create): Ditto. * alloc.c (GC_adj_bytes_allocd, GC_maybe_gc, GC_stopped_mark, GC_finish_collection): Reformat code. * pthread_stop_world.c (GC_print_sig_mask): Ditto. * pthread_support.c (GC_thr_init): Ditto. * checksums.c (GC_update_check_page): Use GC_printf() instead of GC_err_printf() for error printing. * checksums.c (GC_check_blocks, GC_check_dirty): Use GC_log_printf instead of GC_printf for logging purposes. * dyn_load.c (sys_errlist, sys_nerr, errno): Move declaration of external variable outside from GC_register_dynamic_libraries. * dyn_load.c (GC_register_dynamic_libraries): Don't use sys_errlist value if errno equals to sys_nerr. * dyn_load.c (GC_register_dynamic_libraries): Use GC_log_printf instead of GC_printf for DL_VERBOSE output. * dyn_load.c (GC_dyld_image_add, GC_dyld_image_remove, GC_init_dyld): Use GC_log_printf instead of GC_printf for DARWIN_DEBUG output. * os_dep.c (catch_exception_raise): Use GC_log_printf instead of GC_printf for DEBUG_EXCEPTION_HANDLING output. * reclaim.c (GC_print_free_list): Move "n" increment out of GC_printf() call.
* 2011-04-02 Ivan Maidanski <ivmai@mail.ru>ivmai2011-07-26
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * allchblk.c (GC_print_hblkfreelist): Adjust (make uniform across BDWGC) printed message (adjust letters case, terminating dot and new line symbols). * alloc.c (GC_check_fl_marks): Ditto. * backgraph.c (new_back_edges): Ditto. * checksums.c (GC_check_dirty): Ditto. * darwin_stop_world.c (GC_push_all_stacks, GC_suspend_thread_list): Ditto. * dbg_mlc.c (GC_print_type, GC_debug_free, GC_debug_realloc, store_old): Ditto. * dyn_load.c (GC_register_dynamic_libraries): Ditto. * mark.c (GC_initiate_gc, GC_mark_some, GC_mark_from, GC_push_all, GC_push_selected, GC_push_next_marked_dirty): Ditto. * mark_rts.c (GC_exclude_static_roots_inner): Ditto. * os_dep.c (GC_remap, GC_default_push_other_roots, GC_push_thread_structures, GC_dirty_init, GC_read_dirty, catch_exception_raise_state, catch_exception_raise_state_identity, GC_mprotect_thread_notify, GC_mprotect_thread, catch_exception_raise): Ditto. * pthread_stop_world.c (GC_print_sig_mask, GC_push_all_stacks, GC_stop_world, GC_stop_init): Ditto. * pthread_support.c (GC_thr_init, GC_register_my_thread_inner, GC_start_routine): Ditto. * win32_threads.c (GC_register_my_thread_inner, GC_push_all_stacks, GC_win32_start_inner, GC_pthread_join, GC_pthread_start_inner): Ditto. * alloc.c (GC_expand_hp_inner): Realign the code. * mark.c (GC_mark_from, GC_mark_local, GC_do_parallel_mark): Ditto. * misc.c (GC_init): Ditto. * os_dep.c (GC_dirty_init, GC_read_dirty): Ditto. * include/private/gc_pmark.h (PUSH_CONTENTS_HDR): Ditto. * tests/test.c (run_one_test): Ditto. * misc.c (GC_err_puts): Document. * misc.c (GC_err_write): Remove. * os_dep.c (dump_maps): Ditto. * include/private/gc_priv.h (GC_err_write): Ditto. * os_dep.c (GC_print_address_map): Call GC_err_puts() instead of dump_maps() and GC_err_write(). * os_dep.c (GC_read_dirty): Remove redundant brackets.
* 2011-03-27 Ivan Maidanski <ivmai@mail.ru>ivmai2011-07-26
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * dbg_mlc.c (GC_debug_strdup, GC_debug_free): Output a portability warning if the argument is NULL and GC is in leaks detection mode. * dbg_mlc.c (GC_debug_strndup, GC_debug_wcsdup): New public function definition. * malloc.c (GC_strndup, GC_wcsdup, strndup): Ditto. * mallocx.c (GC_posix_memalign): Ditto. * malloc.c (strdup): Fix string size value; rename "len" to "lb". * mallocx.c: Include errno.h unless WinCE (otherwise include windows.h for Win32 error constants). * win32_threads.c: Define WIN32_LEAN_AND_MEAN and NOSERVICE before windows.h inclusion. * misc.c (GC_init): Register at-exit callback if GC_find_leak (even if GC_FIND_LEAK macro is unset). * pthread_stop_world.c (NACL_STORE_REGS, __nacl_suspend_thread_if_needed, GC_nacl_initialize_gc_thread): Use BCOPY() instead of memcpy(). * pthread_support.c (GC_init_real_syms): Ditto. * doc/README: Update year in copyright. * include/gc.h: Ditto. * doc/README.macros (GC_DEBUG_REPLACEMENT, GC_REQUIRE_WCSDUP): Document new macro. * doc/README.macros (REDIRECT_MALLOC): Update documentation. * include/gc.h (GC_strndup, GC_posix_memalign, GC_debug_strndup): New API function prototype. * include/gc.h (GC_MALLOC, GC_REALLOC): Redirect to GC_debug_malloc/realloc_replacement() if GC_DEBUG_REPLACEMENT. * include/gc.h (GC_STRDUP): Remove redundant parentheses. * include/leak_detector.h (realloc, strdup): Ditto. * include/gc.h (GC_STRNDUP): New API macro. * include/gc.h (GC_NEW, GC_NEW_ATOMIC, GC_NEW_STUBBORN, GC_NEW_UNCOLLECTABLE): Add missing parentheses. * include/gc.h (GC_wcsdup, GC_debug_wcsdup): New API function prototype (only if GC_REQUIRE_WCSDUP). * include/gc.h (GC_WCSDUP): New API macro (only if GC_REQUIRE_WCSDUP). * include/leak_detector.h: Add copyright header; add usage comment; include stdlib.h and string.h after gc.h (unless GC_DONT_INCLUDE_STDLIB). * include/leak_detector.h (malloc, calloc, free, realloc): Undefine symbol before its redefinition. * include/leak_detector.h (strndup, memalign, posix_memalign): Redefine to the corresponding GC function. * include/leak_detector.h (wcsdup): Redefine to GC_WCSDUP (only if GC_REQUIRE_WCSDUP). * include/leak_detector.h (CHECK_LEAKS): Add comment; don't define the macro if already defined.
* 2011-03-13 Ivan Maidanski <ivmai@mail.ru>ivmai2011-07-26
| | | | | | | | | | | | | | | | | | | | * dbg_mlc.c (GC_make_closure): Fix SEGV in case GC_malloc returns NULL. * dbg_mlc.c (GC_debug_register_finalizer, GC_debug_register_finalizer_no_order, GC_debug_register_finalizer_unreachable, GC_debug_register_finalizer_ignore_self): Handle out of memory case properly (similar to GC_register_finalizer_inner). * headers.c (GC_install_header): Handle the case when alloc_hdr() returns NULL. * os_dep.c (GC_get_maps_len): Defend against missing "maps" file. * pthread_support.c (GC_mark_thread): Place a dummy return statement (which uses "id" argument) before the actual use of "id" as an array index (to suppress a warning produced by some static code analysis tools). * win32_threads.c (GC_mark_thread): Ditto. * pthread_support.c (GC_thr_init): Abort (with the appropriate message) if out of memory.
* 2011-03-13 Ivan Maidanski <ivmai@mail.ru>ivmai2011-07-26
| | | | | | | | | | | | | | | | * finalize.c (GC_register_finalizer_inner): Fix a typo in a comment. *include/private/gcconfig.h (STACKBOTTOM): Ditto. * gcj_mlc.c (GC_core_gcj_malloc): Replace 0/1 with TRUE/FALSE in EXPECT (the 2nd argument). * malloc.c (GC_core_malloc_atomic, GC_core_malloc, GC_free): Ditto. * mark.c (GC_mark_and_push, GC_mark_and_push_stack): Ditto. * thread_local_alloc.c (GC_malloc, GC_malloc_atomic): Ditto. * include/private/gc_hdrs.h (HC_GET_HDR): Ditto. * include/private/gc_priv.h (SMALL_OBJ): Ditto. * include/private/specific.h (getspecific): Ditto. * pthread_support.c (LOCK_STATS): Add a comment.
* 2011-03-08 Ivan Maidanski <ivmai@mail.ru>ivmai2011-07-26
| | | | | | | | | | | | | | | * pthread_support.c (pthread_cancel, GC_pthread_cancel_t, GC_pthread_cancel): Test GC_NO_PTHREAD_CANCEL (instead of NACL and GC_PTHREAD_EXIT_ATTRIBUTE). * include/gc_pthread_redirects.h (GC_pthread_cancel, pthread_cancel): Ditto. * pthread_support.c (GC_pthread_create, GC_pthread_sigmask, GC_pthread_join, GC_pthread_detach, GC_pthread_cancel): Realign code. * include/gc_pthread_redirects.h (GC_PTHREAD_EXIT_ATTRIBUTE): Define as empty for NaCl. * include/gc_pthread_redirects.h (GC_NO_PTHREAD_CANCEL): New macro defined.
* 2011-03-07 Ivan Maidanski <ivmai@mail.ru>ivmai2011-07-26
| | | | | | | | | | | | | | | | | | | | | | | | | | | | * dyn_load.c (GC_MUST_RESTORE_REDEFINED_DLOPEN): Test GC_NO_DLOPEN. * gc_dlopen.c: Ditto. * include/gc_pthread_redirects.h (GC_dlopen, dlopen): Ditto. * gc_dlopen.c: Don't include dlfcn.h (as it is included in gc_pthread_redirects.h). * pthread_support.c (pthread_sigmask, GC_pthread_sigmask_t, GC_pthread_sigmask): Test GC_NO_PTHREAD_SIGMASK (instead of GC_DARWIN_THREADS, GC_OPENBSD_THREADS and NACL). * include/gc_pthread_redirects.h (GC_pthread_sigmask, pthread_sigmask): Ditto. * win32_threads.c (pthread_sigmask, GC_pthread_sigmask): Test GC_NO_PTHREAD_SIGMASK (instead of GC_WIN32_PTHREADS); reformat the comment. * pthread_support.c (pthread_create, GC_pthread_create_t, GC_pthread_create): Rename GC_PTHREAD_CONST to GC_PTHREAD_CREATE_CONST. * win32_threads.c (GC_pthread_create): Ditto. * include/gc_pthread_redirects.h: Ditto. * include/gc_pthread_redirects.h (GC_NO_DLOPEN, GC_NO_PTHREAD_SIGMASK): New macro defined. * include/gc_pthread_redirects.h (GC_PTHREAD_CREATE_CONST): Set to empty for NaCl. * include/gc_pthread_redirects.h (GC_PTHREAD_EXIT_ATTRIBUTE): Do not define for Android (as CANCEL_SAFE is not defined).
* 2011-02-20 Ivan Maidanski <ivmai@mail.ru> (mostly really Elijah Taylor)ivmai2011-07-26
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * gc_dlopen.c: Empty unit for NaCl. * os_dep.c: Include fcntl.h for NaCl. * os_dep.c (GC_get_main_stack_base): Ignore USE_GET_STACKBASE_FOR_MAIN macro for NaCl. * os_dep.c (GC_get_stack_base): Return GC_UNIMPLEMENTED for NaCl. * os_dep.c (GC_remap): Use mmap (instead of mprotect) for NaCl. * pthread_start.c (GC_inner_start_routine): Don't invoke pthread_cleanup_push/pop for NaCl. * pthread_stop_world.c (GC_nacl_num_gc_threads, GC_nacl_thread_idx, GC_nacl_park_threads_now, GC_nacl_thread_parker, GC_nacl_gc_thread_self, GC_nacl_thread_parked, GC_nacl_thread_used, GC_nacl_thread_parking_inited, GC_nacl_thread_alloc_lock): New variable (fo NaCl only). * pthread_stop_world.c (GC_suspend_handler): Reformat the code. * pthread_stop_world.c (GC_remove_allowed_signals, suspend_handler_mask, GC_stop_count, GC_world_is_stopped, GC_retry_signals, SIG_THR_RESTART, GC_suspend_ack_sem, GC_restart_ack_sem, GC_suspend_handler_inner, GC_suspend_handler, GC_restart_handler): Don't define for NaCl. * pthread_support.c (GC_get_nprocs): Ditto. * include/private/gc_priv.h (SIG_SUSPEND): Ditto. * include/private/gcconfig.h (LINUX): Ditto. * pthread_stop_world.c (GC_push_all_stacks): Push register storage for NaCl. * pthread_stop_world.c (GC_suspend_all, GC_stop_world, GC_start_world): Implement for NaCl. * pthread_stop_world.c (GC_stop_world): Don't define unused "i" local variable for OpenBSD (and NaCl). * pthread_stop_world.c (NACL_STORE_REGS): New macro definition for NaCl. * pthread_stop_world.c (nacl_pre_syscall_hook, __nacl_suspend_thread_if_needed, nacl_post_syscall_hook, GC_nacl_initialize_gc_thread, GC_nacl_shutdown_gc_thread): New function (for NaCl only). * pthread_stop_world.c (GC_stop_init): Empty for NaCl. * pthread_support.c (pthread_cancel, pthread_sigmask): Don't redirect for NaCl. * include/gc_pthread_redirects.h (pthread_cancel, pthread_sigmask): Ditto. * pthread_support.c (GC_nacl_initialize_gc_thread, GC_nacl_shutdown_gc_thread): New internal prototype (NaCl only). * pthread_support.c (GC_new_thread, GC_delete_thread): Initialize and shutdown thread for NaCl. * pthread_support.c (GC_thr_init): Call sysconf for NaCl. * pthread_support.c (GC_pthread_exit): Call GC_thread_exit_proc for NaCl. * include/gc.h: Don't include features.h for NaCl. * include/gc_pthread_redirects.h (GC_PTHREAD_CONST): New macro. * include/gc_pthread_redirects.h (GC_pthread_create): Use GC_PTHREAD_CONST instead of const. * win32_threads.c (GC_pthread_create): Ditto. * pthread_support.c (GC_pthread_create_t, GC_pthread_create, pthread_create): Ditto. * include/private/gcconfig.h (NACL): Recognize NaCl. * include/private/gcconfig.h (GC_LINUX_THREADS): Valid for NaCl. * include/private/pthread_stop_world.h (thread_stop_info): Add reg_storage member; define NACL_GC_REG_STORAGE_SIZE macro (for NaCl only). * include/private/pthread_support.h (GC_nacl_gc_thread_self): Declare internal variable (for NaCl only).
* 2011-01-07 Ivan Maidanski <ivmai@mail.ru>ivmai2011-07-26
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * .cvsignore: Add more auto-generated files. * include/private/.cvsignore: Ditto. * darwin_stop_world.c (GC_mach_handler_thread, GC_use_mach_handler_thread, GC_darwin_register_mach_handler_thread): Define only if MPROTECT_VDB. * darwin_stop_world.c (GC_suspend_thread_list): Use GC_mach_handler_thread and GC_use_mach_handler_thread only if MPROTECT_VDB. * darwin_stop_world.c (GC_stop_world): Reset GC_mach_threads_count only if defined (i.e. unless GC_NO_THREADS_DISCOVERY). * misc.c (GC_init): Fix comment for GWW_VDB. * os_dep.c (GC_mprotect_state_t): Reformat the code. * os_dep.c (DARWIN_EXC_STATE, DARWIN_EXC_STATE_COUNT, DARWIN_EXC_STATE_T, DARWIN_EXC_STATE_DAR): New macros. * os_dep.c (catch_exception_raise): Use DARWIN_EXC_STATE, DARWIN_EXC_STATE_COUNT, DARWIN_EXC_STATE_T, DARWIN_EXC_STATE_DAR; reformat the comment. * pthread_support.c (GC_thr_init): Define "dummy" local variable only unless GC_DARWIN_THREADS; reformat the code. * include/private/gcconfig.h (MPROTECT_VDB): Define for Darwin even in the single-threaded mode; define for iPhone/iPad. * include/private/gcconfig.h (IA64): Remove unnecessary "ifdef" around "undef". * include/private/gcconfig.h (HEURISTIC1): Remove unused for Cygwin. * include/private/gcconfig.h (STACKBOTTOM): Use fixed address for Darwin/arm (instead of HEURISTIC1). * include/private/gcconfig.h (GET_MEM): Reformat the code.
* 2010-12-26 Ivan Maidanski <ivmai@mail.ru> (mostly really Geoff Nortonivmai2011-07-26
| | | | | | | | | | | | | | | | | | | | | | and Jonathan Pryor) * configure.ac: Use AC_CHECK_LIB() to check for pthread instead of just blindly linking to -lpthread, as Android includes pthread support within libc and does not provide a separate libpthread. * dyn_load.c (GC_register_dynamic_libraries): Skip current link map entry if l_addr is NULL (Android/bionic only). * pthread_stop_world.c (android_thread_kill): New internal function (Android only). * pthread_stop_world.c (GC_suspend_all, GC_start_world): Call android_thread_kill (based on tkill) instead of pthread_kill on Android (since pthread_kill cannot be used safely on the platform). * pthread_support.c (GC_new_thread): Store thread Id (obtained from gettid) for use by android_thread_kill (Android only). * include/private/pthread_support.h (GC_Thread_Rep): Add kernel_id structure member (Android only). * include/private/gcconfig.h: Recognize __x86_64 macro as a synonym of __x86_64__ (Darwin); define __environ macro (Android on M68K). * configure: Regenerate.
* 2010-10-22 Ivan Maidanski <ivmai@mail.ru>ivmai2011-07-26
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * CMakeLists.txt: Check enable_parallel_mark on Darwin. * configure.ac: Ditto. * darwin_stop_world.c (DARWIN_SUSPEND_GC_THREADS, DARWIN_QUERY_TASK_THREADS): Rename to GC_NO_THREADS_DISCOVERY and GC_DISCOVER_TASK_THREADS, respectively. * os_dep.c (DARWIN_SUSPEND_GC_THREADS): Ditto. * pthread_support.c (DARWIN_SUSPEND_GC_THREADS): Ditto. * darwin_stop_world.c (DARWIN_QUERY_TASK_THREADS): Don't define (and remove FIXME). * darwin_stop_world.c (GC_use_threads_discovery): Add GC_API; comment; remove FIXME. * win32_threads.c (GC_NO_DLLMAIN): Rename to GC_NO_THREADS_DISCOVERY. * tests/test.c (GC_NO_DLLMAIN): Ditto. * doc/README.macros (GC_NO_DLLMAIN): Ditto. * doc/README.win32 (GC_NO_DLLMAIN): Ditto. * doc/README.macros (GC_NO_THREADS_DISCOVERY): Update the comment. * win32_threads.c (GC_win32_dll_threads): Define as macro to true if GC_DISCOVER_TASK_THREADS (and not GC_NO_THREADS_DISCOVERY); update the comment. * win32_threads.c (GC_use_DllMain): Rename to GC_use_threads_discovery; do not set GC_win32_dll_threads if GC_DISCOVER_TASK_THREADS. * win32_threads.c (GC_started_thread_while_stopped, GC_lookup_thread_inner, UNPROTECT_THREAD, GC_lookup_pthread, GC_thr_init, GC_pthread_create, DllMain): Rewrite some expressions which use GC_win32_dll_threads to minimize the possibility of an "unreachable code" compiler warning when GC_win32_dll_threads is defined as a macro. * win32_threads.c (GC_unregister_my_thread): Don't call GC_delete_thread() if GC_win32_dll_threads and THREAD_LOCAL_ALLOC (since can't happen); use "t" local variable only if not GC_win32_dll_threads. * win32_threads.c (GC_register_my_thread_inner): Reformat the comment. * doc/README.macros (GC_DISCOVER_TASK_THREADS): Document. * include/gc.h (GC_use_DllMain): Rename to GC_use_threads_discovery but keep old name as a macro definition. * include/gc.h (GC_use_threads_discovery): Declare also for Darwin; update the comment. * tests/test.c (main): Call GC_use_threads_discovery for Darwin (to test the mode if possible). * configure: Regenerate.
* 2010-10-16 Ivan Maidanski <ivmai@mail.ru>ivmai2011-07-26
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | * darwin_stop_world.c (DARWIN_SUSPEND_GC_THREADS, DARWIN_QUERY_TASK_THREADS): New macro recognized. * darwin_stop_world.c (GC_query_task_threads): add STATIC; initialize to false; define as macro if DARWIN_SUSPEND_GC_THREADS or DARWIN_QUERY_TASK_THREADS; remove FIXME. * darwin_stop_world.c (GC_use_threads_discovery): New function (for setting GC_query_task_threads value). * darwin_stop_world.c (GC_mach_handler_thread, GC_use_mach_handler_thread, GC_mach_thread, GC_MAX_MACH_THREADS, GC_mach_threads, GC_mach_threads_count, GC_suspend_thread_list, GC_darwin_register_mach_handler_thread): Define only if not DARWIN_SUSPEND_GC_THREADS. * darwin_stop_world.c (GC_stop_world, GC_start_world): Exclude the code for GC_query_task_threads case from compilation unless DARWIN_SUSPEND_GC_THREADS. * os_dep.c (GC_darwin_register_mach_handler_thread): Declared only if Darwin threads and not DARWIN_SUSPEND_GC_THREADS. * os_dep.c (GC_mprotect_thread): Call GC_darwin_register_mach_handler_thread only if THREADS and not DARWIN_SUSPEND_GC_THREADS. * pthread_support.c (marker_mach_threads): Don't define if DARWIN_SUSPEND_GC_THREADS. * pthread_support.c (GC_mark_thread): Don't fill in marker_mach_threads if DARWIN_SUSPEND_GC_THREADS. * include/private/gc_locks.h (GC_need_to_lock): Always declare for THREADS case.
* 2010-10-15 Ivan Maidanski <ivmai@mail.ru>ivmai2011-07-26
| | | | | | | | | | | | * darwin_stop_world.c (GC_mach_threads): Remove static qualifier. * darwin_stop_world.c (GC_stop_init): Remove (as we do not need to really clear GC_mach_threads[]). * darwin_stop_world.c (GC_stop_world): Reset GC_mach_threads_count (instead of calling GC_stop_init). * include/private/pthread_support.h (GC_stop_init): Remove proto. * pthread_support.c (GC_stop_init): Add proto (unless Darwin). * pthread_support.c (GC_thr_init): Don't call GC_stop_init() if GC_DARWIN_THREADS.
* 2010-10-14 Ivan Maidanski <ivmai@mail.ru>ivmai2011-07-26
| | | | | | | | | | | * darwin_stop_world.c (GC_stack_range_for): New static function (move the code from GC_push_all_stacks). * darwin_stop_world.c (GC_push_all_stacks): Call GC_stack_range_for(); rename kern_return local variable to kern_result. * darwin_stop_world.c (GC_is_mach_marker): Change argument type from mach_port_t to thread_act_t. * pthread_support.c (GC_is_mach_marker): Ditto.
* 2010-10-12 Ivan Maidanski <ivmai@mail.ru>ivmai2011-07-26
| | | | | | | * darwin_stop_world.c (GC_push_all_stacks): Fix "my_task" local variable initialization (always call current_task()). * pthread_support.c (GC_thr_init, GC_register_my_thread_inner): Don't set thread's stop_info.stack_ptr value for Darwin.
* 2010-10-06 Ivan Maidanski <ivmai@mail.ru>ivmai2011-07-26
| | | | | | | | | | | | | | | | | | | | * darwin_stop_world.c (FindTopOfStack): Change return type to ptr_t (from long); make GC_INNER; add GC_ prefix. * darwin_stop_world.c (GC_push_all_stacks): Add thread_blocked local variable (initialized from the corresponding GC_thread field unless GC_query_task_threads); add assertion that our thread is not blocked; prefix FindTopOfStack with GC_ and remove no longer needed cast to ptr_t of the result; handle thread blocked case (and remove FIXME); use GC_push_all_stack_sections unless GC_query_task_threads (and remove FIXME). * pthread_support.c (GC_FindTopOfStack): Declare (if needed). * pthread_support.c (GC_do_blocking_inner): Call GC_save_regs_in_stack (if needed) before acquiring the lock. * win32_threads.c (GC_do_blocking_inner): Ditto. * pthread_support.c (GC_do_blocking_inner): Set/clear topOfStack field of GC_thread (Darwin only). * include/private/pthread_support.h (GC_thread): Add topOfStack field for Darwin (unless DARWIN_DONT_PARSE_STACK).
* 2010-10-05 Ivan Maidanski <ivmai@mail.ru>ivmai2011-07-26
| | | | | | | | | | | | | | | | | | | | | | | | | * finalize.c (GC_check_finalizer_nested): Change return type to char pointer (instead of int pointer); use explicit cast for GC_finalizer_nested assignment. * pthread_support.c (GC_check_finalizer_nested): Ditto. * win32_threads.c (GC_check_finalizer_nested): Ditto. * finalize.c (GC_finalizer_nested): Change type to unsigned char. * finalize.c (GC_notify_or_invoke_finalizers): Change type of "pnested" local variable to char pointer. * pthread_support.c (GC_do_blocking_inner, GC_call_with_gc_active): Use explicit cast for "thread_blocked" field assignment. * win32_threads.c (GC_lookup_pthread): Use explicit cast for "suspended" field assignment. * win32_threads.c (GC_Thread_Rep): Use short type for finalizer_skipped; use char type for finalizer_nested and flags fields and reorder some fields (to minimize GC_Thread_Rep structure size). * include/private/pthread_support.h (GC_Thread_Rep): Ditto. * win32_threads.c (GC_Thread_Rep): Use char type for suspended field (instead of GC_bool). * include/private/pthread_support.h (GC_Thread_Rep): Use char type for thread_blocked field (instead of short).
* 2010-09-30 Ivan Maidanski <ivmai@mail.ru>ivmai2011-07-26
| | | | | | | | | | | | | | | | | * darwin_stop_world.c (GC_query_task_threads): New variable (or macro). * darwin_stop_world.c (GC_push_all_stacks): Use GC_query_task_threads (to choose between algorithms based on kernel task_threads and based on GC_threads table); update FIXME; remove commented out GC_push_one statements. * pthread_support.c (GC_thr_init, GC_do_blocking_inner, GC_call_with_gc_active, GC_register_my_thread_inner): Initialize stack_ptr field for all platforms. * pthread_support.c (GC_call_with_gc_active): Initialize saved_stack_ptr field for all platforms. * include/private/darwin_stop_world.h (thread_stop_info): Add stack_ptr field; change type of already_suspended from int to GC_bool.
* 2010-09-29 Ivan Maidanski <ivmai@mail.ru>ivmai2011-07-26
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * darwin_stop_world.c (GC_MAX_MACH_THREADS): New macro. * darwin_stop_world.c (GC_mach_threads, GC_stop_init): Use GC_MAX_MACH_THREADS instead of THREAD_TABLE_SZ. * darwin_stop_world.c (GC_mach_threads): Add FIXME. * darwin_stop_world.c (GC_stop_init, GC_suspend_thread_list, GC_stop_world): Use FALSE and TRUE for already_suspended field and "changed", "found" variables. * darwin_stop_world.c (GC_is_mach_marker): New prototype (only if PARALLEL_MARK). * darwin_stop_world.c (GC_suspend_thread_list): Change return type to GC_bool; change type of "changed", "found" to GC_bool; make "my_thread" as an argument (instead of acquiring/deallocating it locally); do not add my_thread, GC_mach_handler_thread and marker threads to GC_mach_threads table; check for overflow of GC_mach_threads table; increase GC_mach_threads_count if "found" is true and info.suspend_count is non-zero. * darwin_stop_world.c (GC_suspend_thread_list, GC_start_world): Adjust "thread" format specifiers for GC_printf(); search thread in "old_list" starting from the previous found one. * darwin_stop_world.c (GC_stop_world): Rename "changes" to "changed" local variable; remove "result" variable; adjust GC_printf debugging message. * darwin_stop_world.c (GC_start_world): Do not check for my_thread and GC_use_mach_handler_thread (since they are not added to GC_mach_threads table); call thread_info() only if DEBUG_THREADS or GC_ASSERTIONS. * pthread_support.c (marker_mach_threads): New static variable (if Darwin). * pthread_support.c (GC_is_mach_marker): New function (if Darwin). * pthread_support.c (GC_mark_thread): Fill in marker_mach_threads table (if Darwin).
* 2010-08-14 Ivan Maidanski <ivmai@mail.ru>ivmai2011-07-26
| | | | | | | | | | | | * os_dep.c (os2_alloc): Don't set PAG_EXECUTE unless pages_executable is on. * os_dep.c (os2_alloc): Add FIXME (for recursion). * os_dep.c (UNPROTECT): Abort with a more informative message if pages_executable is on ("mprotect" case). * os_dep.c (PROTECT, UNPROTECT): Set VM_PROT_EXEC if pages_executable is on (Darwin case). * pthread_support.c (GC_init_real_syms): Abort with an informative message if libgc is linked after libpthread.
* 2010-08-14 Ivan Maidanski <ivmai@mail.ru>ivmai2011-07-26
| | | | | | | | | | * dyn_load.c (GC_register_dynlib_callback): Adjust "start" pointer for 64-bit targets. * pthread_support.c (start_mark_threads): Expand PTHREAD_CREATE macro. * pthread_support.c (start_mark_threads): Call INIT_REAL_SYMS() since REAL(pthread_create) is used. * pthread_support.c (PTHREAD_CREATE): Remove unused.
* 2010-08-14 Ivan Maidanski <ivmai@mail.ru> (with help from Hans Boehm)ivmai2011-07-26
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * include/gc_pthread_redirects.h: Test GC_PTHREADS and GC_H at the beginning of the file. * include/gc_pthread_redirects.h (GC_PTHREAD_EXIT_ATTRIBUTE): New macro (defined only for Linux and Solaris). * include/gc_pthread_redirects.h (GC_pthread_cancel, GC_pthread_exit): Declare new API function (only if GC_PTHREAD_EXIT_ATTRIBUTE). * include/gc_pthread_redirects.h (pthread_cancel, pthread_exit): Redirect (if GC_PTHREAD_EXIT_ATTRIBUTE). * include/private/pthread_support.h (DISABLED_GC): New macro. * pthread_support.c (pthread_cancel, pthread_exit): Restore original definition or declare "real" function (if needed and GC_PTHREAD_EXIT_ATTRIBUTE). * pthread_support.c (GC_pthread_cancel_t, GC_pthread_exit_t): Declare new types if needed. * pthread_support.c (GC_pthread_cancel, GC_pthread_exit): New function definition (only if GC_PTHREAD_EXIT_ATTRIBUTE). * pthread_support.c (GC_init_real_syms): Initialise pointers to the "real" pthread_cancel and pthread_exit (only if GC_PTHREAD_EXIT_ATTRIBUTE). * pthread_support.c (GC_unregister_my_thread): Enable collections if DISABLED_GC was set (only if GC_PTHREAD_EXIT_ATTRIBUTE). * pthread_support.c (pthread_cancel, pthread_exit): New wrapped function definition (only if GC_PTHREAD_EXIT_ATTRIBUTE defined). * pthread_support.c (GC_start_routine): Refine the comment. * extra/threadlibs.c (main): Adjust --wrap (add "read", "pthread_exit", "pthread_cancel" but remove "sleep"). * doc/README.linux (GC_USE_LD_WRAP): Ditto. * doc/README.linux: Expand all tabs to spaces; remove trailing spaces at EOLn.