Compare commits

..

1 commit

Author SHA1 Message Date
Troy Dawson
27f13253e8 epel8-playground decommissioned : https://pagure.io/epel/issue/136 2022-02-10 08:21:55 -08:00
35 changed files with 1 additions and 4515 deletions

72
.gitignore vendored
View file

@ -1,72 +0,0 @@
*.src.rpm
*.swp
*~
*.log
/results_uwsgi
/uwsgi-1.0.4.tar.gz
/uwsgi-1.2.3.tar.gz
/uwsgi-wiki-doc-v41.txt
/uwsgi-1.2.4.tar.gz
/uwsgi-wiki-doc-v43.txt
/uwsgi-1.2.6.tar.gz
/uwsgi-1.4.5.tar.gz
/uwsgi-1.9.8.tar.gz
/1.9.17.tar.gz
/uwsgi-doc-1.9.17.tar.gz
/uwsgi-1.9.17.tar.gz
/uwsgi-docs-b86b3f7.tar.gz
/uwsgi-1.9.18.2.tar.gz
/uwsgi-docs-71f2d78.tar.gz
/uwsgi-1.9.19.tar.gz
/uwsgi-docs-119b215.tar.gz
/uwsgi-2.0.6.tar.gz
/uwsgi-docs-d2c4969.tar.gz
/uwsgi-2.0.7.tar.gz
/uwsgi-docs-f551708.tar.gz
/uwsgi-2.0.9.tar.gz
/uwsgi-docs-bc49905.tar.gz
/uwsgi-docs-4ac8256.tar.gz
/uwsgi-2.0.11.tar.gz
/uwsgi-docs-c96716d.tar.gz
/uwsgi-docs-85d6b16.tar.gz
/uwsgi-2.0.11.1.tar.gz
/uwsgi-2.0.11.2.tar.gz
/uwsgi-docs-2d5b92a.tar.gz
/uwsgi-docs-5f5f899.tar.gz
/uwsgi-2.0.12.tar.gz
/uwsgi-2.0.13.1.tar.gz
/uwsgi-docs-0326082.tar.gz
/uwsgi-2.0.14.tar.gz
/uwsgi-docs-f6eacc5.tar.gz
/uwsgi-2.0.15.tar.gz
/uwsgi-docs-1610d37.tar.gz
/uwsgi-2.0.16.tar.gz
/uwsgi-docs-eb4ad98.tar.gz
/uwsgi-2.0.17.1.tar.gz
/uwsgi-docs-32a8f73.tar.gz
/uwsgi-2.0.18.tar.gz
/uwsgi-docs-8d868ea.tar.gz
/uwsgi-2.0.20.tar.gz
/uwsgi-docs-9b4ef5f.tar.gz
/uwsgi-2.0.21.tar.gz
/uwsgi-docs-47e1794.tar.gz
/uwsgi-2.0.22.tar.gz
/uwsgi-docs-9c89fef.tar.gz
/uwsgi-2.0.23.tar.gz
/uwsgi-docs-3be14d3.tar.gz
/uwsgi-2.0.24.tar.gz
/uwsgi-docs-4e23afe.tar.gz
/2.0.25.1.tar.gz
/uwsgi-docs-8dcaacd.tar.gz
/2.0.26.tar.gz
/uwsgi-docs-59e6cd1.tar.gz
/2.0.27.tar.gz
/uwsgi-docs-c0f17cd.tar.gz
/2.0.28.tar.gz
/uwsgi-docs-9606cb0.tar.gz
/2.0.29.tar.gz
/uwsgi-docs-b9da5ea.tar.gz
/2.0.30.tar.gz
/uwsgi-docs-f728a25.tar.gz
/uwsgi-docs-5784c30.tar.gz
/2.0.31.tar.gz

View file

@ -1,6 +0,0 @@
The build profile used to build this package is shipped along with the
-devel subpackage and is located in the ``buildconf`` subdirectory in the
src directory.
A copy of the documentation can be obtained by installing the ``uwsgi-docs``
package. The documentation is a copy as of the git SHA:

1
dead.package Normal file
View file

@ -0,0 +1 @@
epel8-playground decommissioned : https://pagure.io/epel/issue/136

View file

@ -1,7 +0,0 @@
[uwsgi]
uid = uwsgi
gid = uwsgi
emperor = /etc/uwsgi.d
chmod-socket = 660
emperor-tyrant = true
cap = setgid,setuid

View file

@ -1,79 +0,0 @@
[uwsgi]
inherit = core
bin_name = uwsgi
xml = libxml2
yaml = libyaml
json = jansson
pcre = auto
routing = auto
ssl = auto
malloc_implementation = libc
embedded_plugins = corerouter, echo, ping
plugins = airbrake,
alarm_curl,
cache,
carbon,
cgi,
cheaper_busyness,
cplusplus,
curl_cron,
dumbloop,
dummy,
emperor_amqp,
fastrouter,
forkptyrouter,
graylog2,
http,
ldap,
logcrypto,
logfile,
logpipe,
logsocket,
lua,
msgpack,
nagios,
notfound,
pam,
pty,
rawrouter,
redislog,
router_basicauth,
router_cache,
router_expires,
router_hash,
router_http,
router_memcached,
router_metrics,
router_radius,
router_redirect,
router_redis,
router_rewrite,
router_spnego,
router_static,
router_uwsgi,
router_xmldir,
rpc,
rrdtool,
rsyslog,
ruby19,
spooler,
sqlite3,
ssi,
sslrouter,
stats_pusher_file,
stats_pusher_socket,
stats_pusher_statsd,
syslog,
systemd_logger,
transformation_chunked,
transformation_gzip,
transformation_offload,
transformation_template,
transformation_tofile,
transformation_toupper,
ugreen,
webdav,
xattr,
xslt,
zabbix,
zergpool

View file

@ -1,2 +0,0 @@
SHA512 (uwsgi-docs-5784c30.tar.gz) = 4f966da4a867e45043a0eb4a123b439c8ab1f7ce6e8b32d770545ff7fae586e4e7dd011106aa6ed0ec82a6c6192937e0fd12ed681443332205566fc329e11cd8
SHA512 (2.0.31.tar.gz) = d4d327f36455438e165298cb5a7d483c951f4acd3d834b46ceeda105bd3664792ead226b02e06db62e92c210544778119bf75a55d9d4f30f8fba896c7de51e6d

View file

@ -1,41 +0,0 @@
diff -uNr a/core/master_utils.c b/core/master_utils.c
--- a/core/master_utils.c 2024-09-23 22:05:33.000000000 +0200
+++ b/core/master_utils.c 2024-10-14 19:57:00.233290804 +0200
@@ -54,12 +54,6 @@
uwsgi_detach_daemons();
- for (i = 1; i <= uwsgi.numproc; i++) {
- if (uwsgi.workers[i].pid > 0) {
- waitpid(uwsgi.workers[i].pid, &waitpid_status, 0);
- }
- }
-
for (i = 0; i < ushared->gateways_cnt; i++) {
if (ushared->gateways[i].pid > 0) {
kill(ushared->gateways[i].pid, SIGKILL);
diff -uNr a/core/uwsgi.c b/core/uwsgi.c
--- a/core/uwsgi.c 2024-09-23 22:05:33.000000000 +0200
+++ b/core/uwsgi.c 2024-10-14 19:57:00.134291181 +0200
@@ -1319,6 +1319,8 @@
// gracefully destroy
void gracefully_kill_them_all(int signum) {
+ int waitpid_status;
+
if (uwsgi_instance_is_dying) return;
uwsgi.status.gracefully_destroying = 1;
@@ -1341,6 +1343,12 @@
}
}
+
+ for (i = 1; i <= uwsgi.numproc; i++) {
+ if (uwsgi.workers[i].pid > 0) {
+ waitpid(uwsgi.workers[i].pid, &waitpid_status, 0);
+ }
+ }
uwsgi_destroy_processes();
}

View file

@ -1,92 +0,0 @@
#!/bin/sh
#
# uwsgi - this script starts and stops the uwsgi emperor
#
# chkconfig: - 85 15
# description: Fast, self-healing, application container server
# processname: uwsgi
# config: /etc/uwsgi.ini
# config: /etc/uwsgi.d
# Source function library.
. /etc/rc.d/init.d/functions
PATH=/sbin:/bin:/usr/sbin:/usr/bin
PROG=/usr/sbin/uwsgi
OWNER=uwsgi
NAME=uwsgi
DESC="Fast, self-healing, application container server"
DAEMON_OPTS="--ini /etc/uwsgi.ini --pidfile /var/run/uwsgi/uwsgi.pid --stats /var/run/uwsgi/stats.sock --daemonize /var/log/uwsgi.log"
[ -f /etc/sysconfig/uwsgi ] && . /etc/sysconfig/uwsgi
lockfile=/var/lock/subsys/uwsgi
start () {
echo -n "Starting $NAME $DESC: "
daemon $PROG $DAEMON_OPTS
retval=$?
echo
[ $retval -eq 0 ] && touch $lockfile
return $retval
}
stop () {
echo -n "Stopping $NAME $DESC: "
# uWSGI docs say INT is a gentler way to stop
killproc $PROG -INT
retval=$?
echo
[ $retval -eq 0 ] && rm -f $lockfile
return $retval
}
reload () {
echo "Reloading $NAME"
killproc $PROG -HUP
RETVAL=$?
echo
}
restart () {
stop
start
}
rh_status () {
status $PROG
}
rh_status_q() {
rh_status >/dev/null 2>&1
}
case "$1" in
start)
rh_status_q && exit 0
$1
;;
stop)
rh_status_q || exit 0
$1
;;
restart)
$1
;;
reload)
rh_status_q || exit 7
$1
;;
status)
rh_status
;;
condrestart|try-restart)
rh_status_q || exit 0
restart
;;
*)
echo "Usage: $0 {start|stop|restart|condrestart|try-restart|reload|status}" >&2
exit 2
;;
esac
exit 0

