mirror of
https://github.com/openresty/openresty.git
synced 2024-10-13 00:29:41 +00:00
Compare commits
28 Commits
Author | SHA1 | Date | |
---|---|---|---|
458b8f5456 | |||
95e12baff4 | |||
843cb73393 | |||
1276fbdf48 | |||
5aa4947cb1 | |||
dd2d1d04b8 | |||
b255299212 | |||
a50e578d0e | |||
23d0222ed3 | |||
6e5f3ce9b5 | |||
6431074de4 | |||
2654f60c1b | |||
da11207dea | |||
5c208328e2 | |||
5e2df4bb9a | |||
106f9751e5 | |||
77e510abdc | |||
88272c5503 | |||
4004360b4c | |||
177e1bfcdf | |||
0bf8bbe040 | |||
8ba0a37a42 | |||
557f52794c | |||
b7e7398fc9 | |||
68aac430ae | |||
d2c3802134 | |||
918e884175 | |||
cbce5daa05 |
2
README
2
README
@ -11,7 +11,7 @@ The bundled software components are copyrighted by the respective copyright hold
|
||||
|
||||
The homepage for this project is http://openresty.org.
|
||||
|
||||
For the users:
|
||||
For users:
|
||||
Visit http://openresty.org/#Download to download the latest bundle tarball, and
|
||||
follow the installation instructions in the page http://openresty.org/#Installation.
|
||||
|
||||
|
241
misc/unwind-generic.h
Normal file
241
misc/unwind-generic.h
Normal file
@ -0,0 +1,241 @@
|
||||
/* Exception handling and frame unwind runtime interface routines.
|
||||
Copyright (C) 2001, 2003, 2004, 2006 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GCC.
|
||||
|
||||
GCC is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2, or (at your option)
|
||||
any later version.
|
||||
|
||||
GCC is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
||||
License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with GCC; see the file COPYING. If not, write to the Free
|
||||
Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
02110-1301, USA. */
|
||||
|
||||
/* As a special exception, if you include this header file into source
|
||||
files compiled by GCC, this header file does not by itself cause
|
||||
the resulting executable to be covered by the GNU General Public
|
||||
License. This exception does not however invalidate any other
|
||||
reasons why the executable file might be covered by the GNU General
|
||||
Public License. */
|
||||
|
||||
/* This is derived from the C++ ABI for IA-64. Where we diverge
|
||||
for cross-architecture compatibility are noted with "@@@". */
|
||||
|
||||
#ifndef _UNWIND_H
|
||||
#define _UNWIND_H
|
||||
|
||||
#ifndef HIDE_EXPORTS
|
||||
#pragma GCC visibility push(default)
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* Level 1: Base ABI */
|
||||
|
||||
/* @@@ The IA-64 ABI uses uint64 throughout. Most places this is
|
||||
inefficient for 32-bit and smaller machines. */
|
||||
typedef unsigned _Unwind_Word __attribute__((__mode__(__word__)));
|
||||
typedef signed _Unwind_Sword __attribute__((__mode__(__word__)));
|
||||
#if defined(__ia64__) && defined(__hpux__)
|
||||
typedef unsigned _Unwind_Ptr __attribute__((__mode__(__word__)));
|
||||
#else
|
||||
typedef unsigned _Unwind_Ptr __attribute__((__mode__(__pointer__)));
|
||||
#endif
|
||||
typedef unsigned _Unwind_Internal_Ptr __attribute__((__mode__(__pointer__)));
|
||||
|
||||
/* @@@ The IA-64 ABI uses a 64-bit word to identify the producer and
|
||||
consumer of an exception. We'll go along with this for now even on
|
||||
32-bit machines. We'll need to provide some other option for
|
||||
16-bit machines and for machines with > 8 bits per byte. */
|
||||
typedef unsigned _Unwind_Exception_Class __attribute__((__mode__(__DI__)));
|
||||
|
||||
/* The unwind interface uses reason codes in several contexts to
|
||||
identify the reasons for failures or other actions. */
|
||||
typedef enum
|
||||
{
|
||||
_URC_NO_REASON = 0,
|
||||
_URC_FOREIGN_EXCEPTION_CAUGHT = 1,
|
||||
_URC_FATAL_PHASE2_ERROR = 2,
|
||||
_URC_FATAL_PHASE1_ERROR = 3,
|
||||
_URC_NORMAL_STOP = 4,
|
||||
_URC_END_OF_STACK = 5,
|
||||
_URC_HANDLER_FOUND = 6,
|
||||
_URC_INSTALL_CONTEXT = 7,
|
||||
_URC_CONTINUE_UNWIND = 8
|
||||
} _Unwind_Reason_Code;
|
||||
|
||||
|
||||
/* The unwind interface uses a pointer to an exception header object
|
||||
as its representation of an exception being thrown. In general, the
|
||||
full representation of an exception object is language- and
|
||||
implementation-specific, but it will be prefixed by a header
|
||||
understood by the unwind interface. */
|
||||
|
||||
struct _Unwind_Exception;
|
||||
|
||||
typedef void (*_Unwind_Exception_Cleanup_Fn) (_Unwind_Reason_Code,
|
||||
struct _Unwind_Exception *);
|
||||
|
||||
struct _Unwind_Exception
|
||||
{
|
||||
_Unwind_Exception_Class exception_class;
|
||||
_Unwind_Exception_Cleanup_Fn exception_cleanup;
|
||||
_Unwind_Word private_1;
|
||||
_Unwind_Word private_2;
|
||||
|
||||
/* @@@ The IA-64 ABI says that this structure must be double-word aligned.
|
||||
Taking that literally does not make much sense generically. Instead we
|
||||
provide the maximum alignment required by any type for the machine. */
|
||||
} __attribute__((__aligned__));
|
||||
|
||||
|
||||
/* The ACTIONS argument to the personality routine is a bitwise OR of one
|
||||
or more of the following constants. */
|
||||
typedef int _Unwind_Action;
|
||||
|
||||
#define _UA_SEARCH_PHASE 1
|
||||
#define _UA_CLEANUP_PHASE 2
|
||||
#define _UA_HANDLER_FRAME 4
|
||||
#define _UA_FORCE_UNWIND 8
|
||||
#define _UA_END_OF_STACK 16
|
||||
|
||||
/* This is an opaque type used to refer to a system-specific data
|
||||
structure used by the system unwinder. This context is created and
|
||||
destroyed by the system, and passed to the personality routine
|
||||
during unwinding. */
|
||||
struct _Unwind_Context;
|
||||
|
||||
/* Raise an exception, passing along the given exception object. */
|
||||
extern _Unwind_Reason_Code _Unwind_RaiseException (struct _Unwind_Exception *);
|
||||
|
||||
/* Raise an exception for forced unwinding. */
|
||||
|
||||
typedef _Unwind_Reason_Code (*_Unwind_Stop_Fn)
|
||||
(int, _Unwind_Action, _Unwind_Exception_Class,
|
||||
struct _Unwind_Exception *, struct _Unwind_Context *, void *);
|
||||
|
||||
extern _Unwind_Reason_Code _Unwind_ForcedUnwind (struct _Unwind_Exception *,
|
||||
_Unwind_Stop_Fn,
|
||||
void *);
|
||||
|
||||
/* Helper to invoke the exception_cleanup routine. */
|
||||
extern void _Unwind_DeleteException (struct _Unwind_Exception *);
|
||||
|
||||
/* Resume propagation of an existing exception. This is used after
|
||||
e.g. executing cleanup code, and not to implement rethrowing. */
|
||||
extern void _Unwind_Resume (struct _Unwind_Exception *);
|
||||
|
||||
/* @@@ Resume propagation of an FORCE_UNWIND exception, or to rethrow
|
||||
a normal exception that was handled. */
|
||||
extern _Unwind_Reason_Code _Unwind_Resume_or_Rethrow (struct _Unwind_Exception *);
|
||||
|
||||
/* @@@ Use unwind data to perform a stack backtrace. The trace callback
|
||||
is called for every stack frame in the call chain, but no cleanup
|
||||
actions are performed. */
|
||||
typedef _Unwind_Reason_Code (*_Unwind_Trace_Fn)
|
||||
(struct _Unwind_Context *, void *);
|
||||
|
||||
extern _Unwind_Reason_Code _Unwind_Backtrace (_Unwind_Trace_Fn, void *);
|
||||
|
||||
/* These functions are used for communicating information about the unwind
|
||||
context (i.e. the unwind descriptors and the user register state) between
|
||||
the unwind library and the personality routine and landing pad. Only
|
||||
selected registers maybe manipulated. */
|
||||
|
||||
extern _Unwind_Word _Unwind_GetGR (struct _Unwind_Context *, int);
|
||||
extern void _Unwind_SetGR (struct _Unwind_Context *, int, _Unwind_Word);
|
||||
|
||||
extern _Unwind_Ptr _Unwind_GetIP (struct _Unwind_Context *);
|
||||
extern _Unwind_Ptr _Unwind_GetIPInfo (struct _Unwind_Context *, int *);
|
||||
extern void _Unwind_SetIP (struct _Unwind_Context *, _Unwind_Ptr);
|
||||
|
||||
/* @@@ Retrieve the CFA of the given context. */
|
||||
extern _Unwind_Word _Unwind_GetCFA (struct _Unwind_Context *);
|
||||
|
||||
extern void *_Unwind_GetLanguageSpecificData (struct _Unwind_Context *);
|
||||
|
||||
extern _Unwind_Ptr _Unwind_GetRegionStart (struct _Unwind_Context *);
|
||||
|
||||
|
||||
/* The personality routine is the function in the C++ (or other language)
|
||||
runtime library which serves as an interface between the system unwind
|
||||
library and language-specific exception handling semantics. It is
|
||||
specific to the code fragment described by an unwind info block, and
|
||||
it is always referenced via the pointer in the unwind info block, and
|
||||
hence it has no ABI-specified name.
|
||||
|
||||
Note that this implies that two different C++ implementations can
|
||||
use different names, and have different contents in the language
|
||||
specific data area. Moreover, that the language specific data
|
||||
area contains no version info because name of the function invoked
|
||||
provides more effective versioning by detecting at link time the
|
||||
lack of code to handle the different data format. */
|
||||
|
||||
typedef _Unwind_Reason_Code (*_Unwind_Personality_Fn)
|
||||
(int, _Unwind_Action, _Unwind_Exception_Class,
|
||||
struct _Unwind_Exception *, struct _Unwind_Context *);
|
||||
|
||||
/* @@@ The following alternate entry points are for setjmp/longjmp
|
||||
based unwinding. */
|
||||
|
||||
struct SjLj_Function_Context;
|
||||
extern void _Unwind_SjLj_Register (struct SjLj_Function_Context *);
|
||||
extern void _Unwind_SjLj_Unregister (struct SjLj_Function_Context *);
|
||||
|
||||
extern _Unwind_Reason_Code _Unwind_SjLj_RaiseException
|
||||
(struct _Unwind_Exception *);
|
||||
extern _Unwind_Reason_Code _Unwind_SjLj_ForcedUnwind
|
||||
(struct _Unwind_Exception *, _Unwind_Stop_Fn, void *);
|
||||
extern void _Unwind_SjLj_Resume (struct _Unwind_Exception *);
|
||||
extern _Unwind_Reason_Code _Unwind_SjLj_Resume_or_Rethrow (struct _Unwind_Exception *);
|
||||
|
||||
/* @@@ The following provide access to the base addresses for text
|
||||
and data-relative addressing in the LDSA. In order to stay link
|
||||
compatible with the standard ABI for IA-64, we inline these. */
|
||||
|
||||
#ifdef __ia64__
|
||||
#include <stdlib.h>
|
||||
|
||||
static inline _Unwind_Ptr
|
||||
_Unwind_GetDataRelBase (struct _Unwind_Context *_C)
|
||||
{
|
||||
/* The GP is stored in R1. */
|
||||
return _Unwind_GetGR (_C, 1);
|
||||
}
|
||||
|
||||
static inline _Unwind_Ptr
|
||||
_Unwind_GetTextRelBase (struct _Unwind_Context *_C __attribute__ ((__unused__)))
|
||||
{
|
||||
abort ();
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* @@@ Retrieve the Backing Store Pointer of the given context. */
|
||||
extern _Unwind_Word _Unwind_GetBSP (struct _Unwind_Context *);
|
||||
#else
|
||||
extern _Unwind_Ptr _Unwind_GetDataRelBase (struct _Unwind_Context *);
|
||||
extern _Unwind_Ptr _Unwind_GetTextRelBase (struct _Unwind_Context *);
|
||||
#endif
|
||||
|
||||
/* @@@ Given an address, return the entry point of the function that
|
||||
contains it. */
|
||||
extern void * _Unwind_FindEnclosingFunction (void *pc);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef HIDE_EXPORTS
|
||||
#pragma GCC visibility pop
|
||||
#endif
|
||||
|
||||
#endif /* unwind.h */
|
483
patches/nginx-1.0.4-no_pool.patch
Normal file
483
patches/nginx-1.0.4-no_pool.patch
Normal file
@ -0,0 +1,483 @@
|
||||
diff -ur nginx-1.0.4/src/core/nginx.h nginx-1.0.4-no-pool/src/core/nginx.h
|
||||
--- nginx-1.0.4/src/core/nginx.h 2011-05-26 15:31:40.000000000 +0800
|
||||
+++ nginx-1.0.4-no-pool/src/core/nginx.h 2011-06-30 17:00:43.540946999 +0800
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
#define nginx_version 1000004
|
||||
#define NGINX_VERSION "1.0.4"
|
||||
-#define NGINX_VER "ngx_openresty/" NGINX_VERSION ".unknown"
|
||||
+#define NGINX_VER "ngx_openresty/" NGINX_VERSION ".unknown (no pool)"
|
||||
|
||||
#define NGINX_VAR "NGINX"
|
||||
#define NGX_OLDPID_EXT ".oldbin"
|
||||
diff -ur nginx-1.0.4/src/core/ngx_array.c nginx-1.0.4-no-pool/src/core/ngx_array.c
|
||||
--- nginx-1.0.4/src/core/ngx_array.c 2008-06-17 23:00:30.000000000 +0800
|
||||
+++ nginx-1.0.4-no-pool/src/core/ngx_array.c 2011-06-30 17:00:43.540946999 +0800
|
||||
@@ -39,13 +39,7 @@
|
||||
|
||||
p = a->pool;
|
||||
|
||||
- if ((u_char *) a->elts + a->size * a->nalloc == p->d.last) {
|
||||
- p->d.last -= a->size * a->nalloc;
|
||||
- }
|
||||
-
|
||||
- if ((u_char *) a + sizeof(ngx_array_t) == p->d.last) {
|
||||
- p->d.last = (u_char *) a;
|
||||
- }
|
||||
+ ngx_pfree(p, a);
|
||||
}
|
||||
|
||||
|
||||
@@ -64,29 +58,17 @@
|
||||
|
||||
p = a->pool;
|
||||
|
||||
- if ((u_char *) a->elts + size == p->d.last
|
||||
- && p->d.last + a->size <= p->d.end)
|
||||
- {
|
||||
- /*
|
||||
- * the array allocation is the last in the pool
|
||||
- * and there is space for new allocation
|
||||
- */
|
||||
-
|
||||
- p->d.last += a->size;
|
||||
- a->nalloc++;
|
||||
-
|
||||
- } else {
|
||||
- /* allocate a new array */
|
||||
-
|
||||
- new = ngx_palloc(p, 2 * size);
|
||||
- if (new == NULL) {
|
||||
- return NULL;
|
||||
- }
|
||||
-
|
||||
- ngx_memcpy(new, a->elts, size);
|
||||
- a->elts = new;
|
||||
- a->nalloc *= 2;
|
||||
+ /* allocate a new array */
|
||||
+
|
||||
+ new = ngx_palloc(p, 2 * size);
|
||||
+ if (new == NULL) {
|
||||
+ return NULL;
|
||||
}
|
||||
+
|
||||
+ ngx_memcpy(new, a->elts, size);
|
||||
+ a->elts = new;
|
||||
+ a->nalloc *= 2;
|
||||
+
|
||||
}
|
||||
|
||||
elt = (u_char *) a->elts + a->size * a->nelts;
|
||||
@@ -112,31 +94,16 @@
|
||||
|
||||
p = a->pool;
|
||||
|
||||
- if ((u_char *) a->elts + a->size * a->nalloc == p->d.last
|
||||
- && p->d.last + size <= p->d.end)
|
||||
- {
|
||||
- /*
|
||||
- * the array allocation is the last in the pool
|
||||
- * and there is space for new allocation
|
||||
- */
|
||||
-
|
||||
- p->d.last += size;
|
||||
- a->nalloc += n;
|
||||
-
|
||||
- } else {
|
||||
- /* allocate a new array */
|
||||
-
|
||||
- nalloc = 2 * ((n >= a->nalloc) ? n : a->nalloc);
|
||||
-
|
||||
- new = ngx_palloc(p, nalloc * a->size);
|
||||
- if (new == NULL) {
|
||||
- return NULL;
|
||||
- }
|
||||
-
|
||||
- ngx_memcpy(new, a->elts, a->nelts * a->size);
|
||||
- a->elts = new;
|
||||
- a->nalloc = nalloc;
|
||||
+ nalloc = 2 * ((n >= a->nalloc) ? n : a->nalloc);
|
||||
+
|
||||
+ new = ngx_palloc(p, nalloc * a->size);
|
||||
+ if (new == NULL) {
|
||||
+ return NULL;
|
||||
}
|
||||
+
|
||||
+ ngx_memcpy(new, a->elts, a->nelts * a->size);
|
||||
+ a->elts = new;
|
||||
+ a->nalloc = nalloc;
|
||||
}
|
||||
|
||||
elt = (u_char *) a->elts + a->size * a->nelts;
|
||||
diff -ur nginx-1.0.4/src/core/ngx_palloc.c nginx-1.0.4-no-pool/src/core/ngx_palloc.c
|
||||
--- nginx-1.0.4/src/core/ngx_palloc.c 2009-12-17 20:25:46.000000000 +0800
|
||||
+++ nginx-1.0.4-no-pool/src/core/ngx_palloc.c 2011-06-30 17:06:36.060946999 +0800
|
||||
@@ -8,24 +8,31 @@
|
||||
#include <ngx_core.h>
|
||||
|
||||
|
||||
-static void *ngx_palloc_block(ngx_pool_t *pool, size_t size);
|
||||
static void *ngx_palloc_large(ngx_pool_t *pool, size_t size);
|
||||
|
||||
|
||||
ngx_pool_t *
|
||||
ngx_create_pool(size_t size, ngx_log_t *log)
|
||||
{
|
||||
- ngx_pool_t *p;
|
||||
+ ngx_pool_t *p;
|
||||
+ ngx_pool_data_t *d;
|
||||
|
||||
- p = ngx_memalign(NGX_POOL_ALIGNMENT, size, log);
|
||||
+ size = sizeof(ngx_pool_t);
|
||||
+ p = ngx_alloc(size, log);
|
||||
if (p == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
- p->d.last = (u_char *) p + sizeof(ngx_pool_t);
|
||||
- p->d.end = (u_char *) p + size;
|
||||
- p->d.next = NULL;
|
||||
- p->d.failed = 0;
|
||||
+ d = ngx_alloc(sizeof(ngx_pool_data_t), log);
|
||||
+
|
||||
+ if (d == NULL) {
|
||||
+ return NULL;
|
||||
+ }
|
||||
+
|
||||
+ d->next = d;
|
||||
+ d->prev = d;
|
||||
+ d->alloc = NULL;
|
||||
+ p->d = d;
|
||||
|
||||
size = size - sizeof(ngx_pool_t);
|
||||
p->max = (size < NGX_MAX_ALLOC_FROM_POOL) ? size : NGX_MAX_ALLOC_FROM_POOL;
|
||||
@@ -43,7 +50,7 @@
|
||||
void
|
||||
ngx_destroy_pool(ngx_pool_t *pool)
|
||||
{
|
||||
- ngx_pool_t *p, *n;
|
||||
+ ngx_pool_data_t *d, *n;
|
||||
ngx_pool_large_t *l;
|
||||
ngx_pool_cleanup_t *c;
|
||||
|
||||
@@ -55,7 +62,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
- for (l = pool->large; l; l = l->next) {
|
||||
+ for (l = pool->large; l ; l = l->next) {
|
||||
|
||||
ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0, "free: %p", l->alloc);
|
||||
|
||||
@@ -71,34 +78,45 @@
|
||||
* so we can not use this log while the free()ing the pool
|
||||
*/
|
||||
|
||||
- for (p = pool, n = pool->d.next; /* void */; p = n, n = n->d.next) {
|
||||
+ for (d = pool->d, n = d->next; ; d = n, n = n->next) {
|
||||
ngx_log_debug2(NGX_LOG_DEBUG_ALLOC, pool->log, 0,
|
||||
- "free: %p, unused: %uz", p, p->d.end - p->d.last);
|
||||
+ "free: %p", d);
|
||||
|
||||
- if (n == NULL) {
|
||||
+ if (n == pool->d) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
+ if (pool->d->next == pool->d) {
|
||||
+ ngx_free(pool->d);
|
||||
+ } else {
|
||||
+ for (d = pool->d, n = d->next; ; d = n, n = n->next) {
|
||||
+ if (d->alloc) {
|
||||
+ ngx_free(d->alloc);
|
||||
+ }
|
||||
+ ngx_free(d);
|
||||
|
||||
- for (p = pool, n = pool->d.next; /* void */; p = n, n = n->d.next) {
|
||||
- ngx_free(p);
|
||||
-
|
||||
- if (n == NULL) {
|
||||
- break;
|
||||
+ if (n == pool->d) {
|
||||
+ break;
|
||||
+ }
|
||||
}
|
||||
}
|
||||
+
|
||||
+ ngx_free(pool);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
ngx_reset_pool(ngx_pool_t *pool)
|
||||
{
|
||||
- ngx_pool_t *p;
|
||||
- ngx_pool_large_t *l;
|
||||
+ ngx_pool_data_t *p, *tmp;
|
||||
+ ngx_pool_large_t *l;
|
||||
+
|
||||
+ for (l = pool->large; l ; l = l->next) {
|
||||
+
|
||||
+ ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0, "free: %p", l->alloc);
|
||||
|
||||
- for (l = pool->large; l; l = l->next) {
|
||||
if (l->alloc) {
|
||||
ngx_free(l->alloc);
|
||||
}
|
||||
@@ -106,109 +124,65 @@
|
||||
|
||||
pool->large = NULL;
|
||||
|
||||
- for (p = pool; p; p = p->d.next) {
|
||||
- p->d.last = (u_char *) p + sizeof(ngx_pool_t);
|
||||
+ p = pool->d->next;
|
||||
+ while (p != pool->d) {
|
||||
+ tmp = p;
|
||||
+ ngx_free(p->alloc);
|
||||
+ p->prev->next = p->next;
|
||||
+ p->next->prev = p->prev;
|
||||
+ p = p->next;
|
||||
+ ngx_free(tmp);
|
||||
}
|
||||
-}
|
||||
|
||||
+ ngx_free(pool->d->alloc);
|
||||
+ pool->d->alloc = NULL;
|
||||
+
|
||||
+}
|
||||
|
||||
void *
|
||||
-ngx_palloc(ngx_pool_t *pool, size_t size)
|
||||
+ngx_malloc(ngx_pool_t *pool, size_t size)
|
||||
{
|
||||
- u_char *m;
|
||||
- ngx_pool_t *p;
|
||||
-
|
||||
- if (size <= pool->max) {
|
||||
+ ngx_pool_data_t *new;
|
||||
+ void *m;
|
||||
|
||||
- p = pool->current;
|
||||
-
|
||||
- do {
|
||||
- m = ngx_align_ptr(p->d.last, NGX_ALIGNMENT);
|
||||
-
|
||||
- if ((size_t) (p->d.end - m) >= size) {
|
||||
- p->d.last = m + size;
|
||||
-
|
||||
- return m;
|
||||
- }
|
||||
-
|
||||
- p = p->d.next;
|
||||
-
|
||||
- } while (p);
|
||||
+ m = ngx_alloc(size, pool->log);
|
||||
+ if (m == NULL) {
|
||||
+ return NULL;
|
||||
+ }
|
||||
|
||||
- return ngx_palloc_block(pool, size);
|
||||
+ new = ngx_alloc(sizeof(ngx_pool_data_t), pool->log);
|
||||
+ if (new == NULL){
|
||||
+ ngx_free(m);
|
||||
+ return NULL;
|
||||
}
|
||||
|
||||
- return ngx_palloc_large(pool, size);
|
||||
+ new->alloc = m;
|
||||
+ new->next = pool->d;
|
||||
+ new->prev = pool->d->prev;
|
||||
+ pool->d->prev->next = new;
|
||||
+ pool->d->prev = new;
|
||||
+ return m;
|
||||
}
|
||||
|
||||
-
|
||||
void *
|
||||
-ngx_pnalloc(ngx_pool_t *pool, size_t size)
|
||||
+ngx_palloc(ngx_pool_t *pool, size_t size)
|
||||
{
|
||||
- u_char *m;
|
||||
- ngx_pool_t *p;
|
||||
-
|
||||
- if (size <= pool->max) {
|
||||
-
|
||||
- p = pool->current;
|
||||
-
|
||||
- do {
|
||||
- m = p->d.last;
|
||||
-
|
||||
- if ((size_t) (p->d.end - m) >= size) {
|
||||
- p->d.last = m + size;
|
||||
-
|
||||
- return m;
|
||||
- }
|
||||
-
|
||||
- p = p->d.next;
|
||||
-
|
||||
- } while (p);
|
||||
-
|
||||
- return ngx_palloc_block(pool, size);
|
||||
+ if (size <= 1024) {
|
||||
+ return ngx_malloc(pool, size);
|
||||
}
|
||||
|
||||
return ngx_palloc_large(pool, size);
|
||||
}
|
||||
|
||||
|
||||
-static void *
|
||||
-ngx_palloc_block(ngx_pool_t *pool, size_t size)
|
||||
+void *
|
||||
+ngx_pnalloc(ngx_pool_t *pool, size_t size)
|
||||
{
|
||||
- u_char *m;
|
||||
- size_t psize;
|
||||
- ngx_pool_t *p, *new, *current;
|
||||
-
|
||||
- psize = (size_t) (pool->d.end - (u_char *) pool);
|
||||
-
|
||||
- m = ngx_memalign(NGX_POOL_ALIGNMENT, psize, pool->log);
|
||||
- if (m == NULL) {
|
||||
- return NULL;
|
||||
+ if (size <= 1024) {
|
||||
+ return ngx_malloc(pool, size);
|
||||
}
|
||||
|
||||
- new = (ngx_pool_t *) m;
|
||||
-
|
||||
- new->d.end = m + psize;
|
||||
- new->d.next = NULL;
|
||||
- new->d.failed = 0;
|
||||
-
|
||||
- m += sizeof(ngx_pool_data_t);
|
||||
- m = ngx_align_ptr(m, NGX_ALIGNMENT);
|
||||
- new->d.last = m + size;
|
||||
-
|
||||
- current = pool->current;
|
||||
-
|
||||
- for (p = current; p->d.next; p = p->d.next) {
|
||||
- if (p->d.failed++ > 4) {
|
||||
- current = p->d.next;
|
||||
- }
|
||||
- }
|
||||
-
|
||||
- p->d.next = new;
|
||||
-
|
||||
- pool->current = current ? current : new;
|
||||
-
|
||||
- return m;
|
||||
+ return ngx_palloc_large(pool, size);
|
||||
}
|
||||
|
||||
|
||||
@@ -226,18 +200,7 @@
|
||||
|
||||
n = 0;
|
||||
|
||||
- for (large = pool->large; large; large = large->next) {
|
||||
- if (large->alloc == NULL) {
|
||||
- large->alloc = p;
|
||||
- return p;
|
||||
- }
|
||||
-
|
||||
- if (n++ > 3) {
|
||||
- break;
|
||||
- }
|
||||
- }
|
||||
-
|
||||
- large = ngx_palloc(pool, sizeof(ngx_pool_large_t));
|
||||
+ large = ngx_malloc(pool, sizeof(ngx_pool_large_t));
|
||||
if (large == NULL) {
|
||||
ngx_free(p);
|
||||
return NULL;
|
||||
@@ -262,7 +225,7 @@
|
||||
return NULL;
|
||||
}
|
||||
|
||||
- large = ngx_palloc(pool, sizeof(ngx_pool_large_t));
|
||||
+ large = ngx_malloc(pool, sizeof(ngx_pool_large_t));
|
||||
if (large == NULL) {
|
||||
ngx_free(p);
|
||||
return NULL;
|
||||
@@ -279,17 +242,41 @@
|
||||
ngx_int_t
|
||||
ngx_pfree(ngx_pool_t *pool, void *p)
|
||||
{
|
||||
- ngx_pool_large_t *l;
|
||||
+ ngx_pool_large_t *l;
|
||||
+ ngx_pool_large_t *ll;
|
||||
+ ngx_pool_data_t *d, *n;
|
||||
|
||||
- for (l = pool->large; l; l = l->next) {
|
||||
+ for (l = pool->large, ll = l; l; ll = l, l = l->next) {
|
||||
if (p == l->alloc) {
|
||||
ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0,
|
||||
"free: %p", l->alloc);
|
||||
ngx_free(l->alloc);
|
||||
l->alloc = NULL;
|
||||
+ if (l == pool->large) {
|
||||
+ pool->large = NULL;
|
||||
+ }
|
||||
+
|
||||
+ ll->next = l->next;
|
||||
+ p = l;
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
|
||||
+ for (d = pool->d, n = d->next; ; d = n, n = d->next) {
|
||||
+ if (p == d->alloc) {
|
||||
+ ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0, "free: %p", d->alloc);
|
||||
+ if (d->alloc) {
|
||||
+ ngx_free(d->alloc);
|
||||
+ }
|
||||
+ d->alloc = NULL;
|
||||
+ d->prev->next = d->next;
|
||||
+ d->next->prev = d->prev;
|
||||
+ ngx_free(d);
|
||||
return NGX_OK;
|
||||
}
|
||||
+ if (d->next == pool->d) {
|
||||
+ break;
|
||||
+ }
|
||||
}
|
||||
|
||||
return NGX_DECLINED;
|
||||
Only in nginx-1.0.4-no-pool/src/core: ngx_palloc.c~
|
||||
diff -ur nginx-1.0.4/src/core/ngx_palloc.h nginx-1.0.4-no-pool/src/core/ngx_palloc.h
|
||||
--- nginx-1.0.4/src/core/ngx_palloc.h 2009-12-17 20:25:46.000000000 +0800
|
||||
+++ nginx-1.0.4-no-pool/src/core/ngx_palloc.h 2011-06-30 17:00:43.540946999 +0800
|
||||
@@ -38,6 +38,7 @@
|
||||
|
||||
|
||||
typedef struct ngx_pool_large_s ngx_pool_large_t;
|
||||
+typedef struct ngx_pool_data_s ngx_pool_data_t;
|
||||
|
||||
struct ngx_pool_large_s {
|
||||
ngx_pool_large_t *next;
|
||||
@@ -45,16 +46,15 @@
|
||||
};
|
||||
|
||||
|
||||
-typedef struct {
|
||||
- u_char *last;
|
||||
- u_char *end;
|
||||
- ngx_pool_t *next;
|
||||
- ngx_uint_t failed;
|
||||
-} ngx_pool_data_t;
|
||||
+struct ngx_pool_data_s{
|
||||
+ ngx_pool_data_t *next;
|
||||
+ ngx_pool_data_t *prev;
|
||||
+ void *alloc;
|
||||
+};
|
||||
|
||||
|
||||
struct ngx_pool_s {
|
||||
- ngx_pool_data_t d;
|
||||
+ ngx_pool_data_t *d;
|
||||
size_t max;
|
||||
ngx_pool_t *current;
|
||||
ngx_chain_t *chain;
|
@ -5,8 +5,8 @@
|
||||
# Parent 610e909bb9e29766188aa86fae3abe0bd3432940
|
||||
Core: fix body if it's preread and there are extra data.
|
||||
|
||||
--- nginx-0.8.54/src/http/ngx_http_request_body.c 2011-07-05 12:11:21.619264633 +0800
|
||||
+++ nginx-0.8.54-patched/src/http/ngx_http_request_body.c 2011-07-05 12:14:30.694321554 +0800
|
||||
--- nginx-1.0.4/src/http/ngx_http_request_body.c 2011-07-05 12:11:21.619264633 +0800
|
||||
+++ nginx-1.0.4-patched/src/http/ngx_http_request_body.c 2011-07-05 12:14:30.694321554 +0800
|
||||
@@ -141,6 +141,7 @@
|
||||
|
||||
/* the whole request body was pre-read */
|
||||
|
922
t/sanity.t
922
t/sanity.t
File diff suppressed because it is too large
Load Diff
219
util/configure
vendored
219
util/configure
vendored
@ -14,6 +14,9 @@ sub usage ($);
|
||||
|
||||
my (@make_cmds, @make_install_cmds);
|
||||
|
||||
my $root_dir = `pwd`;
|
||||
chomp $root_dir;
|
||||
|
||||
my $OS = $^O;
|
||||
|
||||
my $ngx_dir;
|
||||
@ -51,10 +54,10 @@ if ($OS =~ /solaris|sunos/i) {
|
||||
}
|
||||
|
||||
my @modules = (
|
||||
[ndk => 'ngx_devel_kit'],
|
||||
[http_iconv => 'iconv-nginx-module', 'disabled'],
|
||||
[http_echo => 'echo-nginx-module'],
|
||||
[http_xss => 'xss-nginx-module'],
|
||||
[ndk => 'ngx_devel_kit'],
|
||||
[http_set_misc => 'set-misc-nginx-module'],
|
||||
[http_form_input => 'form-input-nginx-module'],
|
||||
[http_encrypted_session => 'encrypted-session-nginx-module'],
|
||||
@ -105,17 +108,29 @@ my $prefix = '/usr/local/openresty';
|
||||
my %resty_opts;
|
||||
my $dry_run;
|
||||
my @ngx_rpaths;
|
||||
my $cc;
|
||||
|
||||
my (@ngx_opts, @ngx_cc_opts, @ngx_ld_opts);
|
||||
|
||||
for my $opt (@ARGV) {
|
||||
next unless defined $opt;
|
||||
|
||||
if ($opt =~ /^--with-cc=(.+)/) {
|
||||
$cc = $1;
|
||||
push @ngx_opts, $opt;
|
||||
next;
|
||||
}
|
||||
|
||||
if ($opt eq '--dry-run') {
|
||||
$dry_run = 1;
|
||||
next;
|
||||
}
|
||||
|
||||
if ($opt =~ /^--with-make=(.*)/) {
|
||||
$resty_opts{make} = $1;
|
||||
next;
|
||||
}
|
||||
|
||||
if ($opt =~ /^--prefix=(.*)/) {
|
||||
$prefix = $1;
|
||||
|
||||
@ -150,6 +165,23 @@ for my $opt (@ARGV) {
|
||||
} elsif ($opt =~ /^--with-libdrizzle=(.*)/) {
|
||||
$resty_opts{libdrizzle} = $1;
|
||||
|
||||
} elsif ($opt =~ /^--with-libpq=(.*)/) {
|
||||
$resty_opts{libpq} = $1;
|
||||
if ($resty_opts{pg_config}) {
|
||||
die "--with-libpq is not allowed when ",
|
||||
"--with-pg_config is already specified.\n";
|
||||
}
|
||||
|
||||
} elsif ($opt =~ /^--with-pg_config=(.*)/) {
|
||||
$resty_opts{pg_config} = $1;
|
||||
if ($resty_opts{libpq}) {
|
||||
die "--with-pg_config is not allowed when ",
|
||||
"--with-libpq is already specified.\n";
|
||||
}
|
||||
|
||||
} elsif ($opt eq '--with-no-pool-patch') {
|
||||
$resty_opts{no_pool} = 1;
|
||||
|
||||
} elsif ($opt eq '--with-http_ssl_module') {
|
||||
$resty_opts{http_ssl} = 1;
|
||||
push @ngx_opts, $opt;
|
||||
@ -169,6 +201,8 @@ print "platform: $platform ($OS)\n";
|
||||
|
||||
my $ngx_prefix = "$prefix/nginx";
|
||||
|
||||
my $postamble = '';
|
||||
|
||||
my $resty_opts = build_resty_opts(\%resty_opts);
|
||||
|
||||
if (@ngx_rpaths) {
|
||||
@ -188,10 +222,10 @@ my $cmd = "./configure --prefix=$ngx_prefix"
|
||||
|
||||
shell $cmd, $dry_run;
|
||||
|
||||
push @make_cmds, "cd build/$ngx_dir && "
|
||||
push @make_cmds, "cd $root_dir/build/$ngx_dir && "
|
||||
. "\$(MAKE)";
|
||||
|
||||
push @make_install_cmds, "cd build/$ngx_dir && "
|
||||
push @make_install_cmds, "cd $root_dir/build/$ngx_dir && "
|
||||
. "\$(MAKE) install DESTDIR=\$(DESTDIR)";
|
||||
|
||||
cd '../..'; # to the root
|
||||
@ -199,6 +233,10 @@ cd '../..'; # to the root
|
||||
|
||||
gen_makefile();
|
||||
|
||||
if ($postamble) {
|
||||
print $postamble;
|
||||
}
|
||||
|
||||
sub env ($$) {
|
||||
my ($name, $val) = @_;
|
||||
print "export $name='$val'\n";
|
||||
@ -237,6 +275,40 @@ sub cd ($) {
|
||||
sub build_resty_opts {
|
||||
my $opts = shift;
|
||||
|
||||
my $make;
|
||||
|
||||
if ($opts->{make}) {
|
||||
$make = $opts->{make};
|
||||
if (! can_run($make)) {
|
||||
die "make utility $make cannot be run.\n";
|
||||
}
|
||||
|
||||
} else {
|
||||
if (can_run("gmake")) {
|
||||
$make = 'gmake';
|
||||
|
||||
} else {
|
||||
# no gmake found
|
||||
|
||||
if ($platform =~ /bsd/i && $opts->{luajit}) {
|
||||
die "you need to install gmake to build LuaJIT.\n";
|
||||
}
|
||||
|
||||
if (can_run("make")) {
|
||||
$make = "make";
|
||||
|
||||
} else {
|
||||
die "No gmake nor make found in PATH.\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$postamble .= <<"_END_";
|
||||
Type the following commands to build and install:
|
||||
$make
|
||||
$make install
|
||||
_END_
|
||||
|
||||
if ($opts->{no_ndk}) {
|
||||
for my $name (qw(lua set_misc iconv lz_session form_input array_var)) {
|
||||
if (! $opts->{"no_http_$name"}) {
|
||||
@ -264,6 +336,14 @@ sub build_resty_opts {
|
||||
die "The http_drizzle_module is not enabled while --with-libdrizzle is specified.\n";
|
||||
}
|
||||
|
||||
if (! $opts->{http_postgres} && $opts->{libpq}) {
|
||||
die "The http_postgres_module is not enabled while --with-libpq is specified.\n";
|
||||
}
|
||||
|
||||
if (! $opts->{http_postgres} && $opts->{pg_config}) {
|
||||
die "The http_postgres_module is not enabled while --with-pg_config is specified.\n";
|
||||
}
|
||||
|
||||
if ($platform eq 'linux' && $opts->{luajit} && ! can_run("ldconfig")) {
|
||||
die "you need to have ldconfig in your PATH env when enabling luajit.\n";
|
||||
}
|
||||
@ -275,10 +355,12 @@ sub build_resty_opts {
|
||||
$opts_line .= " \\\n --with-debug";
|
||||
|
||||
} else {
|
||||
unshift @ngx_cc_opts, '-O2';
|
||||
#unshift @ngx_cc_opts, '-O2';
|
||||
}
|
||||
|
||||
$opts_line .= " \\\n --with-cc-opt='@ngx_cc_opts'";
|
||||
if (@ngx_cc_opts) {
|
||||
$opts_line .= " \\\n --with-cc-opt='@ngx_cc_opts'";
|
||||
}
|
||||
|
||||
if (-d 'build') {
|
||||
system("rm -rf build");
|
||||
@ -294,13 +376,52 @@ sub build_resty_opts {
|
||||
|
||||
# build 3rd-party C libraries if required
|
||||
|
||||
if ($opts->{no_pool}) {
|
||||
if (! can_run("patch")) {
|
||||
die "no \"patch\" utility found in your PATH environment.\n";
|
||||
}
|
||||
|
||||
shell "patch -p0 < nginx-no_pool.patch";
|
||||
}
|
||||
|
||||
if (my $drizzle_prefix = $opts->{libdrizzle}) {
|
||||
my $drizzle_lib = "$drizzle_prefix/lib";
|
||||
env LIBDRIZZLE_LIB => "$drizzle_prefix/lib";
|
||||
env LIBDRIZZLE_LIB => $drizzle_lib;
|
||||
env LIBDRIZZLE_INC => "$drizzle_prefix/include/libdrizzle-1.0";
|
||||
push @ngx_rpaths, $drizzle_lib;
|
||||
}
|
||||
|
||||
if (my $pg_prefix = $opts->{libpq}) {
|
||||
my $pg_lib = "$pg_prefix/lib";
|
||||
env LIBPQ_LIB => $pg_lib;
|
||||
env LIBPQ_INC => "$pg_prefix/include";
|
||||
push @ngx_rpaths, $pg_lib;
|
||||
}
|
||||
|
||||
if (my $pg_config = $opts->{pg_config}) {
|
||||
if (!can_run($pg_config)) {
|
||||
die "pg_config is not runnable.\n";
|
||||
}
|
||||
|
||||
my $cmd = "$pg_config --libdir";
|
||||
my $pg_lib = `$cmd`;
|
||||
chomp $pg_lib;
|
||||
if (!defined $pg_lib) {
|
||||
die "Failed to run command $cmd\n";
|
||||
}
|
||||
|
||||
$cmd = "$pg_config --includedir";
|
||||
my $pg_inc = `$cmd`;
|
||||
chomp $pg_inc;
|
||||
if (!defined $pg_inc) {
|
||||
die "Failed to run command $cmd\n";
|
||||
}
|
||||
|
||||
env LIBPQ_LIB => $pg_lib;
|
||||
env LIBPQ_INC => $pg_inc;
|
||||
push @ngx_rpaths, $pg_lib;
|
||||
}
|
||||
|
||||
if ($opts->{luajit}) {
|
||||
my $luajit_src = auto_complete 'LuaJIT';
|
||||
my $luajit_prefix = "$prefix/luajit";
|
||||
@ -315,14 +436,34 @@ sub build_resty_opts {
|
||||
|
||||
cd $luajit_src;
|
||||
|
||||
shell "make PREFIX=$luajit_prefix", $dry_run;
|
||||
shell "make install PREFIX=$luajit_prefix DESTDIR=$luajit_root", $dry_run;
|
||||
my $extra_opts = ' TARGET_STRIP=@:';
|
||||
|
||||
push @make_cmds, "cd build/$luajit_src && "
|
||||
. "\$(MAKE) PREFIX=$luajit_prefix";
|
||||
if ($opts->{debug}) {
|
||||
$extra_opts = ' CCDEBUG=-g Q=';
|
||||
}
|
||||
|
||||
push @make_install_cmds, "cd build/$luajit_src && "
|
||||
. "\$(MAKE) install PREFIX=$luajit_prefix DESTDIR=\$(DESTDIR)";
|
||||
if ($platform =~ /bsd/i) {
|
||||
$extra_opts .= ' CFLAGS=-I..';
|
||||
}
|
||||
|
||||
if ($on_solaris) {
|
||||
$extra_opts .= " INSTALL_X='$root_dir/build/install -m 0755' " .
|
||||
"INSTALL_F='$root_dir/build/install -m 0644'";
|
||||
}
|
||||
|
||||
if (defined $cc) {
|
||||
$extra_opts .= " CC=$cc";
|
||||
}
|
||||
|
||||
shell "${make}$extra_opts PREFIX=$luajit_prefix", $dry_run;
|
||||
|
||||
shell "${make} install$extra_opts PREFIX=$luajit_prefix DESTDIR=$luajit_root", $dry_run;
|
||||
|
||||
push @make_cmds, "cd $root_dir/build/$luajit_src && "
|
||||
. "\$(MAKE)$extra_opts PREFIX=$luajit_prefix";
|
||||
|
||||
push @make_install_cmds, "cd $root_dir/build/$luajit_src && "
|
||||
. "\$(MAKE) install$extra_opts PREFIX=$luajit_prefix DESTDIR=\$(DESTDIR)";
|
||||
|
||||
env LUAJIT_LIB => "$luajit_root$luajit_prefix/lib";
|
||||
env LUAJIT_INC => "$luajit_root$luajit_prefix/include/luajit-2.0";
|
||||
@ -352,16 +493,21 @@ sub build_resty_opts {
|
||||
|
||||
cd $lua_src;
|
||||
|
||||
shell "make $platform", $dry_run;
|
||||
shell "make install INSTALL_TOP=$lua_root$lua_prefix", $dry_run;
|
||||
my $extra_opts = '';
|
||||
if (defined $cc) {
|
||||
$extra_opts .= " CC=$cc";
|
||||
}
|
||||
|
||||
shell "${make}$extra_opts $platform", $dry_run;
|
||||
shell "${make} install$extra_opts INSTALL_TOP=$lua_root$lua_prefix", $dry_run;
|
||||
|
||||
env LUA_LIB => "$lua_root$lua_prefix/lib";
|
||||
env LUA_INC => "$lua_root$lua_prefix/include";
|
||||
|
||||
push @make_cmds, "cd build/$lua_src && \$(MAKE) $platform";
|
||||
push @make_cmds, "cd $root_dir/build/$lua_src && \$(MAKE)$extra_opts $platform";
|
||||
|
||||
push @make_install_cmds, "cd build/$lua_src && "
|
||||
. "\$(MAKE) install INSTALL_TOP=\$(DESTDIR)$lua_prefix";
|
||||
push @make_install_cmds, "cd $root_dir/build/$lua_src && "
|
||||
. "\$(MAKE) install$extra_opts INSTALL_TOP=\$(DESTDIR)$lua_prefix";
|
||||
|
||||
cd '..';
|
||||
}
|
||||
@ -397,7 +543,10 @@ sub usage ($) {
|
||||
|
||||
--prefix=PATH set the installation prefix
|
||||
|
||||
--with-debug enable the debugging logging and also enable -O0
|
||||
--with-debug enable the debugging logging and also enable -O0 -g for gcc.
|
||||
this not only affects nginx, but also other components.
|
||||
|
||||
--with-no-pool-patch enable the no-pool patch for debugging memory issues.
|
||||
|
||||
_EOC_
|
||||
|
||||
@ -455,7 +604,9 @@ _EOC_
|
||||
|
||||
--without-lua51 disable the bundled Lua 5.1 interpreter
|
||||
--with-luajit enable LuaJIT 2.0
|
||||
--with-libdrizzle=DIR specify the libdrizzle 1.0 installation prefix
|
||||
--with-libdrizzle=DIR specify the libdrizzle 1.0 (or drizzle) installation prefix
|
||||
--with-libpq=DIR specify the libpq (or postgresql) installation prefix
|
||||
--with-pg_config=PATH specify the path of the pg_config utility
|
||||
|
||||
Options directly inherited from nginx
|
||||
|
||||
@ -554,6 +705,8 @@ Options directly inherited from nginx
|
||||
pentium, pentiumpro, pentium3, pentium4,
|
||||
athlon, opteron, sparc32, sparc64, ppc64
|
||||
|
||||
--with-make=PATH specify the default make utility to be used
|
||||
|
||||
--without-pcre disable PCRE library usage
|
||||
--with-pcre force PCRE library usage
|
||||
--with-pcre=DIR set path to PCRE library sources
|
||||
@ -596,7 +749,7 @@ sub gen_makefile {
|
||||
open my $out, ">Makefile" or
|
||||
die "Cannot open Makefile for writing: $!\n";
|
||||
|
||||
print $out ".PHONY: all install\n\n";
|
||||
print $out ".PHONY: all install clean\n\n";
|
||||
|
||||
print $out "all:\n\t" . join("\n\t", @make_cmds) . "\n\n";
|
||||
|
||||
@ -609,21 +762,23 @@ sub gen_makefile {
|
||||
|
||||
# check if we can run some command
|
||||
sub can_run {
|
||||
my ($cmd) = @_;
|
||||
my ($cmd) = @_;
|
||||
|
||||
#warn "can run: @_\n";
|
||||
my $_cmd = $cmd;
|
||||
return $_cmd if -x $_cmd;
|
||||
#warn "can run: @_\n";
|
||||
my $_cmd = $cmd;
|
||||
return $_cmd if -x $_cmd;
|
||||
|
||||
# FIXME: this is a hack; MSWin32 is not supported anyway
|
||||
my $path_sep = ':';
|
||||
return undef if $_cmd =~ m{[\\/]};
|
||||
|
||||
for my $dir ((split /$path_sep/, $ENV{PATH}), '.') {
|
||||
next if $dir eq '';
|
||||
my $abs = File::Spec->catfile($dir, $_[0]);
|
||||
return $abs if -x $abs;
|
||||
}
|
||||
# FIXME: this is a hack; MSWin32 is not supported anyway
|
||||
my $path_sep = ':';
|
||||
|
||||
return;
|
||||
for my $dir ((split /$path_sep/, $ENV{PATH}), '.') {
|
||||
next if $dir eq '';
|
||||
my $abs = File::Spec->catfile($dir, $_[0]);
|
||||
return $abs if -x $abs;
|
||||
}
|
||||
|
||||
return undef;
|
||||
}
|
||||
|
||||
|
@ -44,12 +44,19 @@ for my $t_file (@t_files) {
|
||||
|
||||
warn "\n- $orig";
|
||||
warn "+ $_";
|
||||
} elsif (s{\bbuild/$pat\S+}{build/$dir}g && $orig ne $_) {
|
||||
|
||||
} elsif (s{ngx_openresty-\d+\.\d+\.\d+\.\d+(?:rc\d+)?}{ngx_openresty-$ver} && $orig ne $_) {
|
||||
$changed++;
|
||||
|
||||
warn "\n- $orig";
|
||||
warn "+ $_";
|
||||
} elsif (s{^cd $pat\S+}{cd $dir}g && $orig ne $_) {
|
||||
|
||||
} elsif (s{\bbuild/$pat[^/ \t\n]*\d[^/ \t\n]*}{build/$dir}g && $orig ne $_) {
|
||||
$changed++;
|
||||
|
||||
warn "\n- $orig";
|
||||
warn "+ $_";
|
||||
} elsif (s{^cd $pat[^/ \t\n]+}{cd $dir}g && $orig ne $_) {
|
||||
$changed++;
|
||||
|
||||
warn "\n- $orig";
|
||||
|
79
util/install
Executable file
79
util/install
Executable file
@ -0,0 +1,79 @@
|
||||
#!/usr/bin/env perl
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
|
||||
use Getopt::Std qw(getopts);
|
||||
|
||||
my %opts;
|
||||
getopts("m:", \%opts) or usage();
|
||||
|
||||
my $mode = $opts{m};
|
||||
|
||||
if (!defined $mode) {
|
||||
die "No -m option specified.\n";
|
||||
}
|
||||
|
||||
my $mod = $opts{m};
|
||||
|
||||
if (@ARGV < 2) {
|
||||
usage();
|
||||
}
|
||||
|
||||
my $dst = pop;
|
||||
|
||||
my @src = @ARGV;
|
||||
|
||||
my $target_dir;
|
||||
|
||||
if (@src > 1 || $dst =~ m{/$}) {
|
||||
$target_dir = $dst;
|
||||
|
||||
} elsif (-d $dst) {
|
||||
$target_dir = $dst;
|
||||
|
||||
} elsif ($dst =~ m{(.+)/}) {
|
||||
$target_dir = $1;
|
||||
|
||||
} else {
|
||||
$target_dir = '.';
|
||||
}
|
||||
|
||||
if (!-d $target_dir) {
|
||||
shell("mkdir -p $target_dir");
|
||||
}
|
||||
|
||||
shell("cp @src $dst");
|
||||
|
||||
if (-f $dst) {
|
||||
chmod oct($mode), $dst or
|
||||
die "failed to change mode of $dst to $mode.\n";
|
||||
|
||||
exit;
|
||||
}
|
||||
|
||||
for my $src (@src) {
|
||||
my $name;
|
||||
|
||||
if ($src =~ m{/([^/]+)$}) {
|
||||
$name = $1;
|
||||
|
||||
} else {
|
||||
$name = $src;
|
||||
}
|
||||
|
||||
my $target = "$target_dir/$name";
|
||||
chmod oct($mode), $target or
|
||||
die "failed to change mode of $target to $mode.\n";
|
||||
}
|
||||
|
||||
sub usage {
|
||||
die "Usage: install -m <attrs> <src>... <dst>\n";
|
||||
}
|
||||
|
||||
sub shell {
|
||||
my $cmd = shift;
|
||||
system($cmd) == 0 or
|
||||
die "failed to run command $cmd\n";
|
||||
}
|
||||
|
@ -48,10 +48,15 @@ rm -f *.patch || exit 1
|
||||
|
||||
cd .. || exit 1
|
||||
|
||||
cp $root/patches/nginx-$main_ver-no_pool.patch ./nginx-no_pool.patch || exit 1
|
||||
sed -i $"s/NGINX_VERSION \".unknown/NGINX_VERSION \".$minor_ver/" \
|
||||
./nginx-no_pool.patch || exit 1
|
||||
rm -rf no-pool-nginx-$ver
|
||||
|
||||
ver=0.37rc1
|
||||
$root/util/get-tarball "http://github.com/agentzh/echo-nginx-module/tarball/v$ver" -O echo-nginx-module-$ver.tar.gz || exit 1
|
||||
tar -xzf echo-nginx-module-$ver.tar.gz
|
||||
mv agentzh-echo-nginx-module-* echo-nginx-module-$ver
|
||||
tar -xzf echo-nginx-module-$ver.tar.gz || exit 1
|
||||
mv agentzh-echo-nginx-module-* echo-nginx-module-$ver || exit 1
|
||||
|
||||
ver=0.03rc3
|
||||
$root/util/get-tarball "http://github.com/agentzh/xss-nginx-module/tarball/v$ver" -O xss-nginx-module-$ver.tar.gz || exit 1
|
||||
@ -63,12 +68,12 @@ $root/util/get-tarball "http://github.com/simpl/ngx_devel_kit/tarball/v$ver" -O
|
||||
tar -xzf ngx_devel_kit-$ver.tar.gz || exit 1
|
||||
mv simpl-ngx_devel_kit-* ngx_devel_kit-$ver || exit 1
|
||||
|
||||
ver=0.21
|
||||
ver=0.22rc2
|
||||
$root/util/get-tarball "http://github.com/agentzh/set-misc-nginx-module/tarball/v$ver" -O set-misc-nginx-module-$ver.tar.gz || exit 1
|
||||
tar -xzf set-misc-nginx-module-$ver.tar.gz || exit 1
|
||||
mv agentzh-set-misc-nginx-module-* set-misc-nginx-module-$ver || exit 1
|
||||
|
||||
ver=0.11
|
||||
ver=0.12rc1
|
||||
$root/util/get-tarball "http://github.com/agentzh/rds-json-nginx-module/tarball/v$ver" -O rds-json-nginx-module-$ver.tar.gz || exit 1
|
||||
tar -xzf rds-json-nginx-module-$ver.tar.gz || exit 1
|
||||
mv agentzh-rds-json-nginx-module-* rds-json-nginx-module-$ver || exit 1
|
||||
@ -80,21 +85,21 @@ mv agentzh-headers-more-nginx-module-* headers-more-nginx-module-$ver || exit 1
|
||||
|
||||
#################################
|
||||
|
||||
ver=0.1.1rc1
|
||||
ver=0.1.1rc3
|
||||
$root/util/get-tarball "http://github.com/chaoslawful/drizzle-nginx-module/tarball/v$ver" -O drizzle-nginx-module-$ver.tar.gz || exit 1
|
||||
tar -xzf drizzle-nginx-module-$ver.tar.gz || exit 1
|
||||
mv chaoslawful-drizzle-nginx-module-* drizzle-nginx-module-$ver || exit 1
|
||||
|
||||
#################################
|
||||
|
||||
ver=0.2.0
|
||||
ver=0.2.1rc4
|
||||
$root/util/get-tarball "http://github.com/chaoslawful/lua-nginx-module/tarball/v$ver" -O lua-nginx-module-$ver.tar.gz || exit 1
|
||||
tar -xzf lua-nginx-module-$ver.tar.gz || exit 1
|
||||
mv chaoslawful-lua-nginx-module-* ngx_lua-$ver || exit 1
|
||||
|
||||
#################################
|
||||
|
||||
ver=0.02
|
||||
ver=0.03rc1
|
||||
$root/util/get-tarball "http://github.com/agentzh/array-var-nginx-module/tarball/v$ver" -O array-var-nginx-module-$ver.tar.gz || exit 1
|
||||
tar -xzf array-var-nginx-module-$ver.tar.gz || exit 1
|
||||
mv agentzh-array-var-nginx-module-* array-var-nginx-module-$ver || exit 1
|
||||
@ -115,14 +120,14 @@ mv agentzh-srcache-nginx-module-* srcache-nginx-module-$ver || exit 1
|
||||
|
||||
#################################
|
||||
|
||||
ver=0.07rc4
|
||||
ver=0.07rc5
|
||||
$root/util/get-tarball "http://github.com/calio/form-input-nginx-module/tarball/v$ver" -O form-input-nginx-module-$ver.tar.gz || exit 1
|
||||
tar -xzf form-input-nginx-module-$ver.tar.gz || exit 1
|
||||
mv calio-form-input-nginx-module-* form-input-nginx-module-$ver || exit 1
|
||||
|
||||
#################################
|
||||
|
||||
ver=0.10rc3
|
||||
ver=0.10rc4
|
||||
$root/util/get-tarball "http://github.com/calio/iconv-nginx-module/tarball/v$ver" -O iconv-nginx-module-$ver.tar.gz || exit 1
|
||||
tar -xzf iconv-nginx-module-$ver.tar.gz || exit 1
|
||||
mv calio-iconv-nginx-module-* iconv-nginx-module-$ver || exit 1
|
||||
@ -151,14 +156,14 @@ mv ngx_http_auth_request_module-* auth-request-nginx-module-$ver || exit 1
|
||||
|
||||
#################################
|
||||
|
||||
ver=0.8
|
||||
ver=0.9rc1
|
||||
$root/util/get-tarball "https://github.com/FRiCKLE/ngx_postgres/tarball/$ver" -O ngx_postgres-$ver.tar.gz || exit 1
|
||||
tar -xzf ngx_postgres-$ver.tar.gz || exit 1
|
||||
mv FRiCKLE-ngx_postgres-* ngx_postgres-$ver || exit 1
|
||||
|
||||
#################################
|
||||
|
||||
ver=0.07rc5
|
||||
ver=0.07
|
||||
$root/util/get-tarball "http://github.com/agentzh/redis2-nginx-module/tarball/v$ver" -O redis2-nginx-module-$ver.tar.gz || exit 1
|
||||
tar -xzf redis2-nginx-module-$ver.tar.gz || exit 1
|
||||
mv agentzh-redis2-nginx-module-* redis2-nginx-module-$ver || exit 1
|
||||
@ -181,7 +186,7 @@ cp $root/patches/lua-$ver-makefile_install_fix.patch lua-makefile-fix.patch || e
|
||||
|
||||
patch -p0 < lua-makefile-fix.patch || exit 1
|
||||
|
||||
rm lua-makefile-fix.patch
|
||||
rm lua-makefile-fix.patch || exit 1
|
||||
|
||||
#################################
|
||||
|
||||
@ -189,7 +194,12 @@ ver=2.0.0-beta8
|
||||
$root/util/get-tarball "http://luajit.org/download/LuaJIT-$ver.tar.gz" -O "LuaJIT-$ver.tar.gz" || exit 1
|
||||
tar -xzf LuaJIT-$ver.tar.gz || exit 1
|
||||
|
||||
#patch -p0 < $root/patches/LuaJIT-$ver-symlink_lib.patch || exit 1
|
||||
cd LuaJIT-$ver || exit 1;
|
||||
$root/util/get-tarball http://luajit.org/download/beta8_hotfix1.patch -O beta8_hotfix1.patch
|
||||
patch -p1 < beta8_hotfix1.patch || exit 1
|
||||
rm beta8_hotfix1.patch || exit 1
|
||||
cp $root/misc/unwind-generic.h ./unwind.h || exit 1
|
||||
cd ..
|
||||
|
||||
#################################
|
||||
|
||||
@ -198,6 +208,7 @@ rm *.tar.gz
|
||||
cd ..
|
||||
cp $root/util/configure ./
|
||||
cp $root/README ./
|
||||
cp $root/util/install bundle/
|
||||
|
||||
cd $root
|
||||
|
||||
|
Reference in New Issue
Block a user