Mercurial > hg > nginx-vendor-current
comparison src/core/ngx_connection.c @ 618:b9763778e212 NGINX_0_9_7
nginx 0.9.7
*) Feature: now keepalive connections may be closed premature, if there
are no free worker connections.
Thanks to Maxim Dounin.
*) Feature: the "rotate" parameter of the "image_filter" directive.
Thanks to Adam Bocim.
*) Bugfix: a case when a backend in "fastcgi_pass", "scgi_pass", or
"uwsgi_pass" directives is given by expression and refers to a
defined upstream.
author | Igor Sysoev <http://sysoev.ru> |
---|---|
date | Mon, 04 Apr 2011 00:00:00 +0400 |
parents | 016632f0fb18 |
children | 23ef0645ea57 |
comparison
equal
deleted
inserted
replaced
617:fcda3d3eb4ff | 618:b9763778e212 |
---|---|
8 #include <ngx_core.h> | 8 #include <ngx_core.h> |
9 #include <ngx_event.h> | 9 #include <ngx_event.h> |
10 | 10 |
11 | 11 |
12 ngx_os_io_t ngx_io; | 12 ngx_os_io_t ngx_io; |
13 | |
14 | |
15 static void ngx_drain_connections(void); | |
13 | 16 |
14 | 17 |
15 ngx_listening_t * | 18 ngx_listening_t * |
16 ngx_create_listening(ngx_conf_t *cf, void *sockaddr, socklen_t socklen) | 19 ngx_create_listening(ngx_conf_t *cf, void *sockaddr, socklen_t socklen) |
17 { | 20 { |
717 /* ngx_mutex_lock */ | 720 /* ngx_mutex_lock */ |
718 | 721 |
719 c = ngx_cycle->free_connections; | 722 c = ngx_cycle->free_connections; |
720 | 723 |
721 if (c == NULL) { | 724 if (c == NULL) { |
725 ngx_drain_connections(); | |
726 c = ngx_cycle->free_connections; | |
727 } | |
728 | |
729 if (c == NULL) { | |
722 ngx_log_error(NGX_LOG_ALERT, log, 0, | 730 ngx_log_error(NGX_LOG_ALERT, log, 0, |
723 "%ui worker_connections are not enough", | 731 "%ui worker_connections are not enough", |
724 ngx_cycle->connection_n); | 732 ngx_cycle->connection_n); |
725 | 733 |
726 /* ngx_mutex_unlock */ | 734 /* ngx_mutex_unlock */ |
859 c->read->closed = 1; | 867 c->read->closed = 1; |
860 c->write->closed = 1; | 868 c->write->closed = 1; |
861 | 869 |
862 #endif | 870 #endif |
863 | 871 |
872 ngx_reusable_connection(c, 0); | |
873 | |
864 log_error = c->log_error; | 874 log_error = c->log_error; |
865 | 875 |
866 ngx_free_connection(c); | 876 ngx_free_connection(c); |
867 | 877 |
868 fd = c->fd; | 878 fd = c->fd; |
894 | 904 |
895 /* we use ngx_cycle->log because c->log was in c->pool */ | 905 /* we use ngx_cycle->log because c->log was in c->pool */ |
896 | 906 |
897 ngx_log_error(level, ngx_cycle->log, err, | 907 ngx_log_error(level, ngx_cycle->log, err, |
898 ngx_close_socket_n " %d failed", fd); | 908 ngx_close_socket_n " %d failed", fd); |
909 } | |
910 } | |
911 | |
912 | |
913 void | |
914 ngx_reusable_connection(ngx_connection_t *c, ngx_uint_t reusable) | |
915 { | |
916 ngx_log_debug1(NGX_LOG_DEBUG_CORE, c->log, 0, | |
917 "reusable connection: %ui", reusable); | |
918 | |
919 if (c->reusable) { | |
920 ngx_queue_remove(&c->queue); | |
921 } | |
922 | |
923 c->reusable = reusable; | |
924 | |
925 if (reusable) { | |
926 /* need cast as ngx_cycle is volatile */ | |
927 | |
928 ngx_queue_insert_head( | |
929 (ngx_queue_t *) &ngx_cycle->reusable_connections_queue, &c->queue); | |
930 } | |
931 } | |
932 | |
933 | |
934 static void | |
935 ngx_drain_connections(void) | |
936 { | |
937 ngx_int_t i; | |
938 ngx_queue_t *q; | |
939 ngx_connection_t *c; | |
940 | |
941 for (i = 0; i < 32; i++) { | |
942 if (ngx_queue_empty(&ngx_cycle->reusable_connections_queue)) { | |
943 break; | |
944 } | |
945 | |
946 q = ngx_queue_last(&ngx_cycle->reusable_connections_queue); | |
947 c = ngx_queue_data(q, ngx_connection_t, queue); | |
948 | |
949 ngx_log_debug0(NGX_LOG_DEBUG_CORE, c->log, 0, | |
950 "reusing connection"); | |
951 | |
952 c->close = 1; | |
953 c->read->handler(c->read); | |
899 } | 954 } |
900 } | 955 } |
901 | 956 |
902 | 957 |
903 ngx_int_t | 958 ngx_int_t |