Imported Upstream version 4.4.0.40

Former-commit-id: 6427cc082e74df30afc535fd906a3494b74b0817
This commit is contained in:
Xamarin Public Jenkins
2016-03-16 12:38:19 -04:00
parent f3e3aab35a
commit a632333cc7
110 changed files with 1496 additions and 556 deletions

View File

@@ -17,6 +17,7 @@
#include <mono/io-layer/wapi-private.h>
#include <mono/io-layer/io-trace.h>
#include <mono/utils/mono-logger-internals.h>
#include <mono/utils/mono-time.h>
static gboolean own_if_signalled(gpointer handle)
{
@@ -88,6 +89,7 @@ guint32 WaitForSingleObjectEx(gpointer handle, guint32 timeout,
int thr_ret;
gboolean apc_pending = FALSE;
gpointer current_thread = wapi_get_current_thread_handle ();
gint64 now, end;
if (current_thread == NULL) {
SetLastError (ERROR_INVALID_HANDLE);
@@ -157,6 +159,9 @@ guint32 WaitForSingleObjectEx(gpointer handle, guint32 timeout,
goto done;
}
if (timeout != INFINITE)
end = mono_100ns_ticks () + timeout * 1000 * 10;
do {
/* Check before waiting on the condition, just in case
*/
@@ -170,7 +175,17 @@ guint32 WaitForSingleObjectEx(gpointer handle, guint32 timeout,
goto done;
}
waited = _wapi_handle_timedwait_signal_handle (handle, timeout, alertable, FALSE, &apc_pending);
if (timeout == INFINITE) {
waited = _wapi_handle_timedwait_signal_handle (handle, INFINITE, alertable, FALSE, &apc_pending);
} else {
now = mono_100ns_ticks ();
if (end < now) {
ret = WAIT_TIMEOUT;
goto done;
}
waited = _wapi_handle_timedwait_signal_handle (handle, (end - now) / 10 / 1000, alertable, FALSE, &apc_pending);
}
if(waited==0 && !apc_pending) {
/* Condition was signalled, so hopefully
@@ -253,6 +268,7 @@ guint32 SignalObjectAndWait(gpointer signal_handle, gpointer wait,
int thr_ret;
gboolean apc_pending = FALSE;
gpointer current_thread = wapi_get_current_thread_handle ();
gint64 now, end;
if (current_thread == NULL) {
SetLastError (ERROR_INVALID_HANDLE);
@@ -327,6 +343,9 @@ guint32 SignalObjectAndWait(gpointer signal_handle, gpointer wait,
goto done;
}
if (timeout != INFINITE)
end = mono_100ns_ticks () + timeout * 1000 * 10;
do {
/* Check before waiting on the condition, just in case
*/
@@ -339,7 +358,17 @@ guint32 SignalObjectAndWait(gpointer signal_handle, gpointer wait,
goto done;
}
waited = _wapi_handle_timedwait_signal_handle (wait, timeout, alertable, FALSE, &apc_pending);
if (timeout == INFINITE) {
waited = _wapi_handle_timedwait_signal_handle (wait, INFINITE, alertable, FALSE, &apc_pending);
} else {
now = mono_100ns_ticks ();
if (end < now) {
ret = WAIT_TIMEOUT;
goto done;
}
waited = _wapi_handle_timedwait_signal_handle (wait, (end - now) / 10 / 1000, alertable, FALSE, &apc_pending);
}
if (waited==0 && !apc_pending) {
/* Condition was signalled, so hopefully
@@ -445,6 +474,7 @@ guint32 WaitForMultipleObjectsEx(guint32 numobjects, gpointer *handles,
gboolean poll;
gpointer sorted_handles [MAXIMUM_WAIT_OBJECTS];
gboolean apc_pending = FALSE;
gint64 now, end;
if (current_thread == NULL) {
SetLastError (ERROR_INVALID_HANDLE);
@@ -528,6 +558,10 @@ guint32 WaitForMultipleObjectsEx(guint32 numobjects, gpointer *handles,
if (timeout == 0) {
return WAIT_TIMEOUT;
}
if (timeout != INFINITE)
end = mono_100ns_ticks () + timeout * 1000 * 10;
/* Have to wait for some or all handles to become signalled
*/
@@ -571,7 +605,16 @@ guint32 WaitForMultipleObjectsEx(guint32 numobjects, gpointer *handles,
if (!done) {
/* Enter the wait */
ret = _wapi_handle_timedwait_signal (timeout, poll, &apc_pending);
if (timeout == INFINITE) {
ret = _wapi_handle_timedwait_signal (INFINITE, poll, &apc_pending);
} else {
now = mono_100ns_ticks ();
if (end < now) {
ret = WAIT_TIMEOUT;
} else {
ret = _wapi_handle_timedwait_signal ((end - now) / 10 / 1000, poll, &apc_pending);
}
}
} else {
/* No need to wait */
ret = 0;

View File

@@ -1046,7 +1046,8 @@ do_mono_image_load (MonoImage *image, MonoImageOpenStatus *status,
}
}
if (!image->loader) {
*status = MONO_IMAGE_IMAGE_INVALID;
if (status)
*status = MONO_IMAGE_IMAGE_INVALID;
goto invalid_image;
}

View File

@@ -601,7 +601,7 @@ jit_info_table_add (MonoDomain *domain, MonoJitInfoTable *volatile *table_ptr, M
*table_ptr = new_table;
mono_memory_barrier ();
domain->num_jit_info_tables++;
mono_thread_hazardous_free_or_queue (table, (MonoHazardousFreeFunc)mono_jit_info_table_free, TRUE, FALSE);
mono_thread_hazardous_free_or_queue (table, (MonoHazardousFreeFunc)mono_jit_info_table_free, HAZARD_FREE_MAY_LOCK, HAZARD_FREE_SAFE_CTX);
table = new_table;
goto restart;
@@ -677,7 +677,7 @@ mono_jit_info_free_or_queue (MonoDomain *domain, MonoJitInfo *ji)
if (domain->num_jit_info_tables <= 1) {
/* Can it actually happen that we only have one table
but ji is still hazardous? */
mono_thread_hazardous_free_or_queue (ji, g_free, TRUE, FALSE);
mono_thread_hazardous_free_or_queue (ji, g_free, HAZARD_FREE_MAY_LOCK, HAZARD_FREE_SAFE_CTX);
} else {
domain->jit_info_free_queue = g_slist_prepend (domain->jit_info_free_queue, ji);
}

View File

@@ -57,11 +57,10 @@ ves_icall_System_Diagnostics_Process_GetPid_internal (void)
return mono_process_current_pid ();
}
void ves_icall_System_Diagnostics_Process_Process_free_internal (MonoObject *this_obj,
HANDLE process)
void ves_icall_System_Diagnostics_Process_Process_free_internal (HANDLE process)
{
#ifdef THREAD_DEBUG
g_message ("%s: Closing process %p, handle %p", __func__, this_obj, process);
g_message ("%s: Closing process handle %p", __func__, process);
#endif
#if defined(TARGET_WIN32) || defined(HOST_WIN32)

View File

@@ -60,7 +60,7 @@ G_BEGIN_DECLS
HANDLE ves_icall_System_Diagnostics_Process_GetProcess_internal (guint32 pid);
MonoArray *ves_icall_System_Diagnostics_Process_GetProcesses_internal (void);
guint32 ves_icall_System_Diagnostics_Process_GetPid_internal (void);
void ves_icall_System_Diagnostics_Process_Process_free_internal (MonoObject *this_obj, HANDLE process);
void ves_icall_System_Diagnostics_Process_Process_free_internal (HANDLE process);
MonoArray *ves_icall_System_Diagnostics_Process_GetModules_internal (MonoObject *this_obj, HANDLE process);
void ves_icall_System_Diagnostics_FileVersionInfo_GetVersionInfo_internal (MonoObject *this_obj, MonoString *filename);
MonoBoolean ves_icall_System_Diagnostics_Process_ShellExecuteEx_internal (MonoProcessStartInfo *proc_start_info, MonoProcInfo *process_handle);

View File

@@ -2338,8 +2338,6 @@ mono_gc_scan_object (void *obj, void *gc_data)
void
sgen_client_scan_thread_data (void *start_nursery, void *end_nursery, gboolean precise, ScanCopyContext ctx)
{
SgenThreadInfo *info;
scan_area_arg_start = start_nursery;
scan_area_arg_end = end_nursery;
@@ -2393,7 +2391,7 @@ sgen_client_scan_thread_data (void *start_nursery, void *end_nursery, gboolean p
}
}
}
} END_FOREACH_THREAD
} FOREACH_THREAD_END
}
/*

View File

@@ -112,12 +112,11 @@ sgen_thread_handshake (BOOL suspend)
{
SgenThreadInfo *cur_thread = mono_thread_info_current ();
kern_return_t ret;
SgenThreadInfo *info;
int count = 0;
cur_thread->client_info.suspend_done = TRUE;
FOREACH_THREAD_SAFE (info) {
FOREACH_THREAD (info) {
if (info == cur_thread || sgen_thread_pool_is_thread_pool_thread (mono_thread_info_get_tid (info)))
continue;
@@ -134,7 +133,7 @@ sgen_thread_handshake (BOOL suspend)
continue;
}
count ++;
} END_FOREACH_THREAD_SAFE
} FOREACH_THREAD_END
return count;
}

View File

@@ -197,14 +197,13 @@ int
sgen_thread_handshake (BOOL suspend)
{
int count, result;
SgenThreadInfo *info;
int signum = suspend ? suspend_signal_num : restart_signal_num;
MonoNativeThreadId me = mono_native_thread_id_get ();
count = 0;
mono_thread_info_current ()->client_info.suspend_done = TRUE;
FOREACH_THREAD_SAFE (info) {
FOREACH_THREAD (info) {
if (mono_native_thread_id_equals (mono_thread_info_get_tid (info), me)) {
continue;
}
@@ -219,7 +218,7 @@ sgen_thread_handshake (BOOL suspend)
} else {
info->client_info.skip = 1;
}
} END_FOREACH_THREAD_SAFE
} FOREACH_THREAD_END
sgen_wait_for_suspend_ack (count);

View File

@@ -123,12 +123,11 @@ sgen_wait_for_suspend_ack (int count)
int
sgen_thread_handshake (BOOL suspend)
{
SgenThreadInfo *info;
SgenThreadInfo *current = mono_thread_info_current ();
int count = 0;
current->client_info.suspend_done = TRUE;
FOREACH_THREAD_SAFE (info) {
FOREACH_THREAD (info) {
if (info == current)
continue;
info->client_info.suspend_done = FALSE;
@@ -142,7 +141,7 @@ sgen_thread_handshake (BOOL suspend)
continue;
}
++count;
} END_FOREACH_THREAD_SAFE
} FOREACH_THREAD_END
return count;
}

View File

@@ -113,7 +113,6 @@ is_ip_in_managed_allocator (MonoDomain *domain, gpointer ip)
static int
restart_threads_until_none_in_managed_allocator (void)
{
SgenThreadInfo *info;
int num_threads_died = 0;
int sleep_duration = -1;
@@ -121,7 +120,7 @@ restart_threads_until_none_in_managed_allocator (void)
int restart_count = 0, restarted_count = 0;
/* restart all threads that stopped in the
allocator */
FOREACH_THREAD_SAFE (info) {
FOREACH_THREAD (info) {
gboolean result;
if (info->client_info.skip || info->client_info.gc_disabled || info->client_info.suspend_done)
continue;
@@ -146,7 +145,7 @@ restart_threads_until_none_in_managed_allocator (void)
info->client_info.stopped_domain = NULL;
info->client_info.suspend_done = TRUE;
}
} END_FOREACH_THREAD_SAFE
} FOREACH_THREAD_END
/* if no threads were restarted, we're done */
if (restart_count == 0)
break;
@@ -174,7 +173,7 @@ restart_threads_until_none_in_managed_allocator (void)
} else {
info->client_info.skip = 1;
}
} END_FOREACH_THREAD
} FOREACH_THREAD_END
/* some threads might have died */
num_threads_died += restart_count - restarted_count;
/* wait for the threads to signal their suspension
@@ -251,7 +250,6 @@ sgen_client_stop_world (int generation)
void
sgen_client_restart_world (int generation, GGTimingInfo *timing)
{
SgenThreadInfo *info;
TV_DECLARE (end_sw);
TV_DECLARE (start_handshake);
TV_DECLARE (end_bridge);
@@ -269,7 +267,7 @@ sgen_client_restart_world (int generation, GGTimingInfo *timing)
#else
memset (&info->client_info.regs, 0, sizeof (info->client_info.regs));
#endif
} END_FOREACH_THREAD
} FOREACH_THREAD_END
TV_GETTIME (start_handshake);
@@ -387,13 +385,12 @@ static void
sgen_unified_suspend_stop_world (void)
{
int restart_counter;
SgenThreadInfo *info;
int sleep_duration = -1;
mono_threads_begin_global_suspend ();
THREADS_STW_DEBUG ("[GC-STW-BEGIN] *** BEGIN SUSPEND *** \n");
FOREACH_THREAD_SAFE (info) {
FOREACH_THREAD (info) {
info->client_info.skip = FALSE;
info->client_info.suspend_done = FALSE;
if (sgen_is_thread_in_current_stw (info)) {
@@ -402,14 +399,14 @@ sgen_unified_suspend_stop_world (void)
} else {
THREADS_STW_DEBUG ("[GC-STW-BEGIN-SUSPEND] IGNORE thread %p skip %d\n", mono_thread_info_get_tid (info), info->client_info.skip);
}
} END_FOREACH_THREAD_SAFE
} FOREACH_THREAD_END
mono_thread_info_current ()->client_info.suspend_done = TRUE;
mono_threads_wait_pending_operations ();
for (;;) {
restart_counter = 0;
FOREACH_THREAD_SAFE (info) {
FOREACH_THREAD (info) {
if (info->client_info.suspend_done || !sgen_is_thread_in_current_stw (info)) {
THREADS_STW_DEBUG ("[GC-STW-RESTART] IGNORE thread %p not been processed done %d current %d\n", mono_thread_info_get_tid (info), info->client_info.suspend_done, !sgen_is_thread_in_current_stw (info));
continue;
@@ -438,7 +435,7 @@ sgen_unified_suspend_stop_world (void)
g_assert (!info->client_info.in_critical_region);
info->client_info.suspend_done = TRUE;
}
} END_FOREACH_THREAD_SAFE
} FOREACH_THREAD_END
if (restart_counter == 0)
break;
@@ -456,19 +453,19 @@ sgen_unified_suspend_stop_world (void)
sleep_duration += 10;
}
FOREACH_THREAD_SAFE (info) {
FOREACH_THREAD (info) {
if (sgen_is_thread_in_current_stw (info) && mono_thread_info_is_running (info)) {
gboolean res = mono_thread_info_begin_suspend (info, FALSE);
THREADS_STW_DEBUG ("[GC-STW-RESTART] SUSPEND thread %p skip %d\n", mono_thread_info_get_tid (info), res);
if (!res)
info->client_info.skip = TRUE;
}
} END_FOREACH_THREAD_SAFE
} FOREACH_THREAD_END
mono_threads_wait_pending_operations ();
}
FOREACH_THREAD_SAFE (info) {
FOREACH_THREAD (info) {
if (sgen_is_thread_in_current_stw (info)) {
THREADS_STW_DEBUG ("[GC-STW-SUSPEND-END] thread %p is suspended\n", mono_thread_info_get_tid (info));
g_assert (info->client_info.suspend_done);
@@ -476,23 +473,21 @@ sgen_unified_suspend_stop_world (void)
} else {
g_assert (!info->client_info.suspend_done || info == mono_thread_info_current ());
}
} END_FOREACH_THREAD_SAFE
} FOREACH_THREAD_END
}
static void
sgen_unified_suspend_restart_world (void)
{
SgenThreadInfo *info;
THREADS_STW_DEBUG ("[GC-STW-END] *** BEGIN RESUME ***\n");
FOREACH_THREAD_SAFE (info) {
FOREACH_THREAD (info) {
if (sgen_is_thread_in_current_stw (info)) {
g_assert (mono_thread_info_begin_resume (info));
THREADS_STW_DEBUG ("[GC-STW-RESUME-WORLD] RESUME thread %p\n", mono_thread_info_get_tid (info));
} else {
THREADS_STW_DEBUG ("[GC-STW-RESUME-WORLD] IGNORE thread %p\n", mono_thread_info_get_tid (info));
}
} END_FOREACH_THREAD_SAFE
} FOREACH_THREAD_END
mono_threads_wait_pending_operations ();
mono_threads_end_global_suspend ();

View File

@@ -801,7 +801,7 @@ EXTRA_DIST = TestDriver.cs \
Makefile.am.in
version.h: Makefile
echo "#define FULL_VERSION \"Stable 4.3.2.467/ba2e5e4\"" > version.h
echo "#define FULL_VERSION \"Stable 4.4.0.40/f8474c4\"" > version.h
# Utility target for patching libtool to speed up linking
patch-libtool:

View File

@@ -801,7 +801,7 @@ EXTRA_DIST = TestDriver.cs \
Makefile.am.in
version.h: Makefile
echo "#define FULL_VERSION \"Stable 4.3.2.467/ba2e5e4\"" > version.h
echo "#define FULL_VERSION \"Stable 4.4.0.40/f8474c4\"" > version.h
# Utility target for patching libtool to speed up linking
patch-libtool:

View File

@@ -1 +1 @@
26c259ab73e00ef686162f329e573254e8a1a8be
feaddf3ea0bb6cd34b061a30d89031f0d11d66ec

View File

@@ -1 +1 @@
91cb5ce5004d809c09f9c0d8a526f78070c03c8d
26979427a0ebbb4e979939dad6a0e766cc2b6917

View File

@@ -1 +1 @@
13f9263e7cb11b6262697f85d44bc8d01a9ccd07
26d4d91456e706536c43cb083afe6adde5d651e0

View File

@@ -262,7 +262,7 @@ mono_arch_get_call_filter (MonoTrampInfo **info, gboolean aot)
continue;
#endif
if (AMD64_IS_CALLEE_SAVED_REG (i) && i != AMD64_RBP)
amd64_mov_reg_membase (code, AMD64_RBX, AMD64_ARG_REG1, gregs_offset + (i * 8), 8);
amd64_mov_reg_membase (code, i, AMD64_ARG_REG1, gregs_offset + (i * 8), 8);
}
/* load exc register */
amd64_mov_reg_membase (code, AMD64_RAX, AMD64_ARG_REG1, gregs_offset + (AMD64_RAX * 8), 8);

