diff --git a/configurecompiler.cmake b/configurecompiler.cmake index 8fab72d5e715..41cab76978e8 100644 --- a/configurecompiler.cmake +++ b/configurecompiler.cmake @@ -341,8 +341,7 @@ elseif (CLR_CMAKE_PLATFORM_UNIX) # This linker option causes executables we build to be marked as containing # position independent code. # It is necessary to make ASLR work for executables. - set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--build-id=sha1 -Wl,-z,relro,-z,now") - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pie -Wl,-z,relro,-z,now") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pie") endif(WIN32) @@ -359,8 +358,8 @@ endif(CLR_CMAKE_PLATFORM_UNIX) if(CLR_CMAKE_PLATFORM_LINUX) set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -Wa,--noexecstack") - set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--build-id=sha1") - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--build-id=sha1") + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--build-id=sha1 -Wl,-z,relro,-z,now") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--build-id=sha1 -Wl,-z,relro,-z,now") endif(CLR_CMAKE_PLATFORM_LINUX) if(CLR_CMAKE_PLATFORM_FREEBSD) set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -Wa,--noexecstack") diff --git a/src/System.Private.CoreLib/shared/System/Diagnostics/Tracing/CounterGroup.cs b/src/System.Private.CoreLib/shared/System/Diagnostics/Tracing/CounterGroup.cs index bbfba16a7f2c..908a59f1f21b 100644 --- a/src/System.Private.CoreLib/shared/System/Diagnostics/Tracing/CounterGroup.cs +++ b/src/System.Private.CoreLib/shared/System/Diagnostics/Tracing/CounterGroup.cs @@ -240,10 +240,9 @@ private void OnTimer() lock (s_counterGroupLock) { _timeStampSinceCollectionStarted = now; - do - { - _nextPollingTimeStamp += new TimeSpan(0, 0, 0, 0, _pollingIntervalInMilliseconds); - } while (_nextPollingTimeStamp <= now); + TimeSpan delta = now - _nextPollingTimeStamp; + if (delta > TimeSpan.Zero && _pollingIntervalInMilliseconds > 0) + _nextPollingTimeStamp += TimeSpan.FromMilliseconds(_pollingIntervalInMilliseconds * Math.Ceiling(delta.TotalMilliseconds / _pollingIntervalInMilliseconds)); } } } diff --git a/src/corefx/System.Globalization.Native/CMakeLists.txt b/src/corefx/System.Globalization.Native/CMakeLists.txt index ae3fd9982127..038de6de554d 100644 --- a/src/corefx/System.Globalization.Native/CMakeLists.txt +++ b/src/corefx/System.Globalization.Native/CMakeLists.txt @@ -26,13 +26,7 @@ if (NOT CLR_CMAKE_PLATFORM_DARWIN) return() endif() else() - find_library(ICUCORE icucore) - if(ICUI18N STREQUAL ICUCORE-NOTFOUND) - message(FATAL_ERROR "Cannot find libicucore, skipping build for System.Globalization.Native. .NET globalization is not expected to function.") - return() - endif() - - add_definitions(-DOSX_ICU_LIBRARY_PATH=\"/usr/lib/libicucore.dylib\") + add_definitions(-DOSX_ICU_LIBRARY_PATH="/usr/lib/libicucore.dylib") endif() include(configure.cmake) diff --git a/src/corefx/System.Globalization.Native/configure.cmake b/src/corefx/System.Globalization.Native/configure.cmake index 6fd506dbe25a..4086adc5dd93 100644 --- a/src/corefx/System.Globalization.Native/configure.cmake +++ b/src/corefx/System.Globalization.Native/configure.cmake @@ -1,26 +1,27 @@ -include(CheckCSourceCompiles) -include(CheckSymbolExists) +if (CLR_CMAKE_PLATFORM_DARWIN) + set(HAVE_SET_MAX_VARIABLE 1) + set(HAVE_UDAT_STANDALONE_SHORTER_WEEKDAYS 1) +else() + include(CheckCSourceCompiles) + include(CheckSymbolExists) -set(CMAKE_REQUIRED_INCLUDES ${UTYPES_H} ${ICU_HOMEBREW_INC_PATH}) + set(CMAKE_REQUIRED_INCLUDES ${UTYPES_H} ${ICU_HOMEBREW_INC_PATH}) -CHECK_C_SOURCE_COMPILES(" - #include - int main(void) { enum UDateFormatSymbolType e = UDAT_STANDALONE_SHORTER_WEEKDAYS; } -" HAVE_UDAT_STANDALONE_SHORTER_WEEKDAYS) + CHECK_C_SOURCE_COMPILES(" + #include + int main(void) { enum UDateFormatSymbolType e = UDAT_STANDALONE_SHORTER_WEEKDAYS; } + " HAVE_UDAT_STANDALONE_SHORTER_WEEKDAYS) -if(NOT CLR_CMAKE_PLATFORM_DARWIN) set(CMAKE_REQUIRED_LIBRARIES ${ICUUC} ${ICUI18N}) -else() - set(CMAKE_REQUIRED_LIBRARIES ${ICUCORE}) -endif() -check_symbol_exists( - ucol_setMaxVariable - "unicode/ucol.h" - HAVE_SET_MAX_VARIABLE) + check_symbol_exists( + ucol_setMaxVariable + "unicode/ucol.h" + HAVE_SET_MAX_VARIABLE) -unset(CMAKE_REQUIRED_LIBRARIES) -unset(CMAKE_REQUIRED_INCLUDES) + unset(CMAKE_REQUIRED_LIBRARIES) + unset(CMAKE_REQUIRED_INCLUDES) +endif() configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/config.h.in diff --git a/tests/src/tracing/eventcounter/gh53564.cs b/tests/src/tracing/eventcounter/gh53564.cs new file mode 100644 index 000000000000..4b2b5907abbe --- /dev/null +++ b/tests/src/tracing/eventcounter/gh53564.cs @@ -0,0 +1,109 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +#if USE_MDT_EVENTSOURCE +using Microsoft.Diagnostics.Tracing; +#else +using System.Diagnostics.Tracing; +#endif +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using System.Diagnostics; + +namespace gh53564Tests +{ + public class RuntimeCounterListener : EventListener + { + public RuntimeCounterListener(){} + + private DateTime? setToZeroTimestamp = null; + private DateTime? mostRecentTimestamp = null; + private ManualResetEvent setToZero = new ManualResetEvent(initialState: false); + public ManualResetEvent ReadyToVerify { get; } = new ManualResetEvent(initialState: false); + + protected override void OnEventSourceCreated(EventSource source) + { + if (source.Name.Equals("System.Runtime")) + { + Dictionary refreshInterval = new Dictionary(); + + Console.WriteLine($"[{DateTime.UtcNow:hh:mm:ss.fff}] OnEventSourceCreated :: Setting interval to 1"); + // first set interval to 1 seconds + refreshInterval["EventCounterIntervalSec"] = "1"; + EnableEvents(source, EventLevel.Informational, (EventKeywords)(-1), refreshInterval); + + // wait a moment to get some events + Thread.Sleep(TimeSpan.FromSeconds(3)); + + // then set interval to 0 + Console.WriteLine($"[{DateTime.UtcNow:hh:mm:ss.fff}] OnEventSourceCreated :: Setting interval to 0"); + refreshInterval["EventCounterIntervalSec"] = "0"; + EnableEvents(source, EventLevel.Informational, (EventKeywords)(-1), refreshInterval); + setToZeroTimestamp = DateTime.UtcNow + TimeSpan.FromSeconds(1); // Stash timestamp 1 second after setting to 0 + setToZero.Set(); + + // then attempt to set interval back to 1 + Thread.Sleep(TimeSpan.FromSeconds(3)); + Console.WriteLine($"[{DateTime.UtcNow:hh:mm:ss.fff}] OnEventSourceCreated :: Setting interval to 1"); + refreshInterval["EventCounterIntervalSec"] = "1"; + EnableEvents(source, EventLevel.Informational, (EventKeywords)(-1), refreshInterval); + } + } + + protected override void OnEventWritten(EventWrittenEventArgs eventData) + { + if (!ReadyToVerify.WaitOne(0)) + { + mostRecentTimestamp = eventData.TimeStamp; + if (setToZero.WaitOne(0) && mostRecentTimestamp > setToZeroTimestamp) + { + Console.WriteLine($"[{DateTime.UtcNow:hh:mm:ss.fff}] OnEventWritten :: Setting ReadyToVerify"); + ReadyToVerify.Set(); + } + } + } + + public bool Verify() + { + if (!ReadyToVerify.WaitOne(0)) + return false; + + Console.WriteLine($"[{DateTime.UtcNow:hh:mm:ss.fff}] Verify :: Verifying"); + Console.WriteLine($"[{DateTime.UtcNow:hh:mm:ss.fff}] setToZeroTimestamp = {setToZeroTimestamp?.ToString("hh:mm:ss.fff") ?? "NULL"}"); + Console.WriteLine($"[{DateTime.UtcNow:hh:mm:ss.fff}] mostRecentTimestamp = {mostRecentTimestamp?.ToString("hh:mm:ss.fff") ?? "NULL"}"); + + return (setToZeroTimestamp is null || mostRecentTimestamp is null) ? false : setToZeroTimestamp < mostRecentTimestamp; + } + } + + public partial class TestRuntimeEventCounter + { + public static int Main(string[] args) + { + // Create an EventListener. + using (RuntimeCounterListener myListener = new RuntimeCounterListener()) + { + if (myListener.ReadyToVerify.WaitOne(TimeSpan.FromSeconds(30))) + { + if (myListener.Verify()) + { + Console.WriteLine("Test passed"); + return 100; + } + else + { + Console.WriteLine($"Test Failed - did not see one or more of the expected runtime counters."); + return 1; + } + } + else + { + Console.WriteLine("Test Failed - timed out waiting for reset"); + return 1; + } + } + } + } +} diff --git a/tests/src/tracing/eventcounter/gh53564.csproj b/tests/src/tracing/eventcounter/gh53564.csproj new file mode 100644 index 000000000000..ff0986cd788f --- /dev/null +++ b/tests/src/tracing/eventcounter/gh53564.csproj @@ -0,0 +1,31 @@ + + + + + Debug + AnyCPU + 2.0 + {8E3244CB-407F-4142-BAAB-E7A55901A5FA} + Exe + {786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + ..\..\ + BuildAndRun + $(DefineConstants);STATIC + true + 0 + true + + true + + + + + + + + + + + + +