Compare commits

..

28 Commits

Author SHA1 Message Date
458b8f5456 release 1.0.4.2. 2011-08-09 15:13:29 +08:00
95e12baff4 added regression tests for recent changes for Solaris and FreeBSD. 2011-08-08 16:08:50 +08:00
843cb73393 now we bundle a perl script to serve as the install script for Solaris. now ngx_openresty 1.0.4.2rc13 builds successfully on Solaris 11 with LuaJIT enabled! 2011-08-08 15:56:33 +08:00
1276fbdf48 bundled gcc's unwind-generic.h for BSD because unwind.h is missing at least on FreeBSD. released ngx_openresty 1.0.4.2rc12. 2011-08-08 13:27:32 +08:00
5aa4947cb1 use absoluate paths in Makefile to prevent -jN chaos when using bsdmake. released ngx_openresty 1.0.4.2rc11. 2011-08-08 09:27:06 +08:00
dd2d1d04b8 upgraded ngx_lua to v0.2.1rc4. released ngx_openresty 1.0.4.2rc10. 2011-08-07 23:28:04 +08:00
b255299212 fixed a typo in README. 2011-08-07 11:32:40 +08:00
a50e578d0e now we use gmake if it is avaialbe in PATH during ./configure; also added the --with-make=PATH option to allow the user to specify a custom make utility. released ngx_openresty 1.0.4.2rc9. 2011-08-07 11:27:58 +08:00
23d0222ed3 we now use the CC variable instead of HOST_CC while passing the --with-cc option to the luajit build system. thanks @姜大炮 for reporting this issue. 2011-08-06 19:30:27 +08:00
6e5f3ce9b5 upgraded ngx_lua to v0.2.1rc3. released ngx_openresty 1.0.4.2rc7. 2011-08-05 23:45:07 +08:00
6431074de4 added the --with-pg_config option to ./configure script as per 罗翼's suggestion. released ngx_openresty 1.0.4.2rc6. 2011-08-05 15:21:58 +08:00
2654f60c1b added the --with-no-pool-patch option to the ./configure script, to allow enabling the no-pool patch for debugging memory issues with valgrind, for example. released ngx_openresty 1.0.4.2rc5. 2011-08-05 10:04:23 +08:00
da11207dea added the --with-libpq=DIR option to the ./configure script. also released ngx_openresty 1.0.4.2rc4. 2011-08-04 20:34:15 +08:00
5c208328e2 upgraded ngx_drizzle to v0.1.1rc3. released ngx_openresty 1.0.4.2rc3. 2011-08-04 15:33:32 +08:00
5e2df4bb9a fixed a regression while specifying --with-http_iconv_module during ./configure. thanks 冯新国 for reporting this issue released ngx_openresty 1.0.4.2rc2. 2011-08-04 12:02:12 +08:00
106f9751e5 upgraded ngx_set_misc to 0.22rc2; released ngx_openresty 1.0.4.2rc1. 2011-07-30 10:37:10 +08:00
77e510abdc updated the tests for the new release. 2011-07-30 10:13:47 +08:00
88272c5503 fixed a typo in the patch. 2011-07-30 09:59:43 +08:00
4004360b4c fixed a regression when enabling luajit in 1.0.4.1rc5. thanks @Lance. released ngx_openresty 1.0.4.1rc6. 2011-07-28 12:11:01 +08:00
177e1bfcdf we do not specify TARGET_STRIP= when CCDEBUG is set to -g because it will make gmake crash. sigh. 2011-07-26 12:19:15 +08:00
0bf8bbe040 upgraded ngx_iconv to 0.10rc3, ngx_form_input to 0.07rc5, ngx_array_var to 0.03rc1, and ngx_set_misc to 0.22rc1; now --with-debug option also affects luajit2.0; disabled target stripping in luajit2.0; released ngx_openresty 1.0.4.1rc5. 2011-07-26 11:56:29 +08:00
8ba0a37a42 ngx_openresty 1.0.4.1rc4. 2011-07-25 15:56:17 +08:00
557f52794c applied the official hotfix1 patch for LuaJIT 2.0.0 beta8; also released ngx_openresty 1.0.4.1rc4. 2011-07-25 15:51:44 +08:00
b7e7398fc9 now the --with-cc=CC option of ./configure also controls the C compiler used by Lua and LuaJIT. thanks @姜大炮 for reporting the issue; also released ngx_openresty 1.0.4.1rc3. 2011-07-23 12:37:44 +08:00
68aac430ae upgraded ngx_lua to v0.2.1rc2 and ngx_redis2 to v0.07; also released ngx_openresty 1.0.4.1rc2. 2011-07-23 11:55:35 +08:00
d2c3802134 upgraded ngx_rds_json to v0.12rc1, ngx_drizzle to v0.1.1rc2, ngx_lua to v0.2.1rc1, ngx_postgres to v0.9rc1, ngx_redis2 to v0.07rc6, and also released ngx_openresty 1.0.4.1rc1. 2011-07-14 16:21:24 +08:00
918e884175 Merge branch 'master' of github.com:agentzh/ngx_openresty 2011-07-14 11:43:19 +08:00
cbce5daa05 no longer enable gcc -O2 by default. -O2 hates backtraces. 2011-07-13 22:15:36 +08:00
10 changed files with 1763 additions and 237 deletions

2
README
View File

@ -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
View 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 */

View 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;

View File

@ -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 */

File diff suppressed because it is too large Load Diff

219
util/configure vendored
View File

@ -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;
}

View File

@ -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
View 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";
}

View File

@ -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

View File

@ -1,7 +1,7 @@
#!/bin/bash
main_ver=1.0.4
minor_ver=0
minor_ver=2
version=$main_ver.$minor_ver
echo $version