diff options
27 files changed, 378 insertions, 83 deletions
diff --git a/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/BuildItem.cs b/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/BuildItem.cs index f663120bf79..82af83b1523 100644 --- a/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/BuildItem.cs +++ b/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/BuildItem.cs @@ -227,6 +227,14 @@ namespace Microsoft.Build.BuildEngine { string metadataValue, bool treatMetadataValueAsLiteral) { + SetMetadata (metadataName, metadataValue, treatMetadataValueAsLiteral, false); + } + + void SetMetadata (string metadataName, + string metadataValue, + bool treatMetadataValueAsLiteral, + bool fromDynamicItem) + { if (metadataName == null) throw new ArgumentNullException ("metadataName"); @@ -251,9 +259,11 @@ namespace Microsoft.Build.BuildEngine { } else if (HasParentItem) { if (parent_item.child_items.Count > 1) SplitParentItem (); - parent_item.SetMetadata (metadataName, metadataValue, treatMetadataValueAsLiteral); + parent_item.SetMetadata (metadataName, metadataValue, treatMetadataValueAsLiteral, fromDynamicItem); } - if (FromXml || HasParentItem) { + + // We don't want to reevalute the project for dynamic items + if (!fromDynamicItem && !IsDynamic && (FromXml || HasParentItem)) { parent_item_group.ParentProject.MarkProjectAsDirty (); parent_item_group.ParentProject.NeedToReevaluate (); } @@ -374,7 +384,7 @@ namespace Microsoft.Build.BuildEngine { continue; foreach (string name in evaluatedMetadata.Keys) { - item.SetMetadata (name, (string)evaluatedMetadata [name]); + item.SetMetadata (name, (string)evaluatedMetadata [name], false, IsDynamic); } AddAndRemoveMetadata (project, item); diff --git a/mcs/class/Microsoft.Build.Engine/Test/Microsoft.Build.BuildEngine/TargetTest.cs b/mcs/class/Microsoft.Build.Engine/Test/Microsoft.Build.BuildEngine/TargetTest.cs index 6c7919e6ae7..c709615d250 100644 --- a/mcs/class/Microsoft.Build.Engine/Test/Microsoft.Build.BuildEngine/TargetTest.cs +++ b/mcs/class/Microsoft.Build.Engine/Test/Microsoft.Build.BuildEngine/TargetTest.cs @@ -698,6 +698,33 @@ namespace MonoTests.Microsoft.Build.BuildEngine { } [Test] + public void ItemGroupInsideTarget_UpdateMetadata () + { + ItemGroupInsideTarget ( + @"<Project ToolsVersion=""4.0"" xmlns=""http://schemas.microsoft.com/developer/msbuild/2003""> + <ItemGroup> + <ProjectReference Include='xyz'/> + </ItemGroup> + + <Target Name='Main' DependsOnTargets='CreateBar'> + <Message Text='Before: $(Bar)'/> + <ItemGroup> + <ProjectReference> + <AdditionalProperties>A=b</AdditionalProperties> + </ProjectReference> + </ItemGroup> + <Message Text='After: $(Bar)'/> + </Target> + + <Target Name='CreateBar'> + <PropertyGroup> + <Bar>Bar01</Bar> + </PropertyGroup> + </Target> + </Project>", 2, "Before: Bar01", "After: Bar01"); + } + + [Test] public void ItemGroupInsideTarget_Batching () { ItemGroupInsideTarget ( diff --git a/mcs/class/Mono.Debugger.Soft/Test/dtest-app.cs b/mcs/class/Mono.Debugger.Soft/Test/dtest-app.cs index cc2ab66960f..e4817ee4be5 100644 --- a/mcs/class/Mono.Debugger.Soft/Test/dtest-app.cs +++ b/mcs/class/Mono.Debugger.Soft/Test/dtest-app.cs @@ -430,6 +430,7 @@ public class Tests : TestsBase, ITest2 ss_recursive2 (1); ss_recursive_chaotic (); ss_fp_clobber (); + ss_no_frames (); } [MethodImplAttribute (MethodImplOptions.NoInlining)] @@ -680,6 +681,25 @@ public class Tests : TestsBase, ITest2 } [MethodImplAttribute (MethodImplOptions.NoInlining)] + public static void ss_no_frames () { + Action a = ss_no_frames_2; + var ar = a.BeginInvoke (null, null); + ar.AsyncWaitHandle.WaitOne (); + // Avoid waiting every time this runs + if (static_i == 56) + Thread.Sleep (200); + ss_no_frames_3 (); + } + + [MethodImplAttribute (MethodImplOptions.NoInlining)] + public static void ss_no_frames_2 () { + } + + [MethodImplAttribute (MethodImplOptions.NoInlining)] + public static void ss_no_frames_3 () { + } + + [MethodImplAttribute (MethodImplOptions.NoInlining)] public static bool is_even (int i) { return i % 2 == 0; } diff --git a/mcs/class/Mono.Debugger.Soft/Test/dtest.cs b/mcs/class/Mono.Debugger.Soft/Test/dtest.cs index 1933fc5e827..8f929048d1b 100644 --- a/mcs/class/Mono.Debugger.Soft/Test/dtest.cs +++ b/mcs/class/Mono.Debugger.Soft/Test/dtest.cs @@ -891,6 +891,28 @@ public class DebuggerTests } [Test] + public void SingleSteppingNoFrames () { + // + // Test what happens when starting a single step operation on a thread + // with no managed frames + // + // Run a delegate on a tp thread + var e = run_until ("ss_no_frames_2"); + + var this_type = e.Thread.GetFrames ()[0].Method.DeclaringType; + this_type.SetValue (this_type.GetField ("static_i"), vm.CreateValue (56)); + + var thread = e.Thread; + var e2 = run_until ("ss_no_frames_3"); + // The tp thread should be idle now + step_req = vm.CreateStepRequest (thread); + step_req.Depth = StepDepth.Over; + AssertThrows<Exception> (delegate { + step_req.Enable (); + }); + } + + [Test] public void MethodEntryExit () { run_until ("single_stepping"); diff --git a/mcs/class/System.XML/System.Xml.Serialization/TypeData.cs b/mcs/class/System.XML/System.Xml.Serialization/TypeData.cs index f32bb39e091..55de52a7784 100644 --- a/mcs/class/System.XML/System.Xml.Serialization/TypeData.cs +++ b/mcs/class/System.XML/System.Xml.Serialization/TypeData.cs @@ -135,10 +135,16 @@ namespace System.Xml.Serialization void LookupTypeConvertor () { - // We only need this for System.Xml.Linq. - var convertor = type.GetCustomAttribute<XmlTypeConvertorAttribute> (); - if (convertor != null) - typeConvertor = type.GetMethod (convertor.Method, BindingFlags.Static | BindingFlags.NonPublic); + // We only need this for System.Xml.Linq + var t = type; + // HACK: because interpreter array handling is so bad + if (t.IsArray) + t = t.GetElementType (); + + var convertor = t.GetCustomAttribute<XmlTypeConvertorAttribute> (); + if (convertor != null) { + typeConvertor = t.GetMethod (convertor.Method, BindingFlags.Static | BindingFlags.NonPublic); + } } internal void ConvertForAssignment (ref object value) diff --git a/mcs/class/System.XML/System.Xml.Serialization/XmlSerializationReaderInterpreter.cs b/mcs/class/System.XML/System.Xml.Serialization/XmlSerializationReaderInterpreter.cs index 5d9e4b24f34..d03dea1ff01 100644 --- a/mcs/class/System.XML/System.Xml.Serialization/XmlSerializationReaderInterpreter.cs +++ b/mcs/class/System.XML/System.Xml.Serialization/XmlSerializationReaderInterpreter.cs @@ -737,7 +737,8 @@ namespace System.Xml.Serialization Type type = listType.Type; if (type.IsArray) { - list = EnsureArrayIndex ((Array)list, index, type.GetElementType()); + list = EnsureArrayIndex ((Array)list, index, type.GetElementType ()); + listType.ConvertForAssignment (ref value); ((Array)list).SetValue (value, index); } else // Must be IEnumerable diff --git a/mcs/class/System.Xml.Linq/Test/System.Xml.Linq/XElementTest.cs b/mcs/class/System.Xml.Linq/Test/System.Xml.Linq/XElementTest.cs index 5415ff8e50a..f93bbabc3d8 100644 --- a/mcs/class/System.Xml.Linq/Test/System.Xml.Linq/XElementTest.cs +++ b/mcs/class/System.Xml.Linq/Test/System.Xml.Linq/XElementTest.cs @@ -2099,6 +2099,27 @@ namespace MonoTests.System.Xml.Linq Assert.AreEqual (xe.Content.ToString (), "<Data />", "#3"); } + [XmlType ("Root")] + public class DeserializeXElementArray_Data + { + [XmlAnyElement] + public XElement[] Content; + } + + [Test] + public void DeserializeXElementArray () + { + var xmlString = "<Root><Data /></Root>"; + + var serializer = new XmlSerializer (typeof (DeserializeXElementArray_Data)); + var res = serializer.Deserialize (new StringReader (xmlString)); + + Assert.IsNotNull (res, "#1"); + Assert.AreEqual (typeof (DeserializeXElementArray_Data), res.GetType (), "#2"); + var xe = (DeserializeXElementArray_Data)res; + Assert.AreEqual (xe.Content [0].ToString (), "<Data />", "#3"); + } + [Test] // Bug #20151 public void XElementFromArrayWithNullValuesAsObject () { diff --git a/mcs/class/System/Mono.Btls/MonoBtlsContext.cs b/mcs/class/System/Mono.Btls/MonoBtlsContext.cs index 2df24d9793a..a926124bb56 100644 --- a/mcs/class/System/Mono.Btls/MonoBtlsContext.cs +++ b/mcs/class/System/Mono.Btls/MonoBtlsContext.cs @@ -135,7 +135,7 @@ namespace Mono.Btls if (IsServer) { SetPrivateCertificate (nativeServerCertificate); } else { - ssl.SetServerName (TargetHost); + ssl.SetServerName (ServerName); } } @@ -236,14 +236,7 @@ namespace Mono.Btls if (!IsServer) ctx.SetSelectCallback (SelectCallback); - var host = TargetHost; - if (!string.IsNullOrEmpty (host)) { - var pos = TargetHost.IndexOf (':'); - if (pos > 0) - host = host.Substring (0, pos); - } - - ctx.SetVerifyParam (MonoBtlsProvider.GetVerifyParam (host, IsServer)); + ctx.SetVerifyParam (MonoBtlsProvider.GetVerifyParam (ServerName, IsServer)); TlsProtocolCode minProtocol, maxProtocol; GetProtocolVersions (out minProtocol, out maxProtocol); diff --git a/mcs/class/System/Mono.Net.Security/MobileTlsContext.cs b/mcs/class/System/Mono.Net.Security/MobileTlsContext.cs index f051a5fcbc2..79f0468d461 100644 --- a/mcs/class/System/Mono.Net.Security/MobileTlsContext.cs +++ b/mcs/class/System/Mono.Net.Security/MobileTlsContext.cs @@ -35,6 +35,7 @@ namespace Mono.Net.Security MobileAuthenticatedStream parent; bool serverMode; string targetHost; + string serverName; SslProtocols enabledProtocols; X509Certificate serverCertificate; X509CertificateCollection clientCertificates; @@ -54,6 +55,13 @@ namespace Mono.Net.Security this.clientCertificates = clientCertificates; this.askForClientCert = askForClientCert; + serverName = targetHost; + if (!string.IsNullOrEmpty (serverName)) { + var pos = serverName.IndexOf (':'); + if (pos > 0) + serverName = serverName.Substring (0, pos); + } + certificateValidator = CertificateValidationHelper.GetInternalValidator ( parent.Settings, parent.Provider); } @@ -92,6 +100,10 @@ namespace Mono.Net.Security get { return targetHost; } } + protected string ServerName { + get { return serverName; } + } + protected bool AskForClientCertificate { get { return askForClientCert; } } diff --git a/mcs/class/System/System.Net.Sockets/TcpListener.platformnotsupported.cs b/mcs/class/System/System.Net.Sockets/TcpListener.platformnotsupported.cs index 7b64967345f..76941fc7ce3 100644 --- a/mcs/class/System/System.Net.Sockets/TcpListener.platformnotsupported.cs +++ b/mcs/class/System/System.Net.Sockets/TcpListener.platformnotsupported.cs @@ -78,6 +78,16 @@ namespace System.Net.Sockets throw new PlatformNotSupportedException (EXCEPTION_MESSAGE); } + public void AllowNatTraversal (bool allowed) + { + throw new PlatformNotSupportedException (EXCEPTION_MESSAGE); + } + + public static TcpListener Create (int port) + { + throw new PlatformNotSupportedException (EXCEPTION_MESSAGE); + } + ~TcpListener () { } diff --git a/mcs/class/System/System.Net.Sockets/UdpClient.platformnotsupported.cs b/mcs/class/System/System.Net.Sockets/UdpClient.platformnotsupported.cs index 953350146d2..7a5e2dd740c 100644 --- a/mcs/class/System/System.Net.Sockets/UdpClient.platformnotsupported.cs +++ b/mcs/class/System/System.Net.Sockets/UdpClient.platformnotsupported.cs @@ -204,6 +204,11 @@ namespace System.Net.Sockets set { throw new PlatformNotSupportedException (EXCEPTION_MESSAGE); } } + public void AllowNatTraversal (bool allowed) + { + throw new PlatformNotSupportedException (EXCEPTION_MESSAGE); + } + public void Dispose () { throw new PlatformNotSupportedException (EXCEPTION_MESSAGE); diff --git a/mcs/class/System/System.Net/HttpListener.platformnotsupported.cs b/mcs/class/System/System.Net/HttpListener.platformnotsupported.cs index bffdfbc7011..88ae1d361e3 100644 --- a/mcs/class/System/System.Net/HttpListener.platformnotsupported.cs +++ b/mcs/class/System/System.Net/HttpListener.platformnotsupported.cs @@ -26,6 +26,7 @@ // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // +using System.Security.Authentication.ExtendedProtection; using System.Threading.Tasks; namespace System.Net { @@ -33,6 +34,8 @@ namespace System.Net { { internal const string EXCEPTION_MESSAGE = "System.Net.HttpListener is not supported on the current platform."; + public delegate ExtendedProtectionPolicy ExtendedProtectionSelector (HttpListenerRequest request); + public HttpListener () { throw new PlatformNotSupportedException (EXCEPTION_MESSAGE); @@ -75,6 +78,27 @@ namespace System.Net { set { throw new PlatformNotSupportedException (EXCEPTION_MESSAGE); } } + public HttpListenerTimeoutManager TimeoutManager { + get { throw new PlatformNotSupportedException (EXCEPTION_MESSAGE); } + } + + public ExtendedProtectionPolicy ExtendedProtectionPolicy + { + get { throw new PlatformNotSupportedException (EXCEPTION_MESSAGE); } + set { throw new PlatformNotSupportedException (EXCEPTION_MESSAGE); } + } + + public ExtendedProtectionSelector ExtendedProtectionSelectorDelegate + { + get { throw new PlatformNotSupportedException (EXCEPTION_MESSAGE); } + set { throw new PlatformNotSupportedException (EXCEPTION_MESSAGE); } + } + + public ServiceNameCollection DefaultServiceNames + { + get { throw new PlatformNotSupportedException (EXCEPTION_MESSAGE); } + } + public void Abort () { throw new PlatformNotSupportedException (EXCEPTION_MESSAGE); diff --git a/mcs/class/System/System.Net/HttpListenerContext.platformnotsupported.cs b/mcs/class/System/System.Net/HttpListenerContext.platformnotsupported.cs index 4c729de26c4..275d6d4ad14 100644 --- a/mcs/class/System/System.Net/HttpListenerContext.platformnotsupported.cs +++ b/mcs/class/System/System.Net/HttpListenerContext.platformnotsupported.cs @@ -55,6 +55,11 @@ namespace System.Net { throw new PlatformNotSupportedException (EXCEPTION_MESSAGE); } + public Task<HttpListenerWebSocketContext> AcceptWebSocketAsync (string subProtocol, TimeSpan keepAliveInterval) + { + throw new PlatformNotSupportedException (EXCEPTION_MESSAGE); + } + public Task<HttpListenerWebSocketContext> AcceptWebSocketAsync (string subProtocol, int receiveBufferSize, TimeSpan keepAliveInterval) { throw new PlatformNotSupportedException (EXCEPTION_MESSAGE); diff --git a/mcs/class/System/System.Net/HttpWebRequest.platformnotsupported.cs b/mcs/class/System/System.Net/HttpWebRequest.platformnotsupported.cs index 3977c7bad9c..590c82b0bd2 100644 --- a/mcs/class/System/System.Net/HttpWebRequest.platformnotsupported.cs +++ b/mcs/class/System/System.Net/HttpWebRequest.platformnotsupported.cs @@ -67,12 +67,12 @@ namespace System.Net get { throw new PlatformNotSupportedException (EXCEPTION_MESSAGE); } } - public bool AllowAutoRedirect { + public virtual bool AllowAutoRedirect { get { throw new PlatformNotSupportedException (EXCEPTION_MESSAGE); } set { throw new PlatformNotSupportedException (EXCEPTION_MESSAGE); } } - public bool AllowWriteStreamBuffering { + public virtual bool AllowWriteStreamBuffering { get { throw new PlatformNotSupportedException (EXCEPTION_MESSAGE); } set { throw new PlatformNotSupportedException (EXCEPTION_MESSAGE); } } @@ -360,6 +360,11 @@ namespace System.Net throw new PlatformNotSupportedException (EXCEPTION_MESSAGE); } + public System.IO.Stream GetRequestStream (out TransportContext context) + { + throw new PlatformNotSupportedException (EXCEPTION_MESSAGE); + } + public override IAsyncResult BeginGetResponse (AsyncCallback callback, object state) { throw new PlatformNotSupportedException (EXCEPTION_MESSAGE); diff --git a/mono/btls/Makefile.am b/mono/btls/Makefile.am index fa4a949b5fb..6a5b1061320 100644 --- a/mono/btls/Makefile.am +++ b/mono/btls/Makefile.am @@ -1,7 +1,44 @@ BTLS_STATIC_LIST = build-static/mono-btls-static-lo.txt BTLS_SHARED_LIST = build-shared/mono-btls-shared-lo.txt -BTLS_DEPS = $(BTLS_LIBS) build-shared/Makefile build-static/Makefile +EXTRA_DIST = \ + btls-bio.c \ + btls-bio.h \ + btls-error.c \ + btls-error.h \ + btls-key.c \ + btls-key.h \ + btls-pkcs12.c \ + btls-pkcs12.h \ + btls-ssl.c \ + btls-ssl-ctx.c \ + btls-ssl-ctx.h \ + btls-ssl.h \ + btls-time64.c \ + btls-util.c \ + btls-util.h \ + btls-x509.c \ + btls-x509-chain.c \ + btls-x509-chain.h \ + btls-x509-crl.c \ + btls-x509-crl.h \ + btls-x509.h \ + btls-x509-lookup.c \ + btls-x509-lookup.h \ + btls-x509-lookup-mono.c \ + btls-x509-lookup-mono.h \ + btls-x509-name.c \ + btls-x509-name.h \ + btls-x509-revoked.c \ + btls-x509-revoked.h \ + btls-x509-store.c \ + btls-x509-store-ctx.c \ + btls-x509-store-ctx.h \ + btls-x509-store.h \ + btls-x509-verify-param.c \ + btls-x509-verify-param.h \ + CMakeLists.txt \ + create-object-library.sh CMAKE_VERBOSE=$(if $(V),VERBOSE=1,) diff --git a/mono/btls/btls-time64.c b/mono/btls/btls-time64.c index f01e8c0a2b3..5c67546911b 100644 --- a/mono/btls/btls-time64.c +++ b/mono/btls/btls-time64.c @@ -31,6 +31,7 @@ THE SOFTWARE. #include <assert.h> #include <stdlib.h> #include <stdio.h> +#include <stdint.h> #include <string.h> #include <time.h> #include <errno.h> diff --git a/mono/metadata/object-offsets.h b/mono/metadata/object-offsets.h index e4965a512a7..5c78288ec8b 100644 --- a/mono/metadata/object-offsets.h +++ b/mono/metadata/object-offsets.h @@ -238,6 +238,8 @@ DECL_OFFSET(GSharedVtCallInfo, gsharedvt_in) #endif #if defined(TARGET_ARM64) +DECL_OFFSET (MonoContext, has_fregs) + DECL_OFFSET(GSharedVtCallInfo, stack_usage) DECL_OFFSET(GSharedVtCallInfo, gsharedvt_in) DECL_OFFSET(GSharedVtCallInfo, ret_marshal) diff --git a/mono/metadata/threadpool-ms.c b/mono/metadata/threadpool-ms.c index 3eaa48dc518..666e3739363 100644 --- a/mono/metadata/threadpool-ms.c +++ b/mono/metadata/threadpool-ms.c @@ -423,18 +423,20 @@ domain_remove (ThreadPoolDomain *tpdomain) static ThreadPoolDomain * domain_get (MonoDomain *domain, gboolean create) { - ThreadPoolDomain *tpdomain = NULL; guint i; g_assert (domain); for (i = 0; i < threadpool->domains->len; ++i) { + ThreadPoolDomain *tpdomain; + tpdomain = (ThreadPoolDomain *)g_ptr_array_index (threadpool->domains, i); if (tpdomain->domain == domain) return tpdomain; } if (create) { + ThreadPoolDomain *tpdomain; ThreadPoolDomainCleanupSemaphore *cleanup_semaphore; cleanup_semaphore = g_new0 (ThreadPoolDomainCleanupSemaphore, 1); cleanup_semaphore->ref = 2; @@ -446,9 +448,11 @@ domain_get (MonoDomain *domain, gboolean create) tpdomain = g_new0 (ThreadPoolDomain, 1); tpdomain->domain = domain; domain_add (tpdomain); + + return tpdomain; } - return tpdomain; + return NULL; } static void diff --git a/mono/mini/debugger-agent.c b/mono/mini/debugger-agent.c index 0a708d48229..747cc484fae 100644 --- a/mono/mini/debugger-agent.c +++ b/mono/mini/debugger-agent.c @@ -5398,7 +5398,10 @@ ss_create (MonoInternalThread *thread, StepSize size, StepDepth depth, StepFilte tls = (DebuggerTlsData *)mono_g_hash_table_lookup (thread_to_tls, thread); mono_loader_unlock (); g_assert (tls); - g_assert (tls->context.valid); + if (!tls->context.valid) { + DEBUG_PRINTF (1, "Received a single step request on a thread with no managed frames."); + return ERR_INVALID_ARGUMENT; + } if (tls->restore_state.valid && MONO_CONTEXT_GET_IP (&tls->context.ctx) != MONO_CONTEXT_GET_IP (&tls->restore_state.ctx)) { /* diff --git a/mono/mini/main.c b/mono/mini/main.c index 80044897a83..77f8bc9578c 100644 --- a/mono/mini/main.c +++ b/mono/mini/main.c @@ -151,7 +151,7 @@ bundle_save_library_initialize () bundle_save_library_initialized = 1; char *path = g_build_filename (g_get_tmp_dir (), "mono-bundle-XXXXXX", NULL); bundled_dylibrary_directory = g_mkdtemp (path); - g_free (path); + /* don't free path - mkdtemp modifies it in place, and bundled_dylibrary_directory is an alias of it */ if (bundled_dylibrary_directory == NULL) return; atexit (delete_bundled_libraries); diff --git a/mono/mini/mini-arm64.c b/mono/mini/mini-arm64.c index b7652c94f21..b4871f36b91 100644 --- a/mono/mini/mini-arm64.c +++ b/mono/mini/mini-arm64.c @@ -1789,25 +1789,21 @@ mono_arch_flush_icache (guint8 *code, gint size) * icache/dcache cache line sizes, that can vary between cores on * big.LITTLE architectures. */ guint64 end = (guint64) (code + size); - guint64 addr, ctr_el0; - static size_t icache_line_size = 0xffff, dcache_line_size = 0xffff; - size_t isize, dsize; - - asm volatile ("mrs %0, ctr_el0" : "=r" (ctr_el0)); - isize = 4 << ((ctr_el0 >> 0 ) & 0xf); - dsize = 4 << ((ctr_el0 >> 16) & 0xf); - - /* determine the global minimum cache line size */ - icache_line_size = isize = MIN (icache_line_size, isize); - dcache_line_size = dsize = MIN (dcache_line_size, dsize); - - addr = (guint64) code & ~(guint64) (dsize - 1); - for (; addr < end; addr += dsize) + guint64 addr; + /* always go with cacheline size of 4 bytes as this code isn't perf critical + * anyway. Reading the cache line size from a machine register can be racy + * on a big.LITTLE architecture if the cores don't have the same cache line + * sizes. */ + const size_t icache_line_size = 4; + const size_t dcache_line_size = 4; + + addr = (guint64) code & ~(guint64) (dcache_line_size - 1); + for (; addr < end; addr += dcache_line_size) asm volatile("dc civac, %0" : : "r" (addr) : "memory"); asm volatile("dsb ish" : : : "memory"); - addr = (guint64) code & ~(guint64) (isize - 1); - for (; addr < end; addr += isize) + addr = (guint64) code & ~(guint64) (icache_line_size - 1); + for (; addr < end; addr += icache_line_size) asm volatile("ic ivau, %0" : : "r" (addr) : "memory"); asm volatile ("dsb ish" : : : "memory"); diff --git a/mono/tests/Makefile.am b/mono/tests/Makefile.am index 41e4a9b9a4c..51ceefca2ee 100644 --- a/mono/tests/Makefile.am +++ b/mono/tests/Makefile.am @@ -140,7 +140,8 @@ BASE_TEST_MOBILE_STATIC_NOT_SUPPORTED= \ threadpool-exceptions7.cs # Needs AppDomains \ cross-domain.cs # Needs AppDomains \ generic-unloading.2.cs # Needs AppDomains \ - thread6.cs # On MOBILE, ThreadAbortException doesn't have necessary field for this test + thread6.cs # On MOBILE, ThreadAbortException doesn't have necessary field for this test \ + appdomain-threadpool-unload.cs # Disabled until ?mcs is fixed # bug-331958.cs diff --git a/mono/tests/appdomain-threadpool-unload.cs b/mono/tests/appdomain-threadpool-unload.cs new file mode 100644 index 00000000000..d8a7049af77 --- /dev/null +++ b/mono/tests/appdomain-threadpool-unload.cs @@ -0,0 +1,52 @@ + +using System; +using System.Linq; +using System.Threading; + +class Driver +{ + class ThreadPoolLauncherObject + { + public volatile int i = 0; + + public ThreadPoolLauncherObject () + { + ThreadPool.QueueUserWorkItem (_ => { for (int i = 0; i < 10 * 1000 * 1000; ++i); }, null); + } + } + + public static void Main () + { + int count = 0; + object o = new object (); + + foreach (var i in + Enumerable.Range (0, 100) + .AsParallel ().WithDegreeOfParallelism (Environment.ProcessorCount) + .Select (i => { + AppDomain ad; + + ad = AppDomain.CreateDomain ("testdomain" + i); + ad.CreateInstance (typeof (ThreadPoolLauncherObject).Assembly.FullName, typeof (ThreadPoolLauncherObject).FullName); + + Thread.Sleep (10); + + AppDomain.Unload (ad); + + return i; + }) + .Select (i => { + lock (o) { + count += 1; + + Console.Write ("."); + if (count % 25 == 0) + Console.WriteLine (); + } + + return i; + }) + ) { + } + } +} diff --git a/mono/utils/mono-threads-posix.c b/mono/utils/mono-threads-posix.c index ce2f58ad138..de38adf1373 100644 --- a/mono/utils/mono-threads-posix.c +++ b/mono/utils/mono-threads-posix.c @@ -456,8 +456,13 @@ This begins async resume. This function must do the following: gboolean mono_threads_suspend_begin_async_resume (MonoThreadInfo *info) { - mono_threads_add_to_pending_operation_set (info); - return mono_threads_pthread_kill (info, mono_threads_posix_get_restart_signal ()) == 0; + int sig = mono_threads_posix_get_restart_signal (); + + if (!mono_threads_pthread_kill (info, sig)) { + mono_threads_add_to_pending_operation_set (info); + return TRUE; + } + return FALSE; } void diff --git a/scripts/Makefile.am b/scripts/Makefile.am index 3174ec4c3fa..39595455dad 100644 --- a/scripts/Makefile.am +++ b/scripts/Makefile.am @@ -158,6 +158,7 @@ EXTRA_DIST = \ update_submodules \ mcs.in \ dmcs.in \ + mono-package-runtime \ mono-test-install \ mono-heapviz \ $(MDOC_COMPAT) \ diff --git a/tools/offsets-tool/Makefile b/tools/offsets-tool/Makefile index b4c6b68c223..37909156cee 100644 --- a/tools/offsets-tool/Makefile +++ b/tools/offsets-tool/Makefile @@ -1,7 +1,34 @@ -CPPSHARP_DIR = CppSharp +CPPSHARP_BASE_DIR = CppSharp + +ifeq ($(OS),Windows_NT) + CPPSHARP_OS=windows + ifeq ($(PROCESSOR_ARCHITEW6432),AMD64) + CPPSHARP_ARCH=64 + else + ifeq ($(PROCESSOR_ARCHITECTURE),AMD64) + CPPSHARP_ARCH=64 + endif + ifeq ($(PROCESSOR_ARCHITECTURE),x86) + CPPSHARP_ARCH=32 + endif + endif +else + UNAME_S := $(shell uname -s) + ifeq ($(UNAME_S),Linux) + CPPSHARP_OS=linux + CPPSHARP_ARCH=64 + endif + ifeq ($(UNAME_S),Darwin) + CPPSHARP_OS=osx + CPPSHARP_ARCH=32 + endif +endif + +CPPSHARP_DIR = $(CPPSHARP_BASE_DIR)/$(CPPSHARP_OS)_$(CPPSHARP_ARCH) CPPSHARP_REFS = -r:$(CPPSHARP_DIR)/CppSharp.dll \ -r:$(CPPSHARP_DIR)/CppSharp.AST.dll \ + -r:$(CPPSHARP_DIR)/CppSharp.Parser.dll \ -r:$(CPPSHARP_DIR)/CppSharp.Parser.CSharp.dll \ -r:$(CPPSHARP_DIR)/CppSharp.Generator.dll @@ -10,8 +37,8 @@ SRC_ROOT = ../.. MONO_OPTIONS_SRC = $(SRC_ROOT)/mcs/class/Mono.Options/Mono.Options/Options.cs .stamp-clone: - @if [ ! -d $(CPPSHARP_DIR) ]; then \ - git clone git://github.com/xamarin/CppSharpBinaries.git $(CPPSHARP_DIR) && touch $@; \ + @if [ ! -d $(CPPSHARP_BASE_DIR) ]; then \ + git clone -b 60f763a9 --depth 1 git://github.com/xamarin/CppSharpBinaries.git $(CPPSHARP_BASE_DIR) && touch $@; \ fi MonoAotOffsetsDumper.exe: .stamp-clone MonoAotOffsetsDumper.cs $(MONO_OPTIONS_SRC) diff --git a/tools/offsets-tool/MonoAotOffsetsDumper.cs b/tools/offsets-tool/MonoAotOffsetsDumper.cs index e04a23809a5..0f9a984833d 100644 --- a/tools/offsets-tool/MonoAotOffsetsDumper.cs +++ b/tools/offsets-tool/MonoAotOffsetsDumper.cs @@ -235,7 +235,7 @@ namespace CppSharp if (!driver.ParseCode()) return; - Dump(driver.ASTContext, driver.TargetInfo, target); + Dump(driver.Context.ASTContext, driver.Context.TargetInfo, target); } } @@ -244,13 +244,13 @@ namespace CppSharp foreach (var header in driver.Options.Headers) { var source = driver.Project.AddFile(header); - source.Options = driver.BuildParseOptions(source); + source.Options = driver.BuildParserOptions(source); if (header.Contains ("mini")) continue; - source.Options.addDefines ("HAVE_SGEN_GC"); - source.Options.addDefines ("HAVE_MOVING_COLLECTOR"); + source.Options.AddDefines ("HAVE_SGEN_GC"); + source.Options.AddDefines ("HAVE_MOVING_COLLECTOR"); } } @@ -306,22 +306,24 @@ namespace CppSharp { var options = driver.Options; options.DryRun = true; - options.Verbose = false; options.LibraryName = "Mono"; - options.MicrosoftMode = false; - options.addArguments("-xc"); - options.addArguments("-std=gnu99"); - options.addDefines("CPPSHARP"); + + var parserOptions = driver.ParserOptions; + parserOptions.Verbose = false; + parserOptions.MicrosoftMode = false; + parserOptions.AddArguments("-xc"); + parserOptions.AddArguments("-std=gnu99"); + parserOptions.AddDefines("CPPSHARP"); foreach (var define in target.Defines) - options.addDefines(define); + parserOptions.AddDefines(define); SetupToolchainPaths(driver, target); - SetupMono(options, target); + SetupMono(driver, target); } - static void SetupMono(DriverOptions options, Target target) + static void SetupMono(Driver driver, Target target) { string targetPath; switch (target.Platform) { @@ -356,7 +358,7 @@ namespace CppSharp }; foreach (var inc in includeDirs) - options.addIncludeDirs(inc); + driver.ParserOptions.AddIncludeDirs(inc); var filesToParse = new[] { @@ -365,15 +367,15 @@ namespace CppSharp }; foreach (var file in filesToParse) - options.Headers.Add(file); + driver.Options.Headers.Add(file); } static void SetupMSVC(Driver driver, string triple) { - var options = driver.Options; + var parserOptions = driver.ParserOptions; - options.Abi = Parser.AST.CppAbi.Microsoft; - options.MicrosoftMode = true; + parserOptions.Abi = Parser.AST.CppAbi.Microsoft; + parserOptions.MicrosoftMode = true; var systemIncludeDirs = new[] { @@ -382,9 +384,9 @@ namespace CppSharp }; foreach (var inc in systemIncludeDirs) - options.addSystemIncludeDirs(inc); + parserOptions.AddSystemIncludeDirs(inc); - options.addDefines("HOST_WIN32"); + parserOptions.AddDefines("HOST_WIN32"); } static void SetupToolchainPaths(Driver driver, Target target) @@ -487,7 +489,7 @@ namespace CppSharp static void SetupXcode(Driver driver, Target target) { - var options = driver.Options; + var parserOptions = driver.ParserOptions; var builtinsPath = GetXcodeBuiltinIncludesFolder(); string includePath; @@ -503,12 +505,12 @@ namespace CppSharp throw new ArgumentOutOfRangeException (); } - options.addSystemIncludeDirs(builtinsPath); - options.addSystemIncludeDirs(includePath); + parserOptions.AddSystemIncludeDirs(builtinsPath); + parserOptions.AddSystemIncludeDirs(includePath); - options.NoBuiltinIncludes = true; - options.NoStandardIncludes = true; - options.TargetTriple = target.Triple; + parserOptions.NoBuiltinIncludes = true; + parserOptions.NoStandardIncludes = true; + parserOptions.TargetTriple = target.Triple; } static string GetAndroidHostToolchainPath() @@ -555,9 +557,10 @@ namespace CppSharp static void SetupAndroidNDK(Driver driver, Target target) { var options = driver.Options; + var parserOptions = driver.ParserOptions; var builtinsPath = GetAndroidBuiltinIncludesFolder(); - options.addSystemIncludeDirs(builtinsPath); + parserOptions.AddSystemIncludeDirs(builtinsPath); var androidNdkRoot = GetAndroidNdkPath (); const int androidNdkApiLevel = 21; @@ -565,11 +568,11 @@ namespace CppSharp var toolchainPath = Path.Combine(androidNdkRoot, "platforms", "android-" + androidNdkApiLevel, "arch-" + GetArchFromTriple(target.Triple), "usr", "include"); - options.addSystemIncludeDirs(toolchainPath); + parserOptions.AddSystemIncludeDirs(toolchainPath); - options.NoBuiltinIncludes = true; - options.NoStandardIncludes = true; - options.TargetTriple = target.Triple; + parserOptions.NoBuiltinIncludes = true; + parserOptions.NoStandardIncludes = true; + parserOptions.TargetTriple = target.Triple; } static uint GetTypeAlign(ParserTargetInfo target, ParserIntType type) @@ -638,8 +641,8 @@ namespace CppSharp { var targetFile = target.Triple; - if (!string.IsNullOrEmpty (OutputDir)) - targetFile = Path.Combine (OutputDir, targetFile); + if (!string.IsNullOrEmpty (OutputDir)) + targetFile = Path.Combine (OutputDir, targetFile); targetFile += ".h"; @@ -754,7 +757,7 @@ namespace CppSharp var types = new List<string> { "MonoObject", - "MonoObjectHandlePayload", + "MonoObjectHandlePayload", "MonoClass", "MonoVTable", "MonoDelegate", @@ -803,7 +806,7 @@ namespace CppSharp "SeqPointInfo", "DynCallArgs", "MonoLMFTramp", - }; + }; DumpClasses(writer, ctx, optionalTypes, optional: true); @@ -813,8 +816,8 @@ namespace CppSharp static void DumpStruct(TextWriter writer, Class @class) { var name = @class.Name; - if (name.StartsWith ("_", StringComparison.Ordinal)) - name = name.Substring (1); + if (name.StartsWith ("_", StringComparison.Ordinal)) + name = name.Substring (1); foreach (var field in @class.Fields) { @@ -823,8 +826,10 @@ namespace CppSharp if (name == "SgenThreadInfo" && field.Name == "regs") continue; + var layout = @class.Layout.Fields.First(f => f.FieldPtr == field.OriginalPtr); + writer.WriteLine("DECL_OFFSET2({0},{1},{2})", name, field.Name, - field.Offset / 8); + layout.Offset); } } } |