changeset 51842:3785814bc2b7

branching: merge with stable
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Thu, 12 Sep 2024 02:24:20 +0200
parents 3b8d92f71d92 (current diff) 102770bbf270 (diff)
children fe08a0bfa9fd
files mercurial/profiling.py
diffstat 2 files changed, 35 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/profiling.py	Wed Nov 15 22:11:34 2023 +0100
+++ b/mercurial/profiling.py	Thu Sep 12 02:24:20 2024 +0200
@@ -10,6 +10,7 @@
 import os
 import signal
 import subprocess
+import sys
 
 from .i18n import _
 from .pycompat import (
@@ -57,7 +58,23 @@
             )
         )
     p = lsprof.Profiler()
-    p.enable(subcalls=True)
+    try:
+        p.enable(subcalls=True)
+    except ValueError as exc:
+        if str(exc) != "Another profiling tool is already active":
+            raise
+        if not hasattr(sys, "monitoring"):
+            raise
+        # python >=3.12 prevent more than one profiler to run at the same
+        # time, tries to improve the report to help the user understand
+        # what is going on.
+        other_tool_name = sys.monitoring.get_tool(sys.monitoring.PROFILER_ID)
+        if other_tool_name == "cProfile":
+            msg = 'cannot recursively call `lsprof`'
+            raise error.Abort(msg) from None
+        else:
+            m = 'failed to start "lsprofile"; another profiler already running: %s'
+            raise error.Abort(_(m) % other_tool_name) from None
     try:
         yield
     finally:
--- a/tests/test-profile.t	Wed Nov 15 22:11:34 2023 +0100
+++ b/tests/test-profile.t	Thu Sep 12 02:24:20 2024 +0200
@@ -50,16 +50,30 @@
 
 #endif
 
-#if lsprof serve
+#if serve
 
 Profiling of HTTP requests works
 
-  $ prof --config profiling.format=text --config profiling.output=../profile.log serve -d -p $HGPORT --pid-file ../hg.pid -A ../access.log
+  $ stats_prof () {
+  >   hg --config profiling.type=stat --profile $@
+  > }
+
+  $ stats_prof \
+  >   --config profiling.format=text \
+  >   --config profiling.output=../profile.log \
+  >  serve -d \
+  >    -p $HGPORT \
+  >    --pid-file ../hg.pid \
+  >    -A ../access.log \
+  >    --errorlog ../error.log
   $ cat ../hg.pid >> $DAEMON_PIDS
   $ hg -q clone -U http://localhost:$HGPORT ../clone
+  $ cat ../error.log
 
 A single profile is logged because file logging doesn't append
-  $ grep CallCount ../profile.log | wc -l
+  $ grep 'Sample count:' ../profile.log | wc -l
+  \s*1 (re)
+  $ grep 'Total time:' ../profile.log | wc -l
   \s*1 (re)
 
 #endif