mirror of
https://github.com/clearlinux/uwsgi.git
synced 2026-09-06 21:51:30 +00:00
merge
This commit is contained in:
@@ -118,6 +118,27 @@ pid_t uwsgi_rwlock_fast_check(struct uwsgi_lock_item *uli) {
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
void uwsgi_lock_fast(struct uwsgi_lock_item *uli) {
|
||||
|
||||
#ifdef EOWNERDEAD
|
||||
if (pthread_mutex_lock((pthread_mutex_t *) uli->lock_ptr) == EOWNERDEAD) {
|
||||
uwsgi_log("[deadlock-detector] a process holding a robust mutex died. recovering...\n");
|
||||
pthread_mutex_consistent_np((pthread_mutex_t *) uli->lock_ptr);
|
||||
}
|
||||
#else
|
||||
pthread_mutex_lock((pthread_mutex_t *) uli->lock_ptr);
|
||||
#endif
|
||||
uli->pid = uwsgi.mypid;
|
||||
}
|
||||
|
||||
void uwsgi_unlock_fast(struct uwsgi_lock_item *uli) {
|
||||
|
||||
pthread_mutex_unlock((pthread_mutex_t *) uli->lock_ptr);
|
||||
uli->pid = 0;
|
||||
|
||||
}
|
||||
|
||||
void uwsgi_rlock_fast(struct uwsgi_lock_item *uli) {
|
||||
#ifdef OBSOLETE_LINUX_KERNEL
|
||||
uwsgi_lock_fast(uli);
|
||||
@@ -145,30 +166,10 @@ void uwsgi_rwunlock_fast(struct uwsgi_lock_item *uli) {
|
||||
#endif
|
||||
}
|
||||
|
||||
void uwsgi_lock_fast(struct uwsgi_lock_item *uli) {
|
||||
|
||||
#ifdef EOWNERDEAD
|
||||
if (pthread_mutex_lock((pthread_mutex_t *) uli->lock_ptr) == EOWNERDEAD) {
|
||||
uwsgi_log("[deadlock-detector] a process holding a robust mutex died. recovering...\n");
|
||||
pthread_mutex_consistent_np((pthread_mutex_t *) uli->lock_ptr);
|
||||
}
|
||||
#else
|
||||
pthread_mutex_lock((pthread_mutex_t *) uli->lock_ptr);
|
||||
#endif
|
||||
uli->pid = uwsgi.mypid;
|
||||
}
|
||||
|
||||
void uwsgi_unlock_fast(struct uwsgi_lock_item *uli) {
|
||||
|
||||
pthread_mutex_unlock((pthread_mutex_t *) uli->lock_ptr);
|
||||
uli->pid = 0;
|
||||
|
||||
}
|
||||
|
||||
struct uwsgi_lock_item *uwsgi_rwlock_fast_init(char *id) {
|
||||
|
||||
#ifdef OBSOLETE_LINUX_KERNEL
|
||||
return uwsgi_lock_fast_init(uli);
|
||||
return uwsgi_lock_fast_init(id);
|
||||
#else
|
||||
|
||||
pthread_rwlockattr_t attr;
|
||||
|
||||
@@ -140,6 +140,7 @@ void *cache_sweeper_loop(void *noarg) {
|
||||
}
|
||||
};
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void uwsgi_subscribe(char *subscription, uint8_t cmd) {
|
||||
|
||||
+29
-9
@@ -193,22 +193,42 @@ ssize_t uwsgi_proto_fastcgi_write(struct wsgi_request * wsgi_req, char *buf, siz
|
||||
if (len <= 65535) {
|
||||
rlen = write(wsgi_req->poll.fd, &fr, 8);
|
||||
if (rlen <= 0) {
|
||||
return rlen;
|
||||
if (!uwsgi.ignore_write_errors) {
|
||||
uwsgi_req_error("write()");
|
||||
}
|
||||
wsgi_req->write_errors++;
|
||||
return 0;
|
||||
}
|
||||
return write(wsgi_req->poll.fd, buf, len);
|
||||
rlen = write(wsgi_req->poll.fd, buf, len);
|
||||
if (rlen <= 0) {
|
||||
if (!uwsgi.ignore_write_errors) {
|
||||
uwsgi_req_error("write()");
|
||||
}
|
||||
wsgi_req->write_errors++;
|
||||
return 0;
|
||||
}
|
||||
return rlen;
|
||||
}
|
||||
else {
|
||||
while(len > 0) {
|
||||
chunk_len = UMIN(65535, len);
|
||||
fr.cl = htons(chunk_len);
|
||||
rlen = write(wsgi_req->poll.fd, &fr, 8);
|
||||
if (rlen <= 0) {
|
||||
return rlen;
|
||||
}
|
||||
if (rlen != 8) {
|
||||
if (!uwsgi.ignore_write_errors) {
|
||||
uwsgi_req_error("write()");
|
||||
}
|
||||
wsgi_req->write_errors++;
|
||||
return 0;
|
||||
}
|
||||
rlen = write(wsgi_req->poll.fd, ptr, chunk_len);
|
||||
if (rlen <= 0) {
|
||||
return rlen;
|
||||
}
|
||||
if (rlen != 8) {
|
||||
if (!uwsgi.ignore_write_errors) {
|
||||
uwsgi_req_error("write()");
|
||||
}
|
||||
wsgi_req->write_errors++;
|
||||
return 0;
|
||||
}
|
||||
ptr += rlen;
|
||||
len -= rlen;
|
||||
}
|
||||
@@ -224,7 +244,7 @@ ssize_t uwsgi_proto_fastcgi_write_header(struct wsgi_request * wsgi_req, char *b
|
||||
void uwsgi_proto_fastcgi_close(struct wsgi_request *wsgi_req) {
|
||||
|
||||
if (write(wsgi_req->poll.fd, FCGI_END_REQUEST, 24) <= 0) {
|
||||
uwsgi_error("write()");
|
||||
uwsgi_req_error("write()");
|
||||
}
|
||||
|
||||
uwsgi_proto_base_close(wsgi_req);
|
||||
|
||||
+7
-3
@@ -415,7 +415,8 @@ ssize_t uwsgi_proto_zeromq_writev_header(struct wsgi_request *wsgi_req, struct i
|
||||
for (i = 0; i < (int) iov_len; i++) {
|
||||
len = uwsgi_proto_zeromq_write(wsgi_req, iovec[i].iov_base, iovec[i].iov_len);
|
||||
if (len <= 0) {
|
||||
return len;
|
||||
wsgi_req->write_errors++;
|
||||
return 0;
|
||||
}
|
||||
ret += len;
|
||||
}
|
||||
@@ -441,10 +442,13 @@ ssize_t uwsgi_proto_zeromq_write(struct wsgi_request * wsgi_req, char *buf, size
|
||||
zmq_msg_init_data(&reply, zmq_body, wsgi_req->proto_parser_pos + len, uwsgi_proto_zeromq_free, NULL);
|
||||
if (uwsgi.threads > 1) pthread_mutex_lock(&uwsgi.zmq_lock);
|
||||
if (zmq_send(uwsgi.zmq_pub, &reply, 0)) {
|
||||
uwsgi_error("zmq_send()");
|
||||
if (!uwsgi.ignore_write_errors) {
|
||||
uwsgi_error("zmq_send()");
|
||||
}
|
||||
wsgi_req->write_errors++;
|
||||
if (uwsgi.threads > 1) pthread_mutex_unlock(&uwsgi.zmq_lock);
|
||||
zmq_msg_close(&reply);
|
||||
return -1;
|
||||
return 0;
|
||||
}
|
||||
if (uwsgi.threads > 1) pthread_mutex_unlock(&uwsgi.zmq_lock);
|
||||
zmq_msg_close(&reply);
|
||||
|
||||
Reference in New Issue
Block a user