mod-wsgi-standalone 6.0.0.dev3__tar.gz → 6.0.0.dev4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/PKG-INFO +1 -1
  2. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/mod_wsgi_standalone.egg-info/PKG-INFO +1 -1
  3. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/src/express/apache.py +4 -0
  4. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/src/express/options.py +24 -2
  5. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/src/express/scripts.py +21 -0
  6. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/src/express/server.py +52 -1
  7. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/src/server/wsgi_daemon.c +8 -2
  8. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/src/server/wsgi_version.h +1 -1
  9. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/CREDITS.rst +0 -0
  10. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/LICENSE +0 -0
  11. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/MANIFEST.in +0 -0
  12. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/Makefile.in +0 -0
  13. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/README-express.rst +0 -0
  14. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/README-standalone.rst +0 -0
  15. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/README.rst +0 -0
  16. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/configure +0 -0
  17. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/configure.ac +0 -0
  18. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/images/__init__.py +0 -0
  19. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/images/snake-whiskey.jpg +0 -0
  20. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/mod_wsgi_standalone.egg-info/SOURCES.txt +0 -0
  21. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/mod_wsgi_standalone.egg-info/dependency_links.txt +0 -0
  22. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/mod_wsgi_standalone.egg-info/entry_points.txt +0 -0
  23. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/mod_wsgi_standalone.egg-info/not-zip-safe +0 -0
  24. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/mod_wsgi_standalone.egg-info/requires.txt +0 -0
  25. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/mod_wsgi_standalone.egg-info/top_level.txt +0 -0
  26. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/pyproject.toml +0 -0
  27. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/setup.cfg +0 -0
  28. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/setup.py +0 -0
  29. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/src/__init__.py +0 -0
  30. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/src/diagnostics/__init__.py +0 -0
  31. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/src/diagnostics/environ.py +0 -0
  32. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/src/diagnostics/hello.py +0 -0
  33. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/src/express/__init__.py +0 -0
  34. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/src/express/cli.py +0 -0
  35. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/src/express/management/__init__.py +0 -0
  36. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/src/express/management/commands/__init__.py +0 -0
  37. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/src/express/management/commands/runmodwsgi.py +0 -0
  38. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/src/express/platform.py +0 -0
  39. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/src/express/reloader.py +0 -0
  40. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/src/express/runtime.py +0 -0
  41. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/src/server/__init__.py +0 -0
  42. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/src/server/management/__init__.py +0 -0
  43. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/src/server/management/commands/__init__.py +0 -0
  44. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/src/server/management/commands/runmodwsgi.py +0 -0
  45. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/src/server/mod_wsgi.c +0 -0
  46. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/src/server/wsgi_adapter.c +0 -0
  47. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/src/server/wsgi_adapter.h +0 -0
  48. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/src/server/wsgi_apache.c +0 -0
  49. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/src/server/wsgi_apache.h +0 -0
  50. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/src/server/wsgi_auth.c +0 -0
  51. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/src/server/wsgi_auth.h +0 -0
  52. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/src/server/wsgi_buckets.c +0 -0
  53. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/src/server/wsgi_buckets.h +0 -0
  54. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/src/server/wsgi_config.c +0 -0
  55. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/src/server/wsgi_config.h +0 -0
  56. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/src/server/wsgi_convert.c +0 -0
  57. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/src/server/wsgi_convert.h +0 -0
  58. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/src/server/wsgi_daemon.h +0 -0
  59. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/src/server/wsgi_dispatch.c +0 -0
  60. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/src/server/wsgi_dispatch.h +0 -0
  61. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/src/server/wsgi_environ.c +0 -0
  62. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/src/server/wsgi_environ.h +0 -0
  63. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/src/server/wsgi_execute.c +0 -0
  64. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/src/server/wsgi_execute.h +0 -0
  65. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/src/server/wsgi_gc.c +0 -0
  66. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/src/server/wsgi_gc.h +0 -0
  67. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/src/server/wsgi_input.c +0 -0
  68. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/src/server/wsgi_input.h +0 -0
  69. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/src/server/wsgi_interp.c +0 -0
  70. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/src/server/wsgi_interp.h +0 -0
  71. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/src/server/wsgi_logger.c +0 -0
  72. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/src/server/wsgi_logger.h +0 -0
  73. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/src/server/wsgi_memory.c +0 -0
  74. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/src/server/wsgi_memory.h +0 -0
  75. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/src/server/wsgi_metrics.c +0 -0
  76. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/src/server/wsgi_metrics.h +0 -0
  77. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/src/server/wsgi_module.c +0 -0
  78. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/src/server/wsgi_module.h +0 -0
  79. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/src/server/wsgi_python.h +0 -0
  80. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/src/server/wsgi_remote.c +0 -0
  81. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/src/server/wsgi_remote.h +0 -0
  82. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/src/server/wsgi_restrict.c +0 -0
  83. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/src/server/wsgi_restrict.h +0 -0
  84. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/src/server/wsgi_server.c +0 -0
  85. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/src/server/wsgi_server.h +0 -0
  86. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/src/server/wsgi_shutdown.c +0 -0
  87. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/src/server/wsgi_shutdown.h +0 -0
  88. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/src/server/wsgi_signal.c +0 -0
  89. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/src/server/wsgi_signal.h +0 -0
  90. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/src/server/wsgi_stream.c +0 -0
  91. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/src/server/wsgi_stream.h +0 -0
  92. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/src/server/wsgi_telemetry.c +0 -0
  93. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/src/server/wsgi_telemetry.h +0 -0
  94. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/src/server/wsgi_thread.c +0 -0
  95. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/src/server/wsgi_thread.h +0 -0
  96. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/src/server/wsgi_validate.c +0 -0
  97. {mod_wsgi_standalone-6.0.0.dev3 → mod_wsgi_standalone-6.0.0.dev4}/src/server/wsgi_validate.h +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mod_wsgi-standalone