View File

@@ -12,6 +12,13 @@
#include "config.h"
#include <llvm-c/Core.h>
#include <llvm-c/ExecutionEngine.h>
#include "mini-llvm-cpp.h"
#if !defined(MONO_CROSS_COMPILE) && LLVM_API_VERSION < 100
#include <stdint.h>
#include <llvm/Support/raw_ostream.h>
@@ -36,13 +43,6 @@
#include <llvm/IR/IRBuilder.h>
#include <llvm/IR/Module.h>
#include <llvm-c/Core.h>
#include <llvm-c/ExecutionEngine.h>
#include "mini-llvm-cpp.h"
#ifndef MONO_CROSS_COMPILE
using namespace llvm;
static void (*unhandled_exception)() = default_mono_llvm_unhandled_exception;

View File

@@ -1 +1 @@
915dc58fe04dbc4ab7dd14806c61b46212a195f9
c4647d8650c5892dc0c3989cb5d74e993161ffcc

View File

@@ -326,7 +326,6 @@ per_thread_profiler_hit (void *ctx)
MONO_SIG_HANDLER_FUNC (static, sigprof_signal_handler)
{
MonoThreadInfo *info;
int old_errno = errno;
int hp_save_index;
MONO_SIG_HANDLER_GET_CONTEXT;
@@ -348,7 +347,7 @@ MONO_SIG_HANDLER_FUNC (static, sigprof_signal_handler)
mono_threads_add_async_job (info, MONO_SERVICE_REQUEST_SAMPLE);
mono_threads_pthread_kill (info, profiling_signal_in_use);
} END_FOREACH_THREAD_SAFE;
} FOREACH_THREAD_SAFE_END
}
mono_thread_info_set_is_async_context (TRUE);

View File

@@ -1 +1 @@
#define FULL_VERSION "Stable 4.3.2.467/ba2e5e4"
#define FULL_VERSION "Stable 4.4.0.40/f8474c4"

Some files were not shown because too many files have changed in this diff Show More