View file

@ -1,15 +0,0 @@
[Unit]
Description=uWSGI Emperor Service
After=syslog.target
[Service]
EnvironmentFile=-/etc/sysconfig/uwsgi
ExecStart=/usr/sbin/uwsgi --ini /etc/uwsgi.ini --pidfile /run/uwsgi/uwsgi.pid --stats /run/uwsgi/stats.sock
ExecReload=/bin/kill -HUP $MAINPID
KillSignal=SIGINT
Restart=always
Type=notify
NotifyAccess=all
[Install]
WantedBy=multi-user.target

2822
uwsgi.spec

File diff suppressed because it is too large Load diff

View file

@ -1 +0,0 @@
u uwsgi - 'uWSGI daemon user' /run/uwsgi -

View file

@ -1 +0,0 @@
d /run/uwsgi 0775 uwsgi uwsgi

View file

@ -1,14 +0,0 @@
diff -uNr a/core/utils.c b/core/utils.c
--- a/core/utils.c 2021-10-06 07:22:45.000000000 +0200
+++ b/core/utils.c 2022-01-23 12:19:10.715602147 +0100
@@ -593,6 +593,10 @@
uwsgi_error("chroot()");
exit(1);
}
+ if (chdir("/")) {
+ uwsgi_error("chdir()");
+ exit(1);
+ }
uwsgi.is_chrooted = 1;
#ifdef __linux__
if (uwsgi.logging_options.memory_report) {

View file

@ -1,64 +0,0 @@
diff -uNr a/uwsgiconfig.py b/uwsgiconfig.py
--- a/uwsgiconfig.py 2024-02-09 21:30:45.436292711 +0100
+++ b/uwsgiconfig.py 2024-02-09 21:32:29.607595604 +0100
@@ -690,7 +690,27 @@
'-D_LARGEFILE_SOURCE',
'-D_FILE_OFFSET_BITS=64'
]
- if "gcc" in GCC:
+
+ gcc_version = spcall("%s -dumpversion" % GCC)
+ if not gcc_version and GCC.startswith('gcc'):
+ if uwsgi_os == 'Darwin':
+ GCC = 'llvm-' + GCC
+ else:
+ GCC = 'gcc'
+ gcc_version = spcall("%s -dumpversion" % GCC)
+
+ try:
+ gcc_version_components = gcc_version.split('.')
+ gcc_major = int(gcc_version_components[0])
+ if len(gcc_version_components) > 1:
+ gcc_minor = int(gcc_version_components[1])
+ else:
+ # gcc 5.0 is represented as simply "5"
+ gcc_minor = 0
+ except Exception:
+ raise Exception("you need a C compiler to build uWSGI")
+
+ if "gcc" in GCC and gcc_major >= 5:
cflags.append('-Wformat-signedness')
self.cflags = cflags + os.environ.get("CFLAGS", "").split() + self.get('cflags', '').split()
@@ -710,14 +730,6 @@
if uwsgi_os == 'GNU':
self.cflags.append('-D__HURD__')
- gcc_version = spcall("%s -dumpversion" % GCC)
- if not gcc_version and GCC.startswith('gcc'):
- if uwsgi_os == 'Darwin':
- GCC = 'llvm-' + GCC
- else:
- GCC = 'gcc'
- gcc_version = spcall("%s -dumpversion" % GCC)
-
try:
add_it = False
cpp_include_list = str(spcall3("%s -v" % CPP)).split("\n")
@@ -750,16 +762,6 @@
if not mute:
print("detected include path: %s" % self.include_path)
- try:
- gcc_version_components = gcc_version.split('.')
- gcc_major = int(gcc_version_components[0])
- if len(gcc_version_components) > 1:
- gcc_minor = int(gcc_version_components[1])
- else:
- # gcc 5.0 is represented as simply "5"
- gcc_minor = 0
- except:
- raise Exception("you need a C compiler to build uWSGI")
if (sys.version_info[0] == 2) or (gcc_major < 4) or (gcc_major == 4 and gcc_minor < 3):
self.cflags = self.cflags + ['-fno-strict-aliasing']
# add -fno-strict-aliasing only on python2 and gcc < 4.3

View file

