Merge branch 'upstream'
Former-commit-id: e7bc2ce2160572963daa967ada44d8997bf83a6d
This commit is contained in:
commit
f05926f7ec
@ -1 +1 @@
|
|||||||
1895650fb1b5a365ada5bcdf3fef86a448da51d2
|
08afe9df2791baac02e8201b01cce1aca3beb124
|
@ -1 +1 @@
|
|||||||
2317c4f2abf300ae9f452f4dbfd8b9d63c944e1c
|
4fa615ca8fe030cfede44041b86cf5bfc38aceaf
|
@ -1 +1 @@
|
|||||||
530bd396504a300e1f44e8bb369913299172f01f
|
3db9a4bafdb7398647430f25ef9f145d369259ca
|
@ -34,7 +34,7 @@ static class Consts
|
|||||||
// Use these assembly version constants to make code more maintainable.
|
// Use these assembly version constants to make code more maintainable.
|
||||||
//
|
//
|
||||||
|
|
||||||
public const string MonoVersion = "4.2.1.0";
|
public const string MonoVersion = "4.2.2.0";
|
||||||
public const string MonoCompany = "Mono development team";
|
public const string MonoCompany = "Mono development team";
|
||||||
public const string MonoProduct = "Mono Common Language Infrastructure";
|
public const string MonoProduct = "Mono Common Language Infrastructure";
|
||||||
public const string MonoCopyright = "(c) Various Mono authors";
|
public const string MonoCopyright = "(c) Various Mono authors";
|
||||||
|
@ -1263,20 +1263,29 @@ namespace System.Data.SqlClient
|
|||||||
throw new ArgumentNullException ("values");
|
throw new ArgumentNullException ("values");
|
||||||
|
|
||||||
int len = values.Length;
|
int len = values.Length;
|
||||||
int bigDecimalIndex = command.Tds.ColumnValues.BigDecimalIndex;
|
var tds = command.Tds;
|
||||||
|
int columns = Math.Min (len, tds.Columns.Count);
|
||||||
|
|
||||||
|
if ((command.CommandBehavior & CommandBehavior.SequentialAccess) != 0) {
|
||||||
|
for (int i = 0; i < columns; ++i) {
|
||||||
|
values [i] = tds.GetSequentialColumnValue (i);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
int bigDecimalIndex = tds.ColumnValues.BigDecimalIndex;
|
||||||
|
|
||||||
// If a four-byte decimal is stored, then we can't convert to
|
// If a four-byte decimal is stored, then we can't convert to
|
||||||
// a native type. Throw an OverflowException.
|
// a native type. Throw an OverflowException.
|
||||||
if (bigDecimalIndex >= 0 && bigDecimalIndex < len)
|
if (bigDecimalIndex >= 0 && bigDecimalIndex < len)
|
||||||
throw new OverflowException ();
|
throw new OverflowException ();
|
||||||
try {
|
try {
|
||||||
command.Tds.ColumnValues.CopyTo (0, values, 0,
|
tds.ColumnValues.CopyTo (0, values, 0, columns);
|
||||||
len > command.Tds.ColumnValues.Count ? command.Tds.ColumnValues.Count : len);
|
|
||||||
} catch (TdsInternalException ex) {
|
} catch (TdsInternalException ex) {
|
||||||
command.Connection.Close ();
|
command.Connection.Close ();
|
||||||
throw SqlException.FromTdsInternalException ((TdsInternalException)ex);
|
throw SqlException.FromTdsInternalException ((TdsInternalException)ex);
|
||||||
}
|
}
|
||||||
return (len < FieldCount ? len : FieldCount);
|
}
|
||||||
|
|
||||||
|
return columns;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -36,7 +36,10 @@ namespace System
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
var from = Type.GetTypeCode (source);
|
var from = Type.GetTypeCode (source);
|
||||||
switch (Type.GetTypeCode (target)) {
|
var to = Type.GetTypeCode (target);
|
||||||
|
if (from == to && source.IsPrimitive)
|
||||||
|
return true;
|
||||||
|
switch (to) {
|
||||||
case TypeCode.Char:
|
case TypeCode.Char:
|
||||||
switch (from) {
|
switch (from) {
|
||||||
case TypeCode.Byte:
|
case TypeCode.Byte:
|
||||||
|
@ -102,17 +102,7 @@ namespace System
|
|||||||
|
|
||||||
public MethodInfo Method {
|
public MethodInfo Method {
|
||||||
get {
|
get {
|
||||||
if (method_info != null) {
|
return GetMethodImpl ();
|
||||||
return method_info;
|
|
||||||
} else {
|
|
||||||
if (method != IntPtr.Zero) {
|
|
||||||
if (!method_is_virtual)
|
|
||||||
method_info = (MethodInfo)MethodBase.GetMethodFromHandleNoGenericCheck (new RuntimeMethodHandle (method));
|
|
||||||
else
|
|
||||||
method_info = GetVirtualMethod_internal ();
|
|
||||||
}
|
|
||||||
return method_info;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -511,7 +501,17 @@ namespace System
|
|||||||
|
|
||||||
protected virtual MethodInfo GetMethodImpl ()
|
protected virtual MethodInfo GetMethodImpl ()
|
||||||
{
|
{
|
||||||
return Method;
|
if (method_info != null) {
|
||||||
|
return method_info;
|
||||||
|
} else {
|
||||||
|
if (method != IntPtr.Zero) {
|
||||||
|
if (!method_is_virtual)
|
||||||
|
method_info = (MethodInfo)MethodBase.GetMethodFromHandleNoGenericCheck (new RuntimeMethodHandle (method));
|
||||||
|
else
|
||||||
|
method_info = GetVirtualMethod_internal ();
|
||||||
|
}
|
||||||
|
return method_info;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// This is from ISerializable
|
// This is from ISerializable
|
||||||
|
@ -33,6 +33,7 @@
|
|||||||
|
|
||||||
using System.Collections;
|
using System.Collections;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Reflection;
|
||||||
using System.Runtime.Serialization;
|
using System.Runtime.Serialization;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
@ -112,6 +113,14 @@ namespace System
|
|||||||
return base.GetHashCode ();
|
return base.GetHashCode ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected override MethodInfo GetMethodImpl ()
|
||||||
|
{
|
||||||
|
if (delegates != null)
|
||||||
|
return delegates [delegates.Length - 1].Method;
|
||||||
|
|
||||||
|
return base.GetMethodImpl ();
|
||||||
|
}
|
||||||
|
|
||||||
// <summary>
|
// <summary>
|
||||||
// Return, in order of invocation, the invocation list
|
// Return, in order of invocation, the invocation list
|
||||||
// of a MulticastDelegate
|
// of a MulticastDelegate
|
||||||
|
@ -855,6 +855,32 @@ namespace MonoTests.System.Threading
|
|||||||
Assert.AreSame (Thread.GetNamedDataSlot ("te#st"), Thread.GetNamedDataSlot ("te#st"), "#2");
|
Assert.AreSame (Thread.GetNamedDataSlot ("te#st"), Thread.GetNamedDataSlot ("te#st"), "#2");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class DomainClass : MarshalByRefObject {
|
||||||
|
Thread m_thread;
|
||||||
|
bool success;
|
||||||
|
|
||||||
|
public bool Run () {
|
||||||
|
m_thread = new Thread(ThreadProc);
|
||||||
|
m_thread.Start(Thread.CurrentThread);
|
||||||
|
m_thread.Join();
|
||||||
|
return success;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ThreadProc (object arg) {
|
||||||
|
success = m_thread == Thread.CurrentThread;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void CurrentThread_Domains ()
|
||||||
|
{
|
||||||
|
AppDomain ad = AppDomain.CreateDomain ("foo");
|
||||||
|
ad.Load (typeof (DomainClass).Assembly.GetName ());
|
||||||
|
var o = (DomainClass)ad.CreateInstanceAndUnwrap (typeof (DomainClass).Assembly.FullName, typeof (DomainClass).FullName);
|
||||||
|
Assert.IsTrue (o.Run ());
|
||||||
|
AppDomain.Unload (ad);
|
||||||
|
}
|
||||||
|
|
||||||
void CheckIsRunning (string s, Thread t)
|
void CheckIsRunning (string s, Thread t)
|
||||||
{
|
{
|
||||||
int c = counter;
|
int c = counter;
|
||||||
|
@ -1 +1 @@
|
|||||||
9f87bcd74d19a29f1b4e41b2d7171f2c1af2835c
|
bc4d15d32cfe0aba953847153e27ae46f18e35c1
|
@ -1 +1 @@
|
|||||||
06f7fdab7429fe3c9ed22771dfe9380d208f037d
|
b937698af090202f18c31201001eb77a3e464dc5
|
@ -1 +1 @@
|
|||||||
f41bbb4a396f59eec461720dfc065f676523d1c1
|
3fa77ec9258a44fd81c7433c3534093f2984d1cf
|
@ -1 +1 @@
|
|||||||
ff03cd74a2624bd0a4a51658bb41e7d90f3144c9
|
b656909fcd7c7447aa1b8639357c6c089a918a74
|
@ -1 +1 @@
|
|||||||
d8009a94148589526c8dc39f0e1c0ca9e77217e8
|
ec8668e105a38b35bf91110fe79e06e0dca1ead6
|
@ -1 +1 @@
|
|||||||
22fc25a9bdf68807d3d57dc73d711bbd3bc8bc79
|
47b95db8a26f7b940063993c07b77a5ee36746fe
|
@ -1 +1 @@
|
|||||||
f815830cd5626bb85f053420b1d6fcf19e0aeb2a
|
3c2d3fbe2cac6adc7835cf53aa766fffd4381e86
|
13
mcs/tests/test-null-operator-20.cs
Normal file
13
mcs/tests/test-null-operator-20.cs
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
class M
|
||||||
|
{
|
||||||
|
public static void Main ()
|
||||||
|
{
|
||||||
|
string s = null;
|
||||||
|
s?.CompareTo ("xx").CompareTo(s?.EndsWith ("x")).GetHashCode ();
|
||||||
|
|
||||||
|
string s1 = "abcd";
|
||||||
|
string s2 = null;
|
||||||
|
|
||||||
|
var idx = s1.Substring(1)[s2?.GetHashCode () ?? 0].GetHashCode ();
|
||||||
|
}
|
||||||
|
}
|
@ -1 +1 @@
|
|||||||
08b0ee8ce9da391ffa51e1cc3eb0a3611adf5b5e
|
7e6d08d8664395f0f877e388bd40276cefe0c2e9
|
@ -2339,6 +2339,8 @@ sgen_client_scan_thread_data (void *start_nursery, void *end_nursery, gboolean p
|
|||||||
|
|
||||||
FOREACH_THREAD (info) {
|
FOREACH_THREAD (info) {
|
||||||
int skip_reason = 0;
|
int skip_reason = 0;
|
||||||
|
void *aligned_stack_start = (void*)(mword) ALIGN_TO ((mword)info->client_info.stack_start, SIZEOF_VOID_P);
|
||||||
|
|
||||||
if (info->client_info.skip) {
|
if (info->client_info.skip) {
|
||||||
SGEN_LOG (3, "Skipping dead thread %p, range: %p-%p, size: %zd", info, info->client_info.stack_start, info->client_info.stack_end, (char*)info->client_info.stack_end - (char*)info->client_info.stack_start);
|
SGEN_LOG (3, "Skipping dead thread %p, range: %p-%p, size: %zd", info, info->client_info.stack_start, info->client_info.stack_end, (char*)info->client_info.stack_end - (char*)info->client_info.stack_start);
|
||||||
skip_reason = 1;
|
skip_reason = 1;
|
||||||
@ -2358,13 +2360,13 @@ sgen_client_scan_thread_data (void *start_nursery, void *end_nursery, gboolean p
|
|||||||
g_assert (info->client_info.suspend_done);
|
g_assert (info->client_info.suspend_done);
|
||||||
SGEN_LOG (3, "Scanning thread %p, range: %p-%p, size: %zd, pinned=%zd", info, info->client_info.stack_start, info->client_info.stack_end, (char*)info->client_info.stack_end - (char*)info->client_info.stack_start, sgen_get_pinned_count ());
|
SGEN_LOG (3, "Scanning thread %p, range: %p-%p, size: %zd, pinned=%zd", info, info->client_info.stack_start, info->client_info.stack_end, (char*)info->client_info.stack_end - (char*)info->client_info.stack_start, sgen_get_pinned_count ());
|
||||||
if (mono_gc_get_gc_callbacks ()->thread_mark_func && !conservative_stack_mark) {
|
if (mono_gc_get_gc_callbacks ()->thread_mark_func && !conservative_stack_mark) {
|
||||||
mono_gc_get_gc_callbacks ()->thread_mark_func (info->client_info.runtime_data, info->client_info.stack_start, info->client_info.stack_end, precise, &ctx);
|
mono_gc_get_gc_callbacks ()->thread_mark_func (info->client_info.runtime_data, aligned_stack_start, info->client_info.stack_end, precise, &ctx);
|
||||||
} else if (!precise) {
|
} else if (!precise) {
|
||||||
if (!conservative_stack_mark) {
|
if (!conservative_stack_mark) {
|
||||||
fprintf (stderr, "Precise stack mark not supported - disabling.\n");
|
fprintf (stderr, "Precise stack mark not supported - disabling.\n");
|
||||||
conservative_stack_mark = TRUE;
|
conservative_stack_mark = TRUE;
|
||||||
}
|
}
|
||||||
sgen_conservatively_pin_objects_from (info->client_info.stack_start, info->client_info.stack_end, start_nursery, end_nursery, PIN_TYPE_STACK);
|
sgen_conservatively_pin_objects_from (aligned_stack_start, info->client_info.stack_end, start_nursery, end_nursery, PIN_TYPE_STACK);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!precise) {
|
if (!precise) {
|
||||||
|
@ -480,11 +480,13 @@ domain_get_next (ThreadPoolDomain *current)
|
|||||||
return tpdomain;
|
return tpdomain;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
/* return TRUE if timeout, FALSE otherwise (worker unpark or interrupt) */
|
||||||
|
static gboolean
|
||||||
worker_park (void)
|
worker_park (void)
|
||||||
{
|
{
|
||||||
mono_cond_t cond;
|
mono_cond_t cond;
|
||||||
MonoInternalThread *thread = mono_thread_internal_current ();
|
MonoInternalThread *thread = mono_thread_internal_current ();
|
||||||
|
gboolean timeout = FALSE;
|
||||||
|
|
||||||
mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_THREADPOOL, "[%p] current worker parking", GetCurrentThreadId ());
|
mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_THREADPOOL, "[%p] current worker parking", GetCurrentThreadId ());
|
||||||
|
|
||||||
@ -495,10 +497,17 @@ worker_park (void)
|
|||||||
mono_mutex_lock (&threadpool->active_threads_lock);
|
mono_mutex_lock (&threadpool->active_threads_lock);
|
||||||
|
|
||||||
if (!mono_runtime_is_shutting_down ()) {
|
if (!mono_runtime_is_shutting_down ()) {
|
||||||
|
static gpointer rand_handle = NULL;
|
||||||
|
|
||||||
|
if (!rand_handle)
|
||||||
|
rand_handle = rand_create ();
|
||||||
|
g_assert (rand_handle);
|
||||||
|
|
||||||
g_ptr_array_add (threadpool->parked_threads, &cond);
|
g_ptr_array_add (threadpool->parked_threads, &cond);
|
||||||
g_ptr_array_remove_fast (threadpool->working_threads, thread);
|
g_ptr_array_remove_fast (threadpool->working_threads, thread);
|
||||||
|
|
||||||
mono_cond_wait (&cond, &threadpool->active_threads_lock);
|
if (mono_cond_timedwait_ms (&cond, &threadpool->active_threads_lock, rand_next (rand_handle, 5 * 1000, 60 * 1000)) != 0)
|
||||||
|
timeout = TRUE;
|
||||||
|
|
||||||
g_ptr_array_add (threadpool->working_threads, thread);
|
g_ptr_array_add (threadpool->working_threads, thread);
|
||||||
g_ptr_array_remove (threadpool->parked_threads, &cond);
|
g_ptr_array_remove (threadpool->parked_threads, &cond);
|
||||||
@ -511,6 +520,8 @@ worker_park (void)
|
|||||||
mono_cond_destroy (&cond);
|
mono_cond_destroy (&cond);
|
||||||
|
|
||||||
mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_THREADPOOL, "[%p] current worker unparking", GetCurrentThreadId ());
|
mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_THREADPOOL, "[%p] current worker unparking", GetCurrentThreadId ());
|
||||||
|
|
||||||
|
return timeout;
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
@ -585,13 +596,15 @@ worker_thread (gpointer data)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (retire || !(tpdomain = domain_get_next (previous_tpdomain))) {
|
if (retire || !(tpdomain = domain_get_next (previous_tpdomain))) {
|
||||||
|
gboolean timeout;
|
||||||
|
|
||||||
COUNTER_ATOMIC (counter, {
|
COUNTER_ATOMIC (counter, {
|
||||||
counter._.working --;
|
counter._.working --;
|
||||||
counter._.parked ++;
|
counter._.parked ++;
|
||||||
});
|
});
|
||||||
|
|
||||||
mono_mutex_unlock (&threadpool->domains_lock);
|
mono_mutex_unlock (&threadpool->domains_lock);
|
||||||
worker_park ();
|
timeout = worker_park ();
|
||||||
mono_mutex_lock (&threadpool->domains_lock);
|
mono_mutex_lock (&threadpool->domains_lock);
|
||||||
|
|
||||||
COUNTER_ATOMIC (counter, {
|
COUNTER_ATOMIC (counter, {
|
||||||
@ -599,6 +612,9 @@ worker_thread (gpointer data)
|
|||||||
counter._.parked --;
|
counter._.parked --;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if (timeout)
|
||||||
|
break;
|
||||||
|
|
||||||
if (retire)
|
if (retire)
|
||||||
retire = FALSE;
|
retire = FALSE;
|
||||||
|
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user