Code refactoring of GC_X_printf to improve extensibility

* misc.c (GC_DEFAULT_STDOUT_FD, GC_DEFAULT_STDERR_FD): New macro.
* misc.c (GC_stdout, GC_stderr, GC_log): Use GC_DEFAULT_STDOUT_FD and
GC_DEFAULT_STDERR_FD (only if not OS2, MACOS, Win32).
* misc.c (GC_PRINTF_IMPL): Replace with GC_PRINTF_FILLBUF (move out
"buf" array definition, move out WRITE call, remove "f" and "f_name"
arguments, add "buf" argument, use sizeof(buf)-1 instead of BUFSZ.
* misc.c (GC_printf, GC_err_printf, GC_log_printf): Declare and use
"buf" array; replace GC_PRINTF_IMPL with GC_PRINTF_FILLBUF.
* misc.c (GC_printf, GC_log_printf): Call WRITE to output "buf"
content.
* misc.c (GC_err_printf): Call GC_err_puts to output "buf" content.
* misc.c (GC_default_warn_proc): Add TODO item.
Add support of Android logger

* doc/README.macros (GC_ANDROID_LOG): Document new macro.
* misc.c: Include android/log.h if GC_ANDROID_LOG.
* misc.c (GC_ANDROID_LOG_TAG): Define new macro if GC_ANDROID_LOG (and
not ye defined).
* misc.c (GC_printf, GC_log_printf, GC_err_puts): Output message using
__android_log_write with ANDROID_LOG_DEBUG/INFO/ERROR level
(respectively) and GC_ANDROID_LOG_TAG logger name if GC_ANDROID_LOG
(skip writing to GC_stdout/stderr/log (respectively) in this case
unless redirected to a file).
* misc.c (GC_default_on_abort): If GC_ANDROID_LOG then invoke
__android_log_assert after WRITE with the same message except for
omitting redundant "\n" (and ignore GC_LOOP_ON_ABORT checking in this
case because android_log_assert is a no-return function).
Update AUTHORS file
Adjust GC_dont_expand/gc/precollect and GC_print_stats type to match gc.h

* alloc.c (GC_dont_expand): Change type from GC_bool to int (as
declared in gc.h).
* misc.c (GC_dont_gc, GC_dont_precollect, GC_print_stats): Likewise.
* misc.c (GC_dont_gc, GC_dont_precollect): Initialize to FALSE instead
of 0.
Call GC_stats/verbose_log_printf instead of GC_log_printf if print_stats
(code refactoring)

* alloc.c (GC_try_to_collect_inner, GC_stopped_mark,
GC_finish_collection): Use GC_stats_log_printf instead of
GC_log_printf inside "if (GC_print_stats)" blocks.
* include/private/gc_priv.h (GC_COND_LOG_PRINTF): Likewise.
* finalize.c (GC_print_finalization_stats): Use GC_stats_log_printf
instead of GC_log_printf (since the function is invoked only inside
"if (GC_print_stats)" blocks).
* include/private/gc_priv.h (GC_printf, GC_log_printf): Refine
comment.
* include/private/gc_priv.h (GC_stats_log_printf,
GC_verbose_log_printf): New macro (redirected to GC_log_printf).
* reclaim.c (GC_reclaim_all): Use GC_verbose_log_printf instead of
GC_log_printf inside "if (GC_print_stats==VERBOSE)" blocks.
* include/private/gc_priv.h (GC_COND_LOG_PRINTF): Likewise.
* misc.c (GC_LOG_PRINTF_IMPL): New macro (only if GC_ANDROID_LOG,
copy most code from GC_log_printf).
* misc.c (GC_log_printf): Define separately for Android using
GC_LOG_PRINTF_IMPL macro (only if GC_ANDROID_LOG).
Improve logging for Android differentiating messages by log level

* include/private/gc_priv.h (VERBOSE): Move definition to be upper
than GC_print_stats.
* include/private/gc_priv.h (GC_print_stats): Define as macro (to
VERBOSE) if GC_ANDROID_LOG.
* include/private/gc_priv.h (GC_real_print_stats): New macro defined
to GC_print_stats if not GC_ANDROID_LOG otherwise declared as global
variable replacing GC_print_stats.
* include/private/gc_priv.h (GC_stats_log_printf,
GC_verbose_log_printf): Declare as GC_INNER function instead of
macro if GC_ANDROID_LOG.
* misc.c (GC_print_stats): Replace to GC_real_print_stats.
* misc.c (GC_init): Set GC_real_print_stats instead of GC_print_stats.
* misc.c (GC_log_printf): Use DEBUG log level instead of INFO (only if
GC_ANDROID_LOG).
* misc.c (GC_warn_printf): New macro (if not GC_ANDROID_LOG) or static
routine (that writes to Android log at WARN level).
* misc.c (GC_stats_log_printf, GC_verbose_log_printf): New GC_INNER
function definition (only if GC_ANDROID_LOG) using INFO/VERBOSE
Android log levels.
* misc.c (GC_default_warn_proc): Use GC_warn_printf instead of
GC_err_printf.
Fix GC_marker_Id elements initialization (WinCE)

* win32_threads.c (GC_marker_cv, GC_marker_Id): Move variable
definition up to precede GC_mark_thread (only if PARALLEL_MARK and
DONT_USE_SIGNALANDWAIT).
* win32_threads.c (GC_mark_thread): Set corresponding element of
GC_marker_Id[] to GetCurrentThreadId() value (only if PARALLEL_MARK
and DONT_USE_SIGNALANDWAIT).
* win32_threads.c (start_mark_threads): Do not set GC_marker_Id[]
elements here because GetCurrentThreadId should be invoked from the
corresponding thread; update comment (only if PARALLEL_MARK and
DONT_USE_SIGNALANDWAIT).
Eliminate 'unused variable' compiler warning in start_mark_threads (HP/UX)

* pthread_support.c (start_mark_threads): Remove unused "code" local
variable (only if HPUX or GC_DGUX386_THREADS).
Minor code refactoring of GC_thr_init (use 'markers_m1' local variable)

* pthread_support.c (GC_thr_init): Declare "markers_m1" local
variable, use it for keeping intermediate results (and store the final
result to global GC_markers_m1).
* win32_threads.c (GC_thr_init): Likewise.
* pthread_support.c (GC_thr_init): Remove redundant check of
GC_parallel.
Adjust logged messages in start_mark_threads and GC_thr_init

* pthread_support.c (start_mark_threads): Move GC_COND_LOG_PRINTF call
to the function end (i.e., call pthread_attr_destroy first).
* pthread_support.c (GC_thr_init): Do not log number of marker threads
since start_mark_threads logs number of started mark helper threads
(only if PARALLEL_MARK).
* win32_threads.c (start_mark_threads): Update comment; move logging
of started mark helper threads from GC_thr_init().
* win32_threads.c (GC_thr_init): Log corresponding message if parallel
marking is disabled (similar to that in pthread_support.c, only if
PARALLEL_MARK).
Fix heap sections overflow for Win32/Cygwin with enabled parallel marker

* include/private/gc_priv.h (MAX_HEAP_SECTS): Define to 384 instead of
128 if Win32/Cygwin and PARALLEL_MARK.
Update TODO file ('heap sections overflow' Cygwin bug fixed)
Add public GC_start_mark_threads() to allow parallel marker in fork child

* include/gc.h (GC_start_mark_threads): New API function prototype.
* misc.c (GC_start_mark_threads): New API function definition (empty)
if THREADS but not PARALLEL_MARK or not CAN_HANDLE_FORK.
* pthread_support.c (available_markers_m1): New static variable or
macro (redirecting to GC_markers_m1) depending on CAN_HANDLE_FORK
(only if PARALLEL_MARK).
* win32_threads.c (available_markers_m1): Likewise.
* pthread_support.c (start_mark_threads): Redirect to
GC_start_mark_threads (and decorate with GC_API/GC_CALL) if
CAN_HANDLE_FORK (and PARALLEL_MARK); skip start if parallel markers
are disabled or already started if CAN_HANDLE_FORK; iterate up to
available_markers_m1 (instead of GC_markers_m1); always set
GC_markers_m1 value.
* win32_threads.c (start_mark_threads): Likewise.
* pthread_support.c (GC_thr_init): Set (and test) available_markers_m1
value instead of GC_markers_m1/GC_parallel (only if PARALLEL_MARK).
* win32_threads.c (GC_thr_init): Likewise.
* tests/test.c (NO_TEST_HANDLE_FORK): Do not define if
TEST_HANDLE_FORK.
* tests/test.c (run_one_test): Invoke GC_start_mark_threads (and
additional GC_gcollect) in forked child (only if THREADS but not
NO_TEST_HANDLE_FORK); do not call tiny_reverse_test if not THREADS.
* win32_threads.c (start_mark_threads): Add assertion that the caller
is not holding the allocation lock (to match that in
pthread_support.c) if GC_PTHREADS_PARAMARK.
Update TODO (add FIXME regarding forking in Cygwin)
Minor code refactoring of GC fork handlers (remove GC prefix)

* pthread_support.c (GC_fork_prepare_proc, GC_fork_parent_proc,
GC_fork_child_proc): Declare as "static" instead of STATIC; remove
"GC_" prefix.
* win32_threads.c (GC_fork_prepare_proc, GC_fork_parent_proc,
GC_fork_child_proc): Likewise.
* pthread_support.c (GC_fork_parent_proc): Refine comment.
* pthread_support.c (GC_thr_init): Remove "GC_" prefix for
fork_prepare/parent/child_proc (only if CAN_HANDLE_FORK).
* win32_threads.c (GC_thr_init): Likewise.
Improve fork test logging in gctest

* tests/test.c (run_one_test): Move fork testing block upper (so that
other tests run in parallel in parent process).
* tests/test.c (run_one_test): Log "fork performed" and
"child started" events (only if not NO_TEST_HANDLE_FORK).
Add manual POSIX fork handling support (Android)

* include/gc.h (GC_set_handle_fork): Update comment.
* include/gc.h (GC_atfork_prepare, GC_atfork_parent, GC_atfork_child):
New API proto.
* include/private/gc_priv.h (GC_handle_fork): Change type from GC_bool
to int (to hold a value of -1).
* misc.c (GC_handle_fork): Likewise.
* include/private/gc_priv.h (GC_handle_fork): Add comment.
* misc.c (GC_set_handle_fork): Likewise.
* include/private/gcconfig.h (CAN_HANDLE_FORK): Define also for HURD
and PLATFORM_ANDROID; do not define if HAVE_NO_FORK already defined.
* include/private/gcconfig.h (CAN_CALL_ATFORK): New macro (defined if
CAN_HANDLE_FORK but not HURD or PLATFORM_ANDROID).
* include/private/gcconfig.h (HAVE_NO_FORK): New macro (defined for
Win32, OS/2 and others).
* misc.c (GC_atfork_prepare, GC_atfork_parent, GC_atfork_child): New
API function definition (only if not CAN_HANDLE_FORK and not
HAVE_NO_FORK).
* misc.c (GC_handle_fork): Map all negative values of argument except
for -1 to a positive one stored to GC_handle_fork; call GC_init to
initialize GC_stderr before ABORT invocation (only if not
SMALL_CONFIG).
* pthread_support.c (GC_atfork_prepare, GC_atfork_parent,
GC_atfork_child): New API function definition (only if
CAN_HANDLE_FORK).
* win32_threads.c (GC_atfork_prepare, GC_atfork_parent,
GC_atfork_child): Likewise.
* pthread_support.c (GC_thr_init): No pthread_atfork call if not
CAN_CALL_ATFORK; adjust GC_handle_fork value if pthread_atfork
succeeds; do not about in case of pthread_atfork failure provided
GC_handle_fork is -1 (only if CAN_HANDLE_FORK).
* win32_threads.c (GC_thr_init): Likewise.
* tests/test.c (TEST_FORK_WITHOUT_ATFORK): Recognize new macro (do not
define NO_TEST_HANDLE_FORK in this case and set INIT_FORK_SUPPORT to
no-op).
* tests/test.c (INIT_FORK_SUPPORT): Define to GC_set_handle_fork(-1)
unless HANDLE_FORK, or NO_TEST_HANDLE_FORK or TEST_FORK_WITHOUT_ATFORK.
* tests/test.c (run_one_test): Surround fork() invocation with
GC_atfork_prepare, GC_atfork_parent, GC_atfork_child calls.
* win32_threads.c: Include unistd.h if CAN_CALL_ATFORK defined
(instead of CAN_HANDLE_FORK) to get pthread_atfork prototype.
Prevent POSIX fork if mprotect_thread is started (Darwin)

* pthread_support.c (GC_atfork_prepare): Abort if GC_dirty_maintained
is set for Darwin (only if MPROTECT_VDB) since graceful suspend/resume
of mprotect_thread is unsupported at present.
Fix GC_CreateThread 'dwStackSize' argument type for Win64

* include/gc.h (GC_uintptr_t): Define (for Win32/CE) even if
GC_NO_THREAD_DECLS; move definition upper than GC_CreateThread.
* include/gc.h (GC_WIN32_SIZE_T): New macro (defined as GC_uintptr_t,
Win32 threads only).
* include/gc.h (GC_CreateThread): Use GC_WIN32_SIZE_T instead of DWORD
type for "dwStackSize" argument (Win32 threads only).
* win32_threads.c (GC_CreateThread): Likewise.
* tests/test.c (fork_a_thread): Verify types of GC_CreateThread
arguments by explicit casts (only if GC_WIN32_THREADS).
Fix ABORT definition for mingw32ce (WinCE)

* include/private/gc_priv.h (ABORT): Define as block statement
(instead of expression) for Win32/WinCE (unless NO_DEBUGGING) because
DebugBreak is defined as a statement in some toolchains (e.g.,
mingw32ce).