3
- Version: 6.0.0.dev3
3
+ Version: 6.0.0.dev4
4
4
  Summary: Installer for Apache/mod_wsgi.
5
5
  Home-page: https://www.modwsgi.org/
6
6
  Author: Graham Dumpleton
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mod_wsgi-standalone
3
- Version: 6.0.0.dev3
3
+ Version: 6.0.0.dev4
4
4
  Summary: Installer for Apache/mod_wsgi.
5
5
  Home-page: https://www.modwsgi.org/
6
6
  Author: Graham Dumpleton
@@ -317,6 +317,10 @@ WSGISlowRequests %(slow_requests)s
317
317
  WSGISwitchInterval %(switch_interval)s
318
318
  </IfDefine>
319
319
 
320
+ <IfDefine MOD_WSGI_FREE_THREADING>
321
+ WSGIFreeThreading On
322
+ </IfDefine>
323
+
320
324
  <IfDefine MOD_WSGI_TELEMETRY_OPTIONS>
321
325
  %(telemetry_options)s
322
326
  </IfDefine>
@@ -540,10 +540,25 @@ add_option('all', '--telemetry-service', metavar='TARGET',
540
540
  'ingester). Remote "udp:host:port" targets are not supported. '
541
541
  'Off by default.')
542
542
 
543
+ add_option('unix', '--enable-telemetry', action='store_true', default=False,
544
+ help='Bundle a telemetry ingester and web UI alongside the WSGI '
545
+ 'application. Generates a service-script daemon that runs the '
546
+ 'mod_wsgi-telemetry ingester on a UNIX socket inside the server '
547
+ 'root and emits WSGITelemetryService pointing at that socket so '
548
+ 'the WSGI processes report to it. Requires the mod_wsgi-telemetry '
549
+ 'package to be installed. Mutually exclusive with '
550
+ '--telemetry-service.')
551
+
552
+ add_option('unix', '--telemetry-ui-port', type='int', default=8888,
553
+ metavar='NUMBER', help='HTTP port the telemetry web UI binds to '
554
+ 'on 127.0.0.1 when --enable-telemetry is set. Defaults to '
555
+ '%default. Two express instances on the same host need distinct '
556
+ 'ports to avoid a bind collision.')
557
+
543
558
  add_option('all', '--telemetry-interval', type='float', default=1.0,
544
559
  metavar='SECONDS', help='Metrics reporter sampling interval '
545
- 'in seconds. Only applies when --telemetry-service is set. '
546
- 'Defaults to %default.')
560
+ 'in seconds. Only applies when --telemetry-service or '
561
+ '--enable-telemetry is set. Defaults to %default.')
547
562
 
