perl termination fixes:

*) master exit hook is run before global pool cleanup, so call PERL_SYS_TERM()
   after perl_destruct()/perl_free().  This fixes the message
        panic: MUTEX_LOCK (22) [op.c:352]
   on some threaded perl builds

*) call perl_destruct()/perl_free() before PERL_SYS_TERM() for
   non-mulitiplicity perl
diff --git a/src/http/modules/perl/ngx_http_perl_module.c b/src/http/modules/perl/ngx_http_perl_module.c
index a546212..d57a9b1 100644
--- a/src/http/modules/perl/ngx_http_perl_module.c
+++ b/src/http/modules/perl/ngx_http_perl_module.c
@@ -154,10 +154,14 @@
 #endif
 
 
-static ngx_str_t  ngx_null_name = ngx_null_string;
+static ngx_str_t    ngx_null_name = ngx_null_string;
 
+static HV          *nginx_stash;
 
-static HV  *nginx_stash;
+#if (NGX_HAVE_PERL_MULTIPLICITY)
+static ngx_uint_t   ngx_perl_term;
+#endif
+
 
 static void
 ngx_http_perl_xs_init(pTHX)
@@ -821,6 +825,12 @@
     (void) perl_destruct(perl);
 
     perl_free(perl);
+
+    if (ngx_perl_term) {
+        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0, "perl term");
+
+        PERL_SYS_TERM();
+    }
 }
 
 #endif
@@ -1057,14 +1067,24 @@
 static void
 ngx_http_perl_exit(ngx_cycle_t *cycle)
 {
+#if (NGX_HAVE_PERL_MULTIPLICITY)
+
+    ngx_perl_term = 1;
+
+#else
     ngx_http_perl_main_conf_t  *pmcf;
 
     pmcf = ngx_http_cycle_get_module_main_conf(cycle, ngx_http_perl_module);
 
-    if (pmcf) {
-        dTHXa(pmcf->perl);
-        PERL_SET_CONTEXT(pmcf->perl);
+    if (pmcf && nginx_stash) {
+        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, cycle->log, 0, "perl term");
+
+        (void) perl_destruct(pmcf->perl);
+
+        perl_free(pmcf->perl);
 
         PERL_SYS_TERM();
     }
+
+#endif
 }