@@ -21,17 +21,20 @@ extern "C" {
2121
2222template <class S > static ngx_int_t
2323ngx_dynamic_upstream_op_add (typename TypeSelect<S>::peers_type *primary,
24- ngx_dynamic_upstream_op_t *op, ngx_slab_pool_t *shpool, ngx_log_t *log);
24+ ngx_dynamic_upstream_op_t *op, ngx_slab_pool_t *shpool,
25+ ngx_pool_t *temp_pool, ngx_log_t *log);
2526
2627
2728template <class S > static ngx_int_t
2829ngx_dynamic_upstream_op_sync (typename TypeSelect<S>::peers_type *primary,
29- ngx_dynamic_upstream_op_t *op, ngx_slab_pool_t *shpool, ngx_log_t *log);
30+ ngx_dynamic_upstream_op_t *op, ngx_slab_pool_t *shpool,
31+ ngx_pool_t *temp_pool, ngx_log_t *log);
3032
3133
3234template <class S > static ngx_int_t
3335ngx_dynamic_upstream_op_del (typename TypeSelect<S>::peers_type *primary,
34- ngx_dynamic_upstream_op_t *op, ngx_slab_pool_t *shpool, ngx_log_t *log);
36+ ngx_dynamic_upstream_op_t *op, ngx_slab_pool_t *shpool,
37+ ngx_pool_t *temp_pool, ngx_log_t *log);
3538
3639
3740template <class S > static ngx_int_t
@@ -61,7 +64,7 @@ ngx_shm_calloc(ngx_slab_pool_t *shpool, size_t size = 0)
6164
6265ngx_int_t
6366ngx_dynamic_upstream_op_impl (ngx_log_t *log, ngx_dynamic_upstream_op_t *op,
64- ngx_slab_pool_t *shpool, void *peers)
67+ ngx_slab_pool_t *shpool, ngx_pool_t *temp_pool, void *peers)
6568{
6669 ngx_int_t rc = NGX_OK;
6770
@@ -71,15 +74,18 @@ ngx_dynamic_upstream_op_impl(ngx_log_t *log, ngx_dynamic_upstream_op_t *op,
7174 switch (op->op ) {
7275
7376 case NGX_DYNAMIC_UPSTEAM_OP_ADD:
74- rc = CALL (ngx_dynamic_upstream_op_add, peers, op, shpool, log);
77+ rc = CALL (ngx_dynamic_upstream_op_add, peers, op, shpool,
78+ temp_pool, log);
7579 break ;
7680
7781 case NGX_DYNAMIC_UPSTEAM_OP_REMOVE:
78- rc = CALL (ngx_dynamic_upstream_op_del, peers, op, shpool, log);
82+ rc = CALL (ngx_dynamic_upstream_op_del, peers, op, shpool,
83+ temp_pool, log);
7984 break ;
8085
8186 case NGX_DYNAMIC_UPSTEAM_OP_SYNC:
82- rc = CALL (ngx_dynamic_upstream_op_sync, peers, op, shpool, log);
87+ rc = CALL (ngx_dynamic_upstream_op_sync, peers, op, shpool,
88+ temp_pool, log);
8389 break ;
8490
8591 case NGX_DYNAMIC_UPSTEAM_OP_PARAM:
@@ -365,7 +371,8 @@ ngx_dynamic_upstream_op_add_peer(ngx_log_t *log,
365371template <class S > static ngx_int_t
366372ngx_dynamic_upstream_op_add_impl (ngx_log_t *log,
367373 ngx_dynamic_upstream_op_t *op, ngx_slab_pool_t *shpool,
368- typename TypeSelect<S>::peers_type *primary, ngx_url_t *u)
374+ ngx_pool_t *temp_pool, typename TypeSelect<S>::peers_type *primary,
375+ ngx_url_t *u)
369376{
370377 unsigned j;
371378 unsigned count = 0 ;
@@ -398,7 +405,8 @@ ngx_dynamic_upstream_op_add_impl(ngx_log_t *log,
398405 del_op.server = noaddr;
399406 del_op.name = noaddr;
400407
401- ngx_dynamic_upstream_op_del<S>(primary, &del_op, shpool, log);
408+ ngx_dynamic_upstream_op_del<S>(primary, &del_op, shpool,
409+ temp_pool, log);
402410 }
403411
404412 op->status = count != 0 ? NGX_HTTP_OK : NGX_HTTP_NOT_MODIFIED;
@@ -407,39 +415,15 @@ ngx_dynamic_upstream_op_add_impl(ngx_log_t *log,
407415}
408416
409417
410- struct ngx_pool_auto {
411- ngx_pool_t *pool;
412-
413- ngx_pool_auto (ngx_log_t *log)
414- : pool(ngx_create_pool(ngx_pagesize, log))
415- {}
416-
417- ~ngx_pool_auto ()
418- {
419- if (pool != NULL )
420- ngx_destroy_pool (pool);
421- }
422- };
423-
424-
425418template <class S > static ngx_int_t
426419ngx_dynamic_upstream_op_add (typename TypeSelect<S>::peers_type *primary,
427- ngx_dynamic_upstream_op_t *op, ngx_slab_pool_t *shpool, ngx_log_t *log)
420+ ngx_dynamic_upstream_op_t *op, ngx_slab_pool_t *shpool,
421+ ngx_pool_t *temp_pool, ngx_log_t *log)
428422{
429423 ngx_url_t u;
430424 ngx_int_t rc;
431425
432- ngx_pool_auto guard (log);
433-
434- if (guard.pool == NULL ) {
435-
436- op->status = NGX_HTTP_INTERNAL_SERVER_ERROR;
437- op->err = " no memory" ;
438-
439- return NGX_ERROR;
440- }
441-
442- if ((rc = ngx_dynamic_upstream_parse_url (&u, guard.pool , op)) == NGX_ERROR)
426+ if ((rc = ngx_dynamic_upstream_parse_url (&u, temp_pool, op)) == NGX_ERROR)
443427 return NGX_ERROR;
444428
445429 if (rc == NGX_AGAIN) {
@@ -459,8 +443,8 @@ ngx_dynamic_upstream_op_add(typename TypeSelect<S>::peers_type *primary,
459443 }
460444 }
461445
462- if (ngx_dynamic_upstream_op_add_impl<S>(log, op, shpool, primary, &u)
463- == NGX_ERROR)
446+ if (ngx_dynamic_upstream_op_add_impl<S>(log, op, shpool, temp_pool,
447+ primary, &u) == NGX_ERROR)
464448 return NGX_ERROR;
465449
466450 if (op->status == NGX_HTTP_NOT_MODIFIED)
@@ -624,7 +608,8 @@ ngx_dynamic_upstream_op_hash(typename TypeSelect<S>::peers_type *primary,
624608
625609template <class S > static ngx_int_t
626610ngx_dynamic_upstream_op_sync (typename TypeSelect<S>::peers_type *primary,
627- ngx_dynamic_upstream_op_t *op, ngx_slab_pool_t *shpool, ngx_log_t *log)
611+ ngx_dynamic_upstream_op_t *op, ngx_slab_pool_t *shpool,
612+ ngx_pool_t *temp_pool, ngx_log_t *log)
628613{
629614 typename TypeSelect<S>::peers_type *peers;
630615 typename TypeSelect<S>::peer_type *peer;
@@ -644,17 +629,7 @@ ngx_dynamic_upstream_op_sync(typename TypeSelect<S>::peers_type *primary,
644629
645630 op->hash = hash;
646631
647- ngx_pool_auto guard (log);
648-
649- if (guard.pool == NULL ) {
650-
651- op->status = NGX_HTTP_INTERNAL_SERVER_ERROR;
652- op->err = " no memory" ;
653-
654- return NGX_ERROR;
655- }
656-
657- servers = ngx_array_create (guard.pool , 100 , sizeof (ngx_server_t ));
632+ servers = ngx_array_create (temp_pool, 100 , sizeof (ngx_server_t ));
658633 if (servers == NULL ) {
659634
660635 op->status = NGX_HTTP_INTERNAL_SERVER_ERROR;
@@ -667,7 +642,7 @@ ngx_dynamic_upstream_op_sync(typename TypeSelect<S>::peers_type *primary,
667642
668643 if (ngx_dynamic_upstream_op_servers<S>(primary,
669644 servers,
670- guard. pool ,
645+ temp_pool ,
671646 &hash)
672647 == NGX_ERROR)
673648 {
@@ -682,7 +657,7 @@ ngx_dynamic_upstream_op_sync(typename TypeSelect<S>::peers_type *primary,
682657
683658 op->server = server[j].name ;
684659
685- if (ngx_dynamic_upstream_parse_url (&server[j].u , guard. pool ,
660+ if (ngx_dynamic_upstream_parse_url (&server[j].u , temp_pool ,
686661 op) != NGX_OK) {
687662
688663 ngx_log_error (NGX_LOG_WARN, log, 0 , " %V: server %V: %s" ,
@@ -750,8 +725,8 @@ ngx_dynamic_upstream_op_sync(typename TypeSelect<S>::peers_type *primary,
750725 op->server = peer->server ;
751726 op->name = peer->name ;
752727
753- if (ngx_dynamic_upstream_op_del<S>(primary, op, shpool, log)
754- == NGX_ERROR)
728+ if (ngx_dynamic_upstream_op_del<S>(primary, op, shpool,
729+ temp_pool, log) == NGX_ERROR)
755730 return NGX_ERROR;
756731
757732 count++;
@@ -909,7 +884,8 @@ ngx_dynamic_upstream_op_free_peer(ngx_slab_pool_t *shpool, PeerT *peer)
909884
910885template <class S > static ngx_int_t
911886ngx_dynamic_upstream_op_del (typename TypeSelect<S>::peers_type *primary,
912- ngx_dynamic_upstream_op_t *op, ngx_slab_pool_t *shpool, ngx_log_t *log)
887+ ngx_dynamic_upstream_op_t *op, ngx_slab_pool_t *shpool,
888+ ngx_pool_t *temp_pool, ngx_log_t *log)
913889{
914890 typename TypeSelect<S>::peers_type *peers, *backup = primary->next ;
915891 typename TypeSelect<S>::peer_type *peer, *deleted, *prev;
@@ -960,7 +936,7 @@ ngx_dynamic_upstream_op_del(typename TypeSelect<S>::peers_type *primary,
960936 add_op.down = 1 ;
961937
962938 if (ngx_dynamic_upstream_op_add<S>(primary, &add_op,
963- shpool, log) != NGX_OK) {
939+ shpool, temp_pool, log) != NGX_OK) {
964940
965941 op->err = add_op.err ;
966942 op->status = add_op.status ;
0 commit comments