548
563
  add_option('all', '--slow-requests', type='float', default=None,
549
564
  metavar='SECONDS', help='Enable slow-request reporting and set '
@@ -558,6 +573,13 @@ add_option('all', '--switch-interval', type='float', default=None,
558
573
  'switch-interval option on WSGIDaemonProcess. Defaults to '
559
574
  'Python\'s built-in 0.005 (5 ms) when unset.')
560
575
 
576
+ add_option('all', '--free-threading', action='store_true', default=False,
577
+ help='Emit WSGIFreeThreading On in the generated configuration to '
578
+ 'run the Python interpreter without the GIL. Requires a Python '
579
+ 'build with free-threading support (PEP 703, --disable-gil); '
580
+ 'mod_wsgi-express will exit with an error if the running Python '
581
+ 'does not support it.')
582
+
561
583
  add_option('all', '--telemetry-options', action='append', default=[],
562
584
  metavar='ARGS', help='Apache-Options-style metrics-capture '
563
585
  'toggle, passed verbatim to a WSGITelemetryOptions directive in '
@@ -166,6 +166,27 @@ def generate_wsgi_handler_script(options):
166
166
  with open(path, 'w') as fp:
167
167
  print(WSGI_DEFAULT_SCRIPT % options, file=fp)
168
168
 
169
+ TELEMETRY_SERVICE_SCRIPT = '''
170
+ # Auto-generated by mod_wsgi-express --enable-telemetry. Runs the
171
+ # mod_wsgi-telemetry ingester and web UI inside a WSGIDaemonProcess
172
+ # threads=0 service daemon. The WSGI processes report to the UNIX
173
+ # socket below via the WSGITelemetryService directive in httpd.conf.
174
+
175
+ from mod_wsgi.telemetry.server import main
176
+
177
+ main([
178
+ "--listen", "unix:%(telemetry_socket)s",
179
+ "--http-host", "127.0.0.1",
180
+ "--http-port", "%(telemetry_ui_port)s",
181
+ "--log-level", "INFO",
182
+ ])
183
+ '''
184
+
185
+ def generate_telemetry_service_script(options):
186
+ path = os.path.join(options['server_root'], 'telemetry-service.py')
187
+ with open(path, 'w') as fp:
188
+ print(TELEMETRY_SERVICE_SCRIPT % options, file=fp)
189
+
169
190
  WSGI_CONTROL_SCRIPT = """
170
191
  #!%(shell_executable)s
171
192
 
@@ -5,12 +5,16 @@ import math
5
5
  import os
6
6
  import posixpath
7
7
  import sys
8
+ import sysconfig
8
9
  import tempfile
9
10
 
10
11
  from . import apxs_config
11
12
  from .platform import find_program, MOD_WSGI_SO, PYTHON_DYLIB
12
13
  from .apache import generate_apache_config
13
- from .scripts import generate_wsgi_handler_script, generate_control_scripts
14
+ from .scripts import (
15
+ generate_wsgi_handler_script, generate_control_scripts,
16
+ generate_telemetry_service_script,
17
+ )
14
18
 
15
19
  def _mpm_module_defines(modules_directory, preferred=None):
16
20
  if os.name == 'nt':
@@ -367,6 +371,41 @@ def setup_server(command, args, options):
367
371
  else:
368
372
  options['server_metrics_flag'] = 'Off'
369
373
 
374
+ if options['enable_telemetry']:
375
+ if options['telemetry_service']:
376
+ raise ConfigurationError(
377
+ "--enable-telemetry and --telemetry-service are "
378
+ "mutually exclusive: --enable-telemetry generates an "
379
+ "ingester service and points the WSGI processes at "
380
+ "it, so an explicit telemetry target would conflict.")
381
+
382
+ try:
383
+ import mod_wsgi.telemetry.server # noqa: F401
384
+ except ImportError:
385
+ raise ConfigurationError(
386
+ "--enable-telemetry requires the mod_wsgi-telemetry "
387
+ "package: install it with "
388
+ "'pip install mod_wsgi-telemetry'.")
389
+
390
+ for name, _ in options['service_scripts'] or []:
391
+ if name == 'telemetry':
392
+ raise ConfigurationError(
393
+ "--enable-telemetry generates a service named "
394
+ "'telemetry'; rename the conflicting "
395
+ "--service-script entry or drop "
396
+ "--enable-telemetry.")
397
+
398
+ socket_path = posixpath.join(options['server_root'],
399
+ 'telemetry.sock')
400
+ options['telemetry_socket'] = socket_path
401
+ options['telemetry_service'] = 'unix:%s' % socket_path
402
+
403
+ script_path = posixpath.join(options['server_root'],
404
+ 'telemetry-service.py')
405
+ options['service_scripts'] = list(
406
+ options['service_scripts'] or [])
407
+ options['service_scripts'].append(('telemetry', script_path))
408
+
370
409
  if options['telemetry_service']:
371
410
  target = options['telemetry_service']
372
411
  if not target.startswith('unix:'):
@@ -396,6 +435,13 @@ def setup_server(command, args, options):
396
435
  options['switch_interval'] = ''
397
436
  options['daemon_switch_interval_option'] = ''
398
437
 
438
+ if options['free_threading']:
439
+ if not sysconfig.get_config_var('Py_GIL_DISABLED'):
440
+ raise ConfigurationError(
441
+ "--free-threading requires a Python build with "
442
+ "free-threading support (PEP 703). Rebuild Python "
443
+ "with --disable-gil to use it.")
444
+
399
445
  if options['handler_scripts']:
400
446
  handler_scripts = []
401
447
  for extension, script in options['handler_scripts']:
@@ -781,6 +827,8 @@ def setup_server(command, args, options):
781
827
  options['httpd_arguments_list'].append('-DMOD_WSGI_SLOW_REQUESTS')
782
828
  if options['switch_interval'] != '':
783
829
  options['httpd_arguments_list'].append('-DMOD_WSGI_SWITCH_INTERVAL')
830
+ if options['free_threading']:
831
+ options['httpd_arguments_list'].append('-DMOD_WSGI_FREE_THREADING')
784
832
  if options['telemetry_options']:
785
833
  options['httpd_arguments_list'].append('-DMOD_WSGI_TELEMETRY_OPTIONS')
786
834
  options['telemetry_options'] = '\n'.join(
@@ -856,6 +904,9 @@ def setup_server(command, args, options):
856
904
 
857
905
  generate_wsgi_handler_script(options)
858
906
 
907
+ if options['enable_telemetry']:
908
+ generate_telemetry_service_script(options)
909
+
859
910
  print('Server URL :', options['url'])
860
911
 
861
912
  if options['https_url']:
@@ -2991,9 +2991,15 @@ static void wsgi_daemon_main(apr_pool_t *p, WSGIDaemonProcess *daemon)
2991
2991
  }
2992
2992
  }
2993
2993
 
2994
- /* Start telemetry reporter if configured. */
2994
+ /*
2995
+ * Start telemetry reporter if configured. Skip for service-script
2996
+ * daemons (threads=0): they handle no requests, so there is
2997
+ * nothing to accumulate, and an ingester-hosting service script
2998
+ * would otherwise report telemetry datagrams to itself.
2999
+ */
2995
3000
 
2996
- wsgi_telemetry_start_reporter(p);
3001
+ if (daemon->group->threads != 0)
3002
+ wsgi_telemetry_start_reporter(p);
2997
3003
 
2998
3004
  /* Initialise worker stack. */
2999
3005
 
@@ -26,7 +26,7 @@
26
26
  #define MOD_WSGI_MAJORVERSION_NUMBER 6
27
27
  #define MOD_WSGI_MINORVERSION_NUMBER 0
28
28
  #define MOD_WSGI_MICROVERSION_NUMBER 0
29
- #define MOD_WSGI_VERSION_STRING "6.0.0.dev3"
29
+ #define MOD_WSGI_VERSION_STRING "6.0.0.dev4"
30
30
 
31
31
  /* ------------------------------------------------------------------------- */
32
32