@ -1,13 +0,0 @@
diff --git a/plugins/glusterfs/glusterfs.c b/plugins/glusterfs/glusterfs.c
index 83428faf..c0063f4e 100644
--- a/plugins/glusterfs/glusterfs.c
+++ b/plugins/glusterfs/glusterfs.c
@@ -46,7 +46,7 @@ struct uwsgi_glusterfs_async_io {
ssize_t rlen;
};
-static void uwsgi_glusterfs_read_async_cb(glfs_fd_t *fd, ssize_t rlen, void *data) {
+static void uwsgi_glusterfs_read_async_cb(glfs_fd_t *fd, ssize_t rlen, struct glfs_stat *prestat, struct glfs_stat *poststat, void *data) {
struct uwsgi_glusterfs_async_io *aio = (struct uwsgi_glusterfs_async_io *) data;
#ifdef UWSGI_DEBUG
uwsgi_log("[glusterfs-cb] rlen = %d\n", rlen);

View file

@ -1,12 +0,0 @@
diff -uNr a/plugins/jvm/uwsgiplugin.py b/plugins/jvm/uwsgiplugin.py
--- a/plugins/jvm/uwsgiplugin.py 2023-07-28 20:59:42.036749911 +0200
+++ b/plugins/jvm/uwsgiplugin.py 2023-07-28 21:00:11.079400969 +0200
@@ -36,7 +36,7 @@
for jvm in known_jvms:
if os.path.exists(jvm + '/include'):
JVM_INCPATH = ["-I%s/include/" % jvm, "-I%s/include/%s" % (jvm, operating_system)]
- if os.path.exists("%s/jre"):
+ if os.path.exists("%s/jre" % jvm):
JVM_LIBPATH = ["-L%s/jre/lib/%s/server" % (jvm, arch)]
else:
JVM_LIBPATH = ["-L%s/lib/server" % (jvm,)]

View file

@ -1,31 +0,0 @@
diff --git a/plugins/lua/uwsgiplugin.py b/plugins/lua/uwsgiplugin.py
index 8aaa95b..d0e3cd0 100644
--- a/plugins/lua/uwsgiplugin.py
+++ b/plugins/lua/uwsgiplugin.py
@@ -3,7 +3,7 @@ import os,sys
LUAINC = os.environ.get('UWSGICONFIG_LUAINC')
LUALIB = os.environ.get('UWSGICONFIG_LUALIB')
LUALIBPATH = os.environ.get('UWSGICONFIG_LUALIBPATH')
-LUAPC = os.environ.get('UWSGICONFIG_LUAPC', 'lua5.1')
+LUAPC = os.environ.get('UWSGICONFIG_LUAPC', 'lua')
# we LUAINC/LUALIB/LUALIBPATH override the LUAPC for backwards compat
if LUAINC:
@@ -12,7 +12,7 @@ else:
try:
CFLAGS = os.popen('pkg-config --cflags %s' % LUAPC).read().rstrip().split()
except:
- CFLAGS = ['-I/usr/include/lua5.1']
+ CFLAGS = ['-I/usr/include/lua']
if LUALIB:
LIBS = ['-l%s' % LUALIB]
@@ -20,7 +20,7 @@ else:
try:
LIBS = os.popen('pkg-config --libs %s' % LUAPC).read().rstrip().split()
except:
- LIBS = ['-llua5.1']
+ LIBS = ['-llua']
if LUALIBPATH:
LDFLAGS = ['-L%s' % LUALIBPATH]

View file

@ -1,269 +0,0 @@
From 83752e472c35632174534763dffd312fc120a429 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=D0=95=D0=B2=D0=B3=D0=B5=D0=BD=D0=B8=D0=B9=20=D0=9F=D1=80?=
=?UTF-8?q?=D0=BE=D1=82=D0=BE=D0=B7=D0=B0=D0=BD=D0=BE=D0=B2?=
<weirdcarrotmonster@gmail.com>
Date: Fri, 10 Apr 2015 22:56:59 +0400
Subject: [PATCH 1/3] Updated GridFS plugin to work with legacy
mongo-cxx-driver version 1.0.0
---
plugins/gridfs/gridfs.cc | 53 +++++++++++++++++++++++++++++++++----------
plugins/gridfs/uwsgiplugin.py | 7 +++---
2 files changed, 45 insertions(+), 15 deletions(-)
diff --git a/plugins/gridfs/gridfs.cc b/plugins/gridfs/gridfs.cc
index d11451a..81ff0d9 100644
--- a/plugins/gridfs/gridfs.cc
+++ b/plugins/gridfs/gridfs.cc
@@ -1,3 +1,7 @@
+#include <memory>
+#include <vector>
+#include <cstring>
+
#include <uwsgi.h>
#include <client/dbclient.h>
@@ -7,6 +11,7 @@ struct uwsgi_gridfs_mountpoint {
char *mountpoint;
uint16_t mountpoint_len;
char *server;
+ char *replica;
char *db;
char *timeout_str;
int timeout;
@@ -21,6 +26,7 @@ struct uwsgi_gridfs_mountpoint {
uint16_t prefix_len;
char *username;
char *password;
+ std::vector<mongo::HostAndPort> servers;
};
struct uwsgi_gridfs {
@@ -38,33 +44,44 @@ extern struct uwsgi_server uwsgi;
extern struct uwsgi_plugin gridfs_plugin;
static void uwsgi_gridfs_do(struct wsgi_request *wsgi_req, struct uwsgi_gridfs_mountpoint *ugm, char *itemname, int need_free) {
-
try {
- mongo::scoped_ptr<mongo::ScopedDbConnection> conn( mongo::ScopedDbConnection::getScopedDbConnection(ugm->server, ugm->timeout) );
+ std::unique_ptr<mongo::DBClientBase> conn;
+
+ if (ugm->replica) {
+ conn = std::unique_ptr<mongo::DBClientBase> (new mongo::DBClientReplicaSet(ugm->replica, ugm->servers));
+ dynamic_cast<mongo::DBClientReplicaSet *>(conn.get())->connect();
+ }
+ else {
+ conn = std::unique_ptr<mongo::DBClientBase> (new mongo::DBClientConnection());
+ dynamic_cast<mongo::DBClientConnection *>(conn.get())->connect(ugm->server);
+ }
+
try {
if (ugm->username && ugm->password) {
std::string errmsg;
- if ((*conn).conn().auth(ugm->db, ugm->username, ugm->password, errmsg)) {
+ if (!conn->auth(ugm->db, ugm->username, ugm->password, errmsg)) {
uwsgi_log("[uwsgi-gridfs]: %s\n", errmsg.c_str());
- (*conn).done();
uwsgi_403(wsgi_req);
return;
}
}
- mongo::GridFS gridfs((*conn).conn(), ugm->db);
- mongo::GridFile gfile = gridfs.findFile(itemname);
+ mongo::GridFS gridfs((*conn.get()), ugm->db);
+ mongo::GridFile gfile = gridfs.findFileByName(itemname);
+
if (need_free) {
free(itemname);
itemname = NULL;
}
+
if (!gfile.exists()) {
- (*conn).done();
uwsgi_404(wsgi_req);
return;
}
+
uwsgi_response_prepare_headers(wsgi_req, (char *)"200 OK", 6);
// first get the content_type (if possibile)
std::string filename = gfile.getFilename();
+
if (!ugm->no_mime) {
size_t mime_type_len = 0;
char *mime_type = uwsgi_get_mime_type((char *)filename.c_str(), filename.length(), &mime_type_len);
@@ -72,11 +89,13 @@ static void uwsgi_gridfs_do(struct wsgi_request *wsgi_req, struct uwsgi_gridfs_m
uwsgi_response_add_content_type(wsgi_req, mime_type, mime_type_len);
}
}
+
if (ugm->orig_filename) {
char *filename_header = uwsgi_concat3((char *)"inline; filename=\"", (char *)filename.c_str(), (char *)"\"");
uwsgi_response_add_header(wsgi_req, (char *)"Content-Disposition", 19, filename_header, 19 + filename.length());
free(filename_header);
}
+
uwsgi_response_add_content_length(wsgi_req, gfile.getContentLength());
char http_last_modified[49];
@@ -90,7 +109,7 @@ static void uwsgi_gridfs_do(struct wsgi_request *wsgi_req, struct uwsgi_gridfs_m
char *etag = uwsgi_concat3((char *)"\"", (char *)g_md5.c_str(), (char *)"\"");
uwsgi_response_add_header(wsgi_req, (char *)"ETag", 4, etag, 2+g_md5.length());
free(etag);
- }
+ }
}
if (ugm->md5) {
@@ -106,22 +125,20 @@ static void uwsgi_gridfs_do(struct wsgi_request *wsgi_req, struct uwsgi_gridfs_m
int i;
for(i=0;i<nc;i++) {
mongo::GridFSChunk gchunk = gfile.getChunk(i);
- int chunk_len = 0;
+ int chunk_len = 0;
const char *chunk = gchunk.data(chunk_len);
uwsgi_response_write_body_do(wsgi_req, (char *) chunk, chunk_len);
}
}
- (*conn).done();
}
catch ( mongo::DBException &e ) {
uwsgi_log("[uwsgi-gridfs]: %s\n", e.what());
- (*conn).done();
if (need_free && itemname) {
free(itemname);
itemname = NULL;
}
}
- }
+ }
catch ( mongo::DBException &e ) {
uwsgi_log("[uwsgi-gridfs]: %s\n", e.what());
if (need_free && itemname) {
@@ -137,6 +154,7 @@ static struct uwsgi_gridfs_mountpoint *uwsgi_gridfs_add_mountpoint(char *arg, si
if (uwsgi_kvlist_parse(arg, arg_len, ',', '=',
"mountpoint", &ugm->mountpoint,
"server", &ugm->server,
+ "replica", &ugm->replica,
"db", &ugm->db,
"prefix", &ugm->prefix,
"no_mime", &ugm->no_mime,
@@ -185,6 +203,16 @@ static struct uwsgi_gridfs_mountpoint *uwsgi_gridfs_add_mountpoint(char *arg, si
ugm->itemname_len = strlen(ugm->itemname);
}
+ if (ugm->replica) {
+ std::string buffer(ugm->server);
+
+ size_t pos;
+ while ((pos = buffer.find(",")) != std::string::npos) {
+ ugm->servers.push_back(mongo::HostAndPort(buffer.substr(0, pos)));
+ buffer.erase(0, pos + 1);
+ }
+ }
+
return ugm;
}
@@ -236,6 +264,7 @@ extern "C" int uwsgi_gridfs_request(struct wsgi_request *wsgi_req) {
extern "C" void uwsgi_gridfs_mount() {
+ mongo::client::initialize();
if (!uwsgi.skip_atexit) {
uwsgi_log("*** WARNING libmongoclient could have a bug with atexit() hooks, if you get segfault on end/reload, add --skip-atexit ***\n");
}
diff --git a/plugins/gridfs/uwsgiplugin.py b/plugins/gridfs/uwsgiplugin.py
index a2163d7..61567bc 100644
--- a/plugins/gridfs/uwsgiplugin.py
+++ b/plugins/gridfs/uwsgiplugin.py
@@ -1,16 +1,17 @@
import os
-NAME='gridfs'
+NAME = 'gridfs'
-CFLAGS = ['-I/usr/include/mongo','-I/usr/local/include/mongo']
+CFLAGS = ['-I/usr/include/mongo', '-I/usr/local/include/mongo', '-std=c++11', '-Wno-error']
LDFLAGS = []
LIBS = []
-if not 'UWSGI_MONGODB_NOLIB' in os.environ:
+if 'UWSGI_MONGODB_NOLIB' not in os.environ:
LIBS.append('-lmongoclient')
LIBS.append('-lstdc++')
LIBS.append('-lboost_thread')
LIBS.append('-lboost_system')
LIBS.append('-lboost_filesystem')
+ LIBS.append('-lboost_regex')
GCC_LIST = ['plugin', 'gridfs.cc']
--
2.1.0
From 932caed82a2338e0f1bd5d68833ca5c31360b882 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=D0=95=D0=B2=D0=B3=D0=B5=D0=BD=D0=B8=D0=B9=20=D0=9F=D1=80?=
=?UTF-8?q?=D0=BE=D1=82=D0=BE=D0=B7=D0=B0=D0=BD=D0=BE=D0=B2?=
<weirdcarrotmonster@gmail.com>
Date: Fri, 10 Apr 2015 23:07:41 +0400
Subject: [PATCH 2/3] Fixed server list parsing
---
plugins/gridfs/gridfs.cc | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/plugins/gridfs/gridfs.cc b/plugins/gridfs/gridfs.cc
index 81ff0d9..f58d976 100644
--- a/plugins/gridfs/gridfs.cc
+++ b/plugins/gridfs/gridfs.cc
@@ -211,6 +211,10 @@ static struct uwsgi_gridfs_mountpoint *uwsgi_gridfs_add_mountpoint(char *arg, si
ugm->servers.push_back(mongo::HostAndPort(buffer.substr(0, pos)));
buffer.erase(0, pos + 1);
}
+
+ if (!ugm->servers.size()) {
+ ugm->servers.push_back(mongo::HostAndPort(ugm->server));
+ }
}
return ugm;
--
2.1.0
From a870dbfb0dc4268cbcecf573765338ec5a52f195 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=D0=95=D0=B2=D0=B3=D0=B5=D0=BD=D0=B8=D0=B9=20=D0=9F=D1=80?=
=?UTF-8?q?=D0=BE=D1=82=D0=BE=D0=B7=D0=B0=D0=BD=D0=BE=D0=B2?=
<weirdcarrotmonster@gmail.com>
Date: Fri, 10 Apr 2015 23:38:38 +0400
Subject: [PATCH 3/3] Passing timeout argument to MongoDB connection
---
plugins/gridfs/gridfs.cc | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/plugins/gridfs/gridfs.cc b/plugins/gridfs/gridfs.cc
index f58d976..5f7c4ba 100644
--- a/plugins/gridfs/gridfs.cc
+++ b/plugins/gridfs/gridfs.cc
@@ -48,14 +48,14 @@ static void uwsgi_gridfs_do(struct wsgi_request *wsgi_req, struct uwsgi_gridfs_m
std::unique_ptr<mongo::DBClientBase> conn;
if (ugm->replica) {
- conn = std::unique_ptr<mongo::DBClientBase> (new mongo::DBClientReplicaSet(ugm->replica, ugm->servers));
+ conn = std::unique_ptr<mongo::DBClientBase> (new mongo::DBClientReplicaSet(ugm->replica, ugm->servers, ugm->timeout));
dynamic_cast<mongo::DBClientReplicaSet *>(conn.get())->connect();
}
else {
- conn = std::unique_ptr<mongo::DBClientBase> (new mongo::DBClientConnection());
+ conn = std::unique_ptr<mongo::DBClientBase> (new mongo::DBClientConnection(true, 0, ugm->timeout));
dynamic_cast<mongo::DBClientConnection *>(conn.get())->connect(ugm->server);
}
-
+
try {
if (ugm->username && ugm->password) {
std::string errmsg;
--
2.1.0

View file

@ -1,15 +0,0 @@
diff -uNwr a/plugins/mono/uwsgiplugin.py b/plugins/mono/uwsgiplugin.py
--- a/plugins/mono/uwsgiplugin.py 2022-10-24 12:21:58.000000000 +0200
+++ b/plugins/mono/uwsgiplugin.py 2022-10-27 20:47:38.791413699 +0200
@@ -3,9 +3,9 @@
NAME = 'mono'
-CFLAGS = os.popen('pkg-config --cflags mono-2').read().rstrip().split()
+CFLAGS = os.popen('pkg-config --cflags mono-2 glib-2.0').read().rstrip().split()
LDFLAGS = []
-LIBS = os.popen('pkg-config --libs mono-2').read().rstrip().split()
+LIBS = os.popen('pkg-config --libs mono-2 glib-2.0').read().rstrip().split()
GCC_LIST = ['mono_plugin']
if os.uname()[0] == 'Darwin':

View file

@ -1,17 +0,0 @@
diff -uNr a/plugins/php/uwsgiplugin.py b/plugins/php/uwsgiplugin.py
--- a/plugins/php/uwsgiplugin.py 2022-01-22 22:40:33.783038869 +0100
+++ b/plugins/php/uwsgiplugin.py 2022-01-22 22:41:45.261394898 +0100
@@ -20,7 +20,12 @@
if ld_run_path:
LDFLAGS.append('-L%s' % ld_run_path)
-LIBS = [os.popen(PHPPATH + ' --libs').read().rstrip(), '-lphp' + php_version]
+# PHP8 and above does not add the version to the library
+# name
+if int(php_version) < 8:
+ LIBS = [os.popen(PHPPATH + ' --libs').read().rstrip(), '-lphp' + php_version]
+else:
+ LIBS = [os.popen(PHPPATH + ' --libs').read().rstrip(), '-lphp']
phplibdir = os.environ.get('UWSGICONFIG_PHPLIBDIR')
if phplibdir:

View file

@ -1,42 +0,0 @@
From 8ca18da9a01eee19156243c5c0d28d2572698e4a Mon Sep 17 00:00:00 2001
From: Riccardo Magliocchetti <riccardo.magliocchetti@gmail.com>
Date: Sun, 30 Jan 2022 14:31:50 +0100
Subject: [PATCH] plugins/php: handle php8.1 zend_file_handle signature change
filename is now a zend_string.
Refs #2394
---
plugins/php/php_plugin.c | 17 +++++++++++------
1 file changed, 11 insertions(+), 6 deletions(-)
diff --git a/plugins/php/php_plugin.c b/plugins/php/php_plugin.c
index d336adddc..8b5a24156 100644
--- a/plugins/php/php_plugin.c
+++ b/plugins/php/php_plugin.c
@@ -1096,14 +1096,19 @@ int uwsgi_php_request(struct wsgi_request *wsgi_req) {
SG(request_info).path_translated = wsgi_req->file;
- memset(&file_handle, 0, sizeof(zend_file_handle));
- file_handle.type = ZEND_HANDLE_FILENAME;
- file_handle.filename = real_filename;
+#if PHP_VERSION_ID >= 80100
+ zend_string *handle_filename = zend_string_init(real_filename, real_filename_len, 0);
+#else
+ const char *handle_filename = real_filename;
+#endif
+ memset(&file_handle, 0, sizeof(zend_file_handle));
+ file_handle.type = ZEND_HANDLE_FILENAME;
+ file_handle.filename = handle_filename;
- if (php_request_startup() == FAILURE) {
+ if (php_request_startup() == FAILURE) {
uwsgi_500(wsgi_req);
- return -1;
- }
+ return -1;
+ }
struct uwsgi_string_list *usl=NULL;

View file

@ -1,15 +0,0 @@
diff -uNr a/plugins/php/php_plugin.c b/plugins/php/php_plugin.c
--- a/plugins/php/php_plugin.c 2022-10-06 19:52:07.237882916 +0200
+++ b/plugins/php/php_plugin.c 2022-10-06 19:56:29.232418542 +0200
@@ -607,7 +607,11 @@
static int php_uwsgi_startup(sapi_module_struct *sapi_module)
{
+#if PHP_VERSION_ID >= 80200
+ if (php_module_startup(&uwsgi_sapi_module, &uwsgi_module_entry)==FAILURE) {
+#else
if (php_module_startup(&uwsgi_sapi_module, &uwsgi_module_entry, 1)==FAILURE) {
+#endif
return FAILURE;
} else {
return SUCCESS;

View file

@ -1,52 +0,0 @@
From 064984116e86ac0a5d5d3805765395b661fc4455 Mon Sep 17 00:00:00 2001
From: Remi Collet <remi@remirepo.net>
Date: Mon, 4 Sep 2023 13:10:52 +0200
Subject: [PATCH] ini_entries is read-only PHP 8.3
---
plugins/php/php_plugin.c | 18 ++++++++++--------
1 file changed, 10 insertions(+), 8 deletions(-)
diff --git a/plugins/php/php_plugin.c b/plugins/php/php_plugin.c
index b3efa006a..d9b615bac 100644
--- a/plugins/php/php_plugin.c
+++ b/plugins/php/php_plugin.c
@@ -27,6 +27,7 @@ struct uwsgi_php {
char *fallback;
char *fallback2;
char *fallback_qs;
+ char *ini_entries;
size_t ini_size;
int dump_config;
char *server_software;
@@ -232,21 +233,22 @@ static sapi_module_struct uwsgi_sapi_module;
void uwsgi_php_append_config(char *filename) {
size_t file_size = 0;
- char *file_content = uwsgi_open_and_read(filename, &file_size, 1, NULL);
- uwsgi_sapi_module.ini_entries = realloc(uwsgi_sapi_module.ini_entries, uphp.ini_size + file_size);
- memcpy(uwsgi_sapi_module.ini_entries + uphp.ini_size, file_content, file_size);
+ char *file_content = uwsgi_open_and_read(filename, &file_size, 1, NULL);
+ uphp.ini_entries = realloc(uphp.ini_entries, uphp.ini_size + file_size);
+ memcpy(uphp.ini_entries + uphp.ini_size, file_content, file_size);
uphp.ini_size += file_size-1;
free(file_content);
+ uwsgi_sapi_module.ini_entries = uphp.ini_entries;
}
void uwsgi_php_set(char *opt) {
- uwsgi_sapi_module.ini_entries = realloc(uwsgi_sapi_module.ini_entries, uphp.ini_size + strlen(opt)+2);
- memcpy(uwsgi_sapi_module.ini_entries + uphp.ini_size, opt, strlen(opt));
-
+ uphp.ini_entries = realloc(uphp.ini_entries, uphp.ini_size + strlen(opt)+2);
+ memcpy(uphp.ini_entries + uphp.ini_size, opt, strlen(opt));
uphp.ini_size += strlen(opt)+1;
- uwsgi_sapi_module.ini_entries[uphp.ini_size-1] = '\n';
- uwsgi_sapi_module.ini_entries[uphp.ini_size] = 0;
+ uphp.ini_entries[uphp.ini_size-1] = '\n';
+ uphp.ini_entries[uphp.ini_size] = 0;
+ uwsgi_sapi_module.ini_entries = uphp.ini_entries;
}
extern ps_module ps_mod_uwsgi;

View file

@ -1,43 +0,0 @@
diff --git a/plugins/php/php_plugin.c b/plugins/php/php_plugin.c
index 717d6317b..d336adddc 100644
--- a/plugins/php/php_plugin.c
+++ b/plugins/php/php_plugin.c
@@ -497,21 +497,24 @@ PHP_FUNCTION(uwsgi_signal) {
RETURN_NULL();
}
+ZEND_BEGIN_ARG_INFO_EX(arginfo_void, 0, 0, 0)
+ZEND_END_ARG_INFO()
+
zend_function_entry uwsgi_php_functions[] = {
- PHP_FE(uwsgi_version, NULL)
- PHP_FE(uwsgi_setprocname, NULL)
- PHP_FE(uwsgi_worker_id, NULL)
- PHP_FE(uwsgi_masterpid, NULL)
- PHP_FE(uwsgi_signal, NULL)
-
- PHP_FE(uwsgi_rpc, NULL)
-
- PHP_FE(uwsgi_cache_get, NULL)
- PHP_FE(uwsgi_cache_set, NULL)
- PHP_FE(uwsgi_cache_update, NULL)
- PHP_FE(uwsgi_cache_del, NULL)
- PHP_FE(uwsgi_cache_clear, NULL)
- PHP_FE(uwsgi_cache_exists, NULL)
+ PHP_FE(uwsgi_version, arginfo_void)
+ PHP_FE(uwsgi_setprocname, arginfo_void)
+ PHP_FE(uwsgi_worker_id, arginfo_void)
+ PHP_FE(uwsgi_masterpid, arginfo_void)
+ PHP_FE(uwsgi_signal, arginfo_void)
+
+ PHP_FE(uwsgi_rpc, arginfo_void)
+
+ PHP_FE(uwsgi_cache_get, arginfo_void)
+ PHP_FE(uwsgi_cache_set, arginfo_void)
+ PHP_FE(uwsgi_cache_update, arginfo_void)
+ PHP_FE(uwsgi_cache_del, arginfo_void)
+ PHP_FE(uwsgi_cache_clear, arginfo_void)
+ PHP_FE(uwsgi_cache_exists, arginfo_void)
{ NULL, NULL, NULL},
};

View file

@ -1,11 +0,0 @@
diff -uNr a/plugins/python/uwsgi_python.h b/plugins/python/uwsgi_python.h
--- a/plugins/python/uwsgi_python.h 2021-10-06 07:22:45.000000000 +0200
+++ b/plugins/python/uwsgi_python.h 2022-02-19 18:39:10.929895062 +0100
@@ -1,3 +1,7 @@
+// This needs to be defined before Python.h is included
+// to indicate that the code uses Py_ssize_t properly
+#define PY_SSIZE_T_CLEAN
+
#include <uwsgi.h>
#include <Python.h>

View file

@ -1,60 +0,0 @@
diff -uNr a/plugins/jvm/uwsgiplugin.py b/plugins/jvm/uwsgiplugin.py
--- a/plugins/jvm/uwsgiplugin.py 2024-02-08 17:35:28.000000000 +0100
+++ b/plugins/jvm/uwsgiplugin.py 2024-02-08 21:55:26.627134235 +0100
@@ -69,11 +69,6 @@
GCC_LIST = ['jvm_plugin']
-if 'LD_RUN_PATH' in os.environ:
- os.environ['LD_RUN_PATH'] += ':' + JVM_LIBPATH[0][2:]
-else:
- os.environ['LD_RUN_PATH'] = JVM_LIBPATH[0][2:]
-
def post_build(config):
if subprocess.call("javac %s/plugins/jvm/uwsgi.java" % os.getcwd(), shell=True) != 0:
os._exit(1)
diff -uNr a/plugins/php/uwsgiplugin.py b/plugins/php/uwsgiplugin.py
--- a/plugins/php/uwsgiplugin.py 2024-02-08 17:35:28.000000000 +0100
+++ b/plugins/php/uwsgiplugin.py 2024-02-08 21:56:28.630427541 +0100
@@ -19,7 +19,6 @@
if ld_run_path:
LDFLAGS.append('-L%s' % ld_run_path)
- os.environ['LD_RUN_PATH'] = ld_run_path
# PHP8 and above does not add the version to the library
# name
diff -uNr a/plugins/python/uwsgiplugin.py b/plugins/python/uwsgiplugin.py
--- a/plugins/python/uwsgiplugin.py 2024-02-08 17:35:28.000000000 +0100
+++ b/plugins/python/uwsgiplugin.py 2024-02-08 21:55:26.654133927 +0100
@@ -88,9 +88,6 @@
libdir = "%s/lib" % sysconfig.PREFIX
LDFLAGS.append("-L%s" % libdir)
- LDFLAGS.append("-Wl,-rpath,%s" % libdir)
-
- os.environ['LD_RUN_PATH'] = "%s" % libdir
LIBS.append('-lpython%s' % get_python_version())
else:
diff -uNr a/plugins/rack/uwsgiplugin.py b/plugins/rack/uwsgiplugin.py
--- a/plugins/rack/uwsgiplugin.py 2024-02-08 17:35:28.000000000 +0100
+++ b/plugins/rack/uwsgiplugin.py 2024-02-08 21:55:26.655133916 +0100
@@ -48,7 +48,6 @@
if has_shared == 'yes':
LDFLAGS.append('-L' + libpath )
- os.environ['LD_RUN_PATH'] = libpath
LIBS.append(os.popen(RUBYPATH + " -e \"require 'rbconfig';print '-l' + %s::CONFIG['RUBY_SO_NAME']\"" % rbconfig).read().rstrip())
else:
rubylibdir = os.popen(RUBYPATH + " -e \"require 'rbconfig';print RbConfig::CONFIG['rubylibdir']\"").read().rstrip()
diff -uNr a/plugins/ruby19/uwsgiplugin.py b/plugins/ruby19/uwsgiplugin.py
--- a/plugins/ruby19/uwsgiplugin.py 2024-02-08 17:35:28.000000000 +0100
+++ b/plugins/ruby19/uwsgiplugin.py 2024-02-08 21:55:26.655133916 +0100
@@ -42,6 +42,5 @@
libpath = os.popen(RUBYPATH + " -e \"require 'rbconfig';print %s::CONFIG['libdir']\"" % rbconfig).read().rstrip()
LDFLAGS.append('-L' + libpath )
-os.environ['LD_RUN_PATH'] = libpath
LIBS = os.popen(RUBYPATH + " -e \"require 'rbconfig';print '-l' + %s::CONFIG['RUBY_SO_NAME']\"" % rbconfig).read().rstrip().split()

View file

@ -1,15 +0,0 @@
diff -uNr a/plugins/rack/rack_plugin.c b/plugins/rack/rack_plugin.c
--- a/plugins/rack/rack_plugin.c 2022-10-24 12:21:58.000000000 +0200
+++ b/plugins/rack/rack_plugin.c 2023-06-13 21:47:46.514179214 +0200
@@ -456,7 +456,11 @@
static void rack_hack_dollar_zero(VALUE name, ID id) {
ur.dollar_zero = rb_obj_as_string(name);
+ // From ruby 2.7 onwards this is a noop, from ruby 3.2 onwards
+ // this function no longer exists
+#if !defined(RUBY27)
rb_obj_taint(ur.dollar_zero);
+#endif
}
#ifndef RUBY19

View file

@ -1,33 +0,0 @@
diff -uNr a/plugins/pty/pty.c b/plugins/pty/pty.c
--- a/plugins/pty/pty.c 2024-10-26 11:59:26.000000000 +0200
+++ b/plugins/pty/pty.c 2025-01-24 20:04:55.952597269 +0100
@@ -259,7 +259,7 @@
}
-static void uwsgi_pty_winch() {
+static void uwsgi_pty_winch(int signum) {
// 2 uwsgi packets
char uwsgi_pkt[8];
#ifdef TIOCGWINSZ
@@ -309,7 +309,7 @@
if (upty.uremote) {
signal(SIGWINCH, uwsgi_pty_winch);
// send current terminal size
- uwsgi_pty_winch();
+ uwsgi_pty_winch(0);
}
upty.queue = event_queue_init();
diff -uNr a/plugins/tuntap/tuntap.c b/plugins/tuntap/tuntap.c
--- a/plugins/tuntap/tuntap.c 2024-10-26 11:59:26.000000000 +0200
+++ b/plugins/tuntap/tuntap.c 2025-01-24 20:33:49.513449322 +0100
@@ -409,7 +409,7 @@
}
}
-static void uwsgi_tuntap_router() {
+static void uwsgi_tuntap_router(int (*_)(void *), char ** __) {
if (!utt.routers) return;

View file

@ -1,174 +0,0 @@
Add Python 3.11 support
Backport of https://github.com/unbit/uwsgi/pull/2453
Resolves: rhbz#2099185
diff --git a/plugins/python/profiler.c b/plugins/python/profiler.c
index 92bc3da..2a7e1cc 100644
--- a/plugins/python/profiler.c
+++ b/plugins/python/profiler.c
@@ -13,6 +13,14 @@ int PyFrame_GetLineNumber(PyFrameObject *frame) {
}
#endif
+#if PY_VERSION_HEX < 0x030900B1
+PyCodeObject* PyFrame_GetCode(PyFrameObject *frame)
+{
+ Py_INCREF(frame->f_code);
+ return frame->f_code;
+}
+#endif
+
#ifdef PYTHREE
#undef PyString_AsString
static char *PyString_AsString(PyObject *o) {
@@ -27,27 +35,32 @@ int uwsgi_python_profiler_call(PyObject *obj, PyFrameObject *frame, int what, Py
static uint64_t last_ts = 0;
uint64_t now = uwsgi_micros();
uint64_t delta = 0;
+ PyCodeObject *code;
switch(what) {
case PyTrace_CALL:
if (last_ts == 0) delta = 0;
else delta = now - last_ts;
last_ts = now;
+ code = PyFrame_GetCode(frame);
uwsgi_log("[uWSGI Python profiler %llu] CALL: %s (line %d) -> %s %d args, stacksize %d\n",
(unsigned long long) delta,
- PyString_AsString(frame->f_code->co_filename),
+ PyString_AsString(code->co_filename),
PyFrame_GetLineNumber(frame),
- PyString_AsString(frame->f_code->co_name), frame->f_code->co_argcount, frame->f_code->co_stacksize);
+ PyString_AsString(code->co_name), code->co_argcount, code->co_stacksize);
+ Py_DECREF(code);
break;
case PyTrace_C_CALL:
if (last_ts == 0) delta = 0;
else delta = now - last_ts;
last_ts = now;
+ code = PyFrame_GetCode(frame);
uwsgi_log("[uWSGI Python profiler %llu] C CALL: %s (line %d) -> %s %d args, stacksize %d\n",
(unsigned long long) delta,
- PyString_AsString(frame->f_code->co_filename),
+ PyString_AsString(code->co_filename),
PyFrame_GetLineNumber(frame),
- PyEval_GetFuncName(arg), frame->f_code->co_argcount, frame->f_code->co_stacksize);
+ PyEval_GetFuncName(arg), code->co_argcount, code->co_stacksize);
+ Py_DECREF(code);
break;
}
@@ -68,7 +81,9 @@ int uwsgi_python_tracer(PyObject *obj, PyFrameObject *frame, int what, PyObject
delta = now - last_ts;
}
last_ts = now;
- uwsgi_log("[uWSGI Python profiler %llu] file %s line %d: %s argc:%d\n", (unsigned long long)delta, PyString_AsString(frame->f_code->co_filename), PyFrame_GetLineNumber(frame), PyString_AsString(frame->f_code->co_name), frame->f_code->co_argcount);
+ PyCodeObject *code = PyFrame_GetCode(frame);
+ uwsgi_log("[uWSGI Python profiler %llu] file %s line %d: %s argc:%d\n", (unsigned long long)delta, PyString_AsString(code->co_filename), PyFrame_GetLineNumber(frame), PyString_AsString(code->co_name), code->co_argcount);
+ Py_DECREF(code);
}
return 0;
diff --git a/plugins/python/python_plugin.c b/plugins/python/python_plugin.c
index 6834f84..1d21c0d 100644
--- a/plugins/python/python_plugin.c
+++ b/plugins/python/python_plugin.c
@@ -1137,9 +1137,13 @@ void uwsgi_python_init_apps() {
}
// prepare for stack suspend/resume
- if (uwsgi.async > 1) {
+ if (uwsgi.async > 0) {
+#ifdef UWSGI_PY311
+ up.current_recursion_remaining = uwsgi_malloc(sizeof(int)*uwsgi.async);
+#else
up.current_recursion_depth = uwsgi_malloc(sizeof(int)*uwsgi.async);
- up.current_frame = uwsgi_malloc(sizeof(struct _frame)*uwsgi.async);
+#endif
+ up.current_frame = uwsgi_malloc(sizeof(up.current_frame[0])*uwsgi.async);
}
// setup app loaders
@@ -1530,12 +1534,22 @@ void uwsgi_python_suspend(struct wsgi_request *wsgi_req) {
PyGILState_Release(pgst);
if (wsgi_req) {
+#ifdef UWSGI_PY311
+ up.current_recursion_remaining[wsgi_req->async_id] = tstate->recursion_remaining;
+ up.current_frame[wsgi_req->async_id] = tstate->cframe;
+#else
up.current_recursion_depth[wsgi_req->async_id] = tstate->recursion_depth;
up.current_frame[wsgi_req->async_id] = tstate->frame;
+#endif
}
else {
+#ifdef UWSGI_PY311
+ up.current_main_recursion_remaining = tstate->recursion_remaining;
+ up.current_main_frame = tstate->cframe;
+#else
up.current_main_recursion_depth = tstate->recursion_depth;
up.current_main_frame = tstate->frame;
+#endif
}
}
@@ -1763,12 +1777,22 @@ void uwsgi_python_resume(struct wsgi_request *wsgi_req) {
PyGILState_Release(pgst);
if (wsgi_req) {
+#ifdef UWSGI_PY311
+ tstate->recursion_remaining = up.current_recursion_remaining[wsgi_req->async_id];
+ tstate->cframe = up.current_frame[wsgi_req->async_id];
+#else
tstate->recursion_depth = up.current_recursion_depth[wsgi_req->async_id];
tstate->frame = up.current_frame[wsgi_req->async_id];
+#endif
}
else {
+#ifdef UWSGI_PY311
+ tstate->recursion_remaining = up.current_main_recursion_remaining;
+ tstate->cframe = up.current_main_frame;
+#else
tstate->recursion_depth = up.current_main_recursion_depth;
tstate->frame = up.current_main_frame;
+#endif
}
}
diff --git a/plugins/python/uwsgi_python.h b/plugins/python/uwsgi_python.h
index 357d731..6c6f7a4 100644
--- a/plugins/python/uwsgi_python.h
+++ b/plugins/python/uwsgi_python.h
@@ -18,6 +18,10 @@
#define UWSGI_PYTHON_OLD
#endif
+#if (PY_VERSION_HEX >= 0x030b0000)
+# define UWSGI_PY311
+#endif
+
#if PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION < 7
#define HAS_NOT_PyMemoryView_FromBuffer
#endif
@@ -165,11 +169,19 @@ struct uwsgi_python {
char *callable;
+#ifdef UWSGI_PY311
+ int *current_recursion_remaining;
+ _PyCFrame **current_frame;
+
+ int current_main_recursion_remaining;
+ _PyCFrame *current_main_frame;
+#else
int *current_recursion_depth;
struct _frame **current_frame;
int current_main_recursion_depth;
struct _frame *current_main_frame;
+#endif
void (*swap_ts)(struct wsgi_request *, struct uwsgi_app *);
void (*reset_ts)(struct wsgi_request *, struct uwsgi_app *);

View file

@ -1,82 +0,0 @@
diff --git a/plugins/python/python_plugin.c b/plugins/python/python_plugin.c
index de92f34c..08d99a96 100644
--- a/plugins/python/python_plugin.c
+++ b/plugins/python/python_plugin.c
@@ -233,21 +233,6 @@ void uwsgi_python_pthread_child(void) {
PyMethodDef uwsgi_spit_method[] = { {"uwsgi_spit", py_uwsgi_spit, METH_VARARGS, ""} };
PyMethodDef uwsgi_write_method[] = { {"uwsgi_write", py_uwsgi_write, METH_VARARGS, ""} };
-PyDoc_STRVAR(uwsgi_py_doc, "uWSGI api module.");
-
-#ifdef PYTHREE
-static PyModuleDef uwsgi_module3 = {
- PyModuleDef_HEAD_INIT,
- "uwsgi",
- uwsgi_py_doc,
- -1,
- NULL,
-};
-PyObject *init_uwsgi3(void) {
- return PyModule_Create(&uwsgi_module3);
-}
-#endif
-
int uwsgi_python_init() {
char *pyversion = strchr(Py_GetVersion(), '\n');
@@ -313,9 +298,6 @@ pep405:
wchar_t *pname = uwsgi_calloc(sizeof(wchar_t) * (strlen(program_name)+1));
mbstowcs(pname, program_name, strlen(program_name)+1);
Py_SetProgramName(pname);
-#ifdef UWSGI_PY312
- PyImport_AppendInittab("uwsgi", init_uwsgi3);
-#endif
#else
Py_SetProgramName(program_name);
#endif
@@ -678,6 +660,21 @@ next:
+PyDoc_STRVAR(uwsgi_py_doc, "uWSGI api module.");
+
+#ifdef PYTHREE
+static PyModuleDef uwsgi_module3 = {
+ PyModuleDef_HEAD_INIT,
+ "uwsgi",
+ uwsgi_py_doc,
+ -1,
+ NULL,
+};
+PyObject *init_uwsgi3(void) {
+ return PyModule_Create(&uwsgi_module3);
+}
+#endif
+
void init_uwsgi_embedded_module() {
PyObject *new_uwsgi_module, *zero;
int i;
@@ -698,10 +695,21 @@ void init_uwsgi_embedded_module() {
#ifdef PYTHREE
-#ifndef UWSGI_PY312
+# ifndef UWSGI_PY312
PyImport_AppendInittab("uwsgi", init_uwsgi3);
-#endif
new_uwsgi_module = PyImport_AddModule("uwsgi");
+# else
+ // From python 3.12 onwards, PyImport_AppendInittab() can no
+ // longer be called after Py_Initialize(). Instead, dynamically
+ // add the module instead
+ PyObject *sys_modules;
+ PyImport_AddModule("uwsgi");
+ new_uwsgi_module = init_uwsgi3();
+ sys_modules = PyImport_GetModuleDict();
+ PyDict_SetItemString(sys_modules, "uwsgi", new_uwsgi_module);
+ Py_DECREF(new_uwsgi_module);
+
+# endif
#else
new_uwsgi_module = Py_InitModule3("uwsgi", NULL, uwsgi_py_doc);
#endif

View file

@ -1,152 +0,0 @@
diff -uNr a/plugins/python/python_plugin.c b/plugins/python/python_plugin.c
--- a/plugins/python/python_plugin.c 2023-07-27 17:34:12.000000000 +0200
+++ b/plugins/python/python_plugin.c 2023-09-30 18:30:47.884490233 +0200
@@ -197,6 +197,7 @@
PyMethodDef uwsgi_spit_method[] = { {"uwsgi_spit", py_uwsgi_spit, METH_VARARGS, ""} };
PyMethodDef uwsgi_write_method[] = { {"uwsgi_write", py_uwsgi_write, METH_VARARGS, ""} };
+PyObject *init_uwsgi3(void);
int uwsgi_python_init() {
char *pyversion = strchr(Py_GetVersion(), '\n');
@@ -261,6 +262,9 @@
wchar_t *pname = uwsgi_calloc(sizeof(wchar_t) * (strlen(program_name)+1));
mbstowcs(pname, program_name, strlen(program_name)+1);
Py_SetProgramName(pname);
+#ifdef UWSGI_PY312
+ PyImport_AppendInittab("uwsgi", init_uwsgi3);
+#endif
#else
Py_SetProgramName(program_name);
#endif
@@ -658,7 +662,9 @@
#ifdef PYTHREE
+#ifndef UWSGI_PY312
PyImport_AppendInittab("uwsgi", init_uwsgi3);
+#endif
new_uwsgi_module = PyImport_AddModule("uwsgi");
#else
new_uwsgi_module = Py_InitModule3("uwsgi", NULL, uwsgi_py_doc);
@@ -1161,7 +1167,10 @@
// prepare for stack suspend/resume
if (uwsgi.async > 1) {
-#ifdef UWSGI_PY311
+#ifdef UWSGI_PY312
+ up.current_c_recursion_remaining = uwsgi_malloc(sizeof(int)*uwsgi.async);
+ up.current_py_recursion_remaining = uwsgi_malloc(sizeof(int)*uwsgi.async);
+#elif defined UWSGI_PY311
up.current_recursion_remaining = uwsgi_malloc(sizeof(int)*uwsgi.async);
#else
up.current_recursion_depth = uwsgi_malloc(sizeof(int)*uwsgi.async);
@@ -1324,7 +1333,12 @@
// Acquire the gil and import lock before forking in order to avoid
// deadlocks in workers
UWSGI_GET_GIL
+#if defined UWSGI_PY312
+ PyInterpreterState *interp = PyInterpreterState_Get();
+ _PyImport_AcquireLock(interp);
+#else
_PyImport_AcquireLock();
+#endif
}
}
@@ -1336,7 +1350,12 @@
if (uwsgi.has_threads) {
if (step == 0) {
// Release locks within master process
+#if defined UWSGI_PY312
+ PyInterpreterState *interp = PyInterpreterState_Get();
+ _PyImport_ReleaseLock(interp);
+#else
_PyImport_ReleaseLock();
+#endif
UWSGI_RELEASE_GIL
}
else {
@@ -1592,7 +1611,11 @@
PyGILState_Release(pgst);
if (wsgi_req) {
-#ifdef UWSGI_PY311
+#ifdef UWSGI_PY312
+ up.current_c_recursion_remaining[wsgi_req->async_id] = tstate->c_recursion_remaining;
+ up.current_py_recursion_remaining[wsgi_req->async_id] = tstate->py_recursion_remaining;
+ up.current_frame[wsgi_req->async_id] = tstate->cframe;
+#elif defined UWSGI_PY311
up.current_recursion_remaining[wsgi_req->async_id] = tstate->recursion_remaining;
up.current_frame[wsgi_req->async_id] = tstate->cframe;
#else
@@ -1601,7 +1624,11 @@
#endif
}
else {
-#ifdef UWSGI_PY311
+#ifdef UWSGI_PY312
+ up.current_main_c_recursion_remaining = tstate->c_recursion_remaining;
+ up.current_main_py_recursion_remaining = tstate->py_recursion_remaining;
+ up.current_main_frame = tstate->cframe;
+#elif defined UWSGI_PY311
up.current_main_recursion_remaining = tstate->recursion_remaining;
up.current_main_frame = tstate->cframe;
#else
@@ -1835,7 +1862,11 @@
PyGILState_Release(pgst);
if (wsgi_req) {
-#ifdef UWSGI_PY311
+#ifdef UWSGI_PY312
+ tstate->c_recursion_remaining = up.current_c_recursion_remaining[wsgi_req->async_id];
+ tstate->py_recursion_remaining = up.current_py_recursion_remaining[wsgi_req->async_id];
+ tstate->cframe = up.current_frame[wsgi_req->async_id];
+#elif defined UWSGI_PY311
tstate->recursion_remaining = up.current_recursion_remaining[wsgi_req->async_id];
tstate->cframe = up.current_frame[wsgi_req->async_id];
#else
@@ -1844,7 +1875,11 @@
#endif
}
else {
-#ifdef UWSGI_PY311
+#ifdef UWSGI_PY312
+ tstate->c_recursion_remaining = up.current_main_c_recursion_remaining;
+ tstate->py_recursion_remaining = up.current_main_py_recursion_remaining;
+ tstate->cframe = up.current_main_frame;
+#elif defined UWSGI_PY311
tstate->recursion_remaining = up.current_main_recursion_remaining;
tstate->cframe = up.current_main_frame;
#else
diff -uNr a/plugins/python/uwsgi_python.h b/plugins/python/uwsgi_python.h
--- a/plugins/python/uwsgi_python.h 2023-07-27 17:34:12.000000000 +0200
+++ b/plugins/python/uwsgi_python.h 2023-09-30 18:30:24.766699317 +0200
@@ -21,6 +21,10 @@
# define UWSGI_PY311
#endif
+#if (PY_VERSION_HEX >= 0x030c0000)
+# define UWSGI_PY312
+#endif
+
#if PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION < 7
#define HAS_NOT_PyMemoryView_FromBuffer
#endif
@@ -168,7 +172,15 @@
char *callable;
-#ifdef UWSGI_PY311
+#ifdef UWSGI_PY312
+ int *current_c_recursion_remaining;
+ int *current_py_recursion_remaining;
+ _PyCFrame **current_frame;
+
+ int current_main_c_recursion_remaining;
+ int current_main_py_recursion_remaining;
+ _PyCFrame *current_main_frame;
+#elif defined UWSGI_PY311
int *current_recursion_remaining;
_PyCFrame **current_frame;

View file

@ -1,193 +0,0 @@
diff -uNr a/core/init.c b/core/init.c
--- a/core/init.c 2024-06-01 20:40:38.000000000 +0200
+++ b/core/init.c 2024-08-13 09:56:13.152870522 +0200
@@ -432,8 +432,8 @@
uwsgi.cores = uwsgi.async;
}
+ uwsgi.has_threads = 1;
if (uwsgi.threads > 1) {
- uwsgi.has_threads = 1;
uwsgi.cores = uwsgi.threads;
}
diff -uNr a/core/uwsgi.c b/core/uwsgi.c
--- a/core/uwsgi.c 2024-06-01 20:40:38.000000000 +0200
+++ b/core/uwsgi.c 2024-08-13 09:56:13.156870522 +0200
@@ -197,7 +197,7 @@
{"freebind", no_argument, 0, "put socket in freebind mode", uwsgi_opt_true, &uwsgi.freebind, 0},
#endif
{"map-socket", required_argument, 0, "map sockets to specific workers", uwsgi_opt_add_string_list, &uwsgi.map_socket, 0},
- {"enable-threads", no_argument, 'T', "enable threads", uwsgi_opt_true, &uwsgi.has_threads, 0},
+ {"enable-threads", no_argument, 'T', "enable threads (stub option this is true by default)", uwsgi_opt_true, &uwsgi.has_threads, 0},
{"no-threads-wait", no_argument, 0, "do not wait for threads cancellation on quit/reload", uwsgi_opt_true, &uwsgi.no_threads_wait, 0},
{"auto-procname", no_argument, 0, "automatically set processes name to something meaningful", uwsgi_opt_true, &uwsgi.auto_procname, 0},
diff -uNr a/.github/workflows/test.yml b/.github/workflows/test.yml
--- a/.github/workflows/test.yml 2024-06-01 20:40:38.000000000 +0200
+++ b/.github/workflows/test.yml 2024-08-13 09:56:13.152870522 +0200
@@ -37,7 +37,7 @@
runs-on: ubuntu-20.04
strategy:
matrix:
- python-version: ["2.7", "3.6", "3.7", "3.8", "3.9", "3.10", "3.11", "3.12"]
+ python-version: ["2.7", "3.6", "3.7", "3.8", "3.9", "3.10", "3.11", "3.12", "3.13"]
test-suite: [python, deadlocks]
steps:
- name: Add deadnakes ppa
diff -uNr a/plugins/python/python_plugin.c b/plugins/python/python_plugin.c
--- a/plugins/python/python_plugin.c 2024-08-13 09:55:30.374870522 +0200
+++ b/plugins/python/python_plugin.c 2024-08-13 10:00:36.315870522 +0200
@@ -406,7 +406,7 @@
// reset python signal flags so child processes can trap signals
// Necessary if uwsgi fork hooks not called to update interpreter state
if (!up.call_uwsgi_fork_hooks && up.call_osafterfork) {
-#ifdef HAS_NOT_PyOS_AfterFork_Child
+#ifdef HAS_NOT_PYOS_FORK_STABLE_API
PyOS_AfterFork();
#else
PyOS_AfterFork_Child();
@@ -1340,11 +1340,10 @@
// Acquire the gil and import lock before forking in order to avoid
// deadlocks in workers
UWSGI_GET_GIL
-#if defined UWSGI_PY312
- PyInterpreterState *interp = PyInterpreterState_Get();
- _PyImport_AcquireLock(interp);
-#else
+#ifdef HAS_NOT_PYOS_FORK_STABLE_API
_PyImport_AcquireLock();
+#else
+ PyOS_BeforeFork();
#endif
}
}
@@ -1357,17 +1356,16 @@
if (uwsgi.has_threads) {
if (step == 0) {
// Release locks within master process
-#if defined UWSGI_PY312
- PyInterpreterState *interp = PyInterpreterState_Get();
- _PyImport_ReleaseLock(interp);
-#else
+#ifdef HAS_NOT_PYOS_FORK_STABLE_API
_PyImport_ReleaseLock();
+#else
+ PyOS_AfterFork_Parent();
#endif
UWSGI_RELEASE_GIL
}
else {
// Ensure thread state and locks are cleaned up in child process
-#ifdef HAS_NOT_PyOS_AfterFork_Child
+#ifdef HAS_NOT_PYOS_FORK_STABLE_API
PyOS_AfterFork();
#else
PyOS_AfterFork_Child();
@@ -1618,7 +1616,11 @@
PyGILState_Release(pgst);
if (wsgi_req) {
-#ifdef UWSGI_PY312
+#ifdef UWSGI_PY313
+ up.current_c_recursion_remaining[wsgi_req->async_id] = tstate->c_recursion_remaining;
+ up.current_py_recursion_remaining[wsgi_req->async_id] = tstate->py_recursion_remaining;
+ up.current_frame[wsgi_req->async_id] = tstate->current_frame;
+#elif defined UWSGI_PY312
up.current_c_recursion_remaining[wsgi_req->async_id] = tstate->c_recursion_remaining;
up.current_py_recursion_remaining[wsgi_req->async_id] = tstate->py_recursion_remaining;
up.current_frame[wsgi_req->async_id] = tstate->cframe;
@@ -1631,7 +1633,11 @@
#endif
}
else {
-#ifdef UWSGI_PY312
+#ifdef UWSGI_PY313
+ up.current_main_c_recursion_remaining = tstate->c_recursion_remaining;
+ up.current_main_py_recursion_remaining = tstate->py_recursion_remaining;
+ up.current_main_frame = tstate->current_frame;
+#elif defined UWSGI_PY312
up.current_main_c_recursion_remaining = tstate->c_recursion_remaining;
up.current_main_py_recursion_remaining = tstate->py_recursion_remaining;
up.current_main_frame = tstate->cframe;
@@ -1871,7 +1877,11 @@
PyGILState_Release(pgst);
if (wsgi_req) {
-#ifdef UWSGI_PY312
+#ifdef UWSGI_PY313
+ tstate->c_recursion_remaining = up.current_c_recursion_remaining[wsgi_req->async_id];
+ tstate->py_recursion_remaining = up.current_py_recursion_remaining[wsgi_req->async_id];
+ tstate->current_frame = up.current_frame[wsgi_req->async_id];
+#elif defined UWSGI_PY312
tstate->c_recursion_remaining = up.current_c_recursion_remaining[wsgi_req->async_id];
tstate->py_recursion_remaining = up.current_py_recursion_remaining[wsgi_req->async_id];
tstate->cframe = up.current_frame[wsgi_req->async_id];
@@ -1884,7 +1894,11 @@
#endif
}
else {
-#ifdef UWSGI_PY312
+#ifdef UWSGI_PY313
+ tstate->c_recursion_remaining = up.current_main_c_recursion_remaining;
+ tstate->py_recursion_remaining = up.current_main_py_recursion_remaining;
+ tstate->current_frame = up.current_main_frame;
+#elif defined UWSGI_PY312
tstate->c_recursion_remaining = up.current_main_c_recursion_remaining;
tstate->py_recursion_remaining = up.current_main_py_recursion_remaining;
tstate->cframe = up.current_main_frame;
@@ -2098,7 +2112,7 @@
// ensure signals can be used again from python
// Necessary if fork hooks have been not used to update interpreter state
if (!up.call_osafterfork && !up.call_uwsgi_fork_hooks)
-#ifdef HAS_NOT_PyOS_AfterFork_Child
+#ifdef HAS_NOT_PYOS_FORK_STABLE_API
PyOS_AfterFork();
#else
PyOS_AfterFork_Child();
diff -uNr a/plugins/python/uwsgi_python.h b/plugins/python/uwsgi_python.h
--- a/plugins/python/uwsgi_python.h 2024-06-01 20:40:38.000000000 +0200
+++ b/plugins/python/uwsgi_python.h 2024-08-13 10:04:58.492870522 +0200
@@ -25,6 +25,10 @@
# define UWSGI_PY312
#endif
+#if (PY_VERSION_HEX >= 0x030d0000)
+# define UWSGI_PY313
+#endif
+
#if PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION < 7
#define HAS_NOT_PyMemoryView_FromBuffer
#endif
@@ -41,12 +45,8 @@
#define HAS_NO_ERRORS_IN_PyFile_FromFd
#endif
-#if PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION < 7
-#define HAS_NOT_PyOS_AfterFork_Child
-#endif
-
-#if PY_MAJOR_VERSION < 3
-#define HAS_NOT_PyOS_AfterFork_Child
+#if (PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION < 7) || PY_MAJOR_VERSION < 3
+#define HAS_NOT_PYOS_FORK_STABLE_API
#endif
#if PY_MAJOR_VERSION > 2
@@ -172,7 +172,15 @@
char *callable;
-#ifdef UWSGI_PY312
+#ifdef UWSGI_PY313
+ int *current_c_recursion_remaining;
+ int *current_py_recursion_remaining;
+ struct _PyInterpreterFrame **current_frame;
+
+ int current_main_c_recursion_remaining;
+ int current_main_py_recursion_remaining;
+ struct _PyInterpreterFrame *current_main_frame;
+#elif defined UWSGI_PY312
int *current_c_recursion_remaining;
int *current_py_recursion_remaining;
_PyCFrame **current_frame;

View file

@ -1,42 +0,0 @@
diff -uNr a/plugins/rack/uwsgiplugin.py b/plugins/rack/uwsgiplugin.py
--- a/plugins/rack/uwsgiplugin.py 2023-07-28 20:02:57.242903528 +0200
+++ b/plugins/rack/uwsgiplugin.py 2023-07-28 20:05:59.933863052 +0200
@@ -10,14 +10,14 @@
rbconfig = 'Config'
version = os.popen(RUBYPATH + " -e \"print RUBY_VERSION\"").read().rstrip()
-v = version.split('.')
+v = tuple(int(x) for x in version.split('.'))
GCC_LIST = ['rack_plugin', 'rack_api']
-if (v[0] == '1' and v[1] == '9') or v[0] >= '2':
+if v >= (1, 9):
CFLAGS = os.popen(RUBYPATH + " -e \"require 'rbconfig';print RbConfig::CONFIG['CFLAGS']\"").read().rstrip().split()
CFLAGS.append('-DRUBY19')
- if version >= '2.7':
+ if v >= (2, 7):
CFLAGS.append('-DRUBY27')
CFLAGS.append('-Wno-unused-parameter')
rbconfig = 'RbConfig'
diff -uNr a/plugins/ruby19/uwsgiplugin.py b/plugins/ruby19/uwsgiplugin.py
--- a/plugins/ruby19/uwsgiplugin.py 2023-07-28 20:02:57.242903528 +0200
+++ b/plugins/ruby19/uwsgiplugin.py 2023-07-28 20:05:11.560403332 +0200
@@ -10,14 +10,14 @@
rbconfig = 'Config'
version = os.popen(RUBYPATH + " -e \"print RUBY_VERSION\"").read().rstrip()
-v = version.split('.')
+v = tuple(int(x) for x in version.split('.'))
GCC_LIST = ['../rack/rack_plugin', '../rack/rack_api']
-if (v[0] == '1' and v[1] == '9') or v[0] >= '2':
+if v >= (1, 9):
CFLAGS = os.popen(RUBYPATH + " -e \"require 'rbconfig';print RbConfig::CONFIG['CFLAGS']\"").read().rstrip().split()
CFLAGS.append('-DRUBY19')
- if version >= '2.7':
+ if v >= (2, 7):
CFLAGS.append('-DRUBY27')
CFLAGS.append('-Wno-unused-parameter')
rbconfig = 'RbConfig'

View file

@ -1,16 +0,0 @@
diff --git a/uwsgiconfig.py b/uwsgiconfig.py
index 59393e1..e43f092 100644
--- a/uwsgiconfig.py
+++ b/uwsgiconfig.py
@@ -1422,10 +1422,7 @@ def build_plugin(path, uc, cflags, ldflags, libs, name = None):
except:
pass
- if uc:
- plugin_dest = uc.get('plugin_build_dir', uc.get('plugin_dir')) + '/' + name + '_plugin'
- else:
- plugin_dest = name + '_plugin'
+ plugin_dest = name + '_plugin'
shared_flag = '-shared'

View file

@ -1,12 +0,0 @@
diff -Naurp a/plugins/v8/uwsgiplugin.py b/plugins/v8/uwsgiplugin.py
--- a/plugins/v8/uwsgiplugin.py 2016-05-12 12:37:49.000000000 -0500
+++ b/plugins/v8/uwsgiplugin.py 2016-08-01 22:56:50.969785338 -0500
@@ -1,7 +1,7 @@
import os
NAME='v8'
-CFLAGS = ['-Wno-deprecated-declarations']
+CFLAGS = ['-Wno-deprecated-declarations', '-I/usr/include/v8-3.14']
LDFLAGS = []
LIBS = ['-lstdc++', '-lv8']
engine = os.environ.get('UWSGICONFIG_V8_ENGINE', '')