1
0
Fork 0
mirror of https://github.com/tobast/libunwind-eh_elf.git synced 2024-11-16 21:27:38 +01:00
Commit graph

487 commits

Author SHA1 Message Date
Tommi Rantala
939a5e195e Annotate potentially unused variable in tests/test-coredump-unwind.c
tests/test-coredump-unwind.c: In function 'handle_sigsegv':
test-coredump-unwind.c:216:15: warning: variable 'uc' set but not used [-Wunused-but-set-variable]
2012-09-28 14:06:07 +03:00
Tommi Rantala
7673df21ff Annotate potentially unused variable in tests/Gtest-trace.c
tests/Gtest-trace.c: In function 'sighandler':
tests/Gtest-trace.c:179:15: warning: unused variable 'uc' [-Wunused-variable]
2012-09-28 14:06:07 +03:00
Tommi Rantala
0c838c4d44 Annotate potentially unused variable in tests/Gtest-bt.c
tests/Gtest-bt.c: In function 'sighandler':
tests/Gtest-bt.c:158:15: warning: unused variable 'uc' [-Wunused-variable]
2012-09-28 14:06:07 +03:00
Tommi Rantala
23fdda6a28 Workaround volatileness warning in tests/ia64-test-setjmp.c
tests/ia64-test-setjmp.c:76: warning: function return types not compatible due to 'volatile'
2012-09-28 14:06:07 +03:00
Tommi Rantala
074e328d46 Avoid -Wunused-value warning in tests/Gia64-test-stack.c
tests/Gia64-test-stack.c: In function 'do_unwind_tests':
tests/Gia64-test-stack.c:91: warning: value computed is not used
2012-09-28 14:06:07 +03:00
Tommi Rantala
68b20804e4 Clear out `ip' to avoid -Wuninitialized warning in tests/test-coredump-unwind.c
This one is for architectures that we have not specifically added
support for in `tests/test-coredump-unwind.c'.

tests/test-coredump-unwind.c: In function 'handle_sigsegv':
test-coredump-unwind.c:238:10: warning: 'ip' is used uninitialized in this function [-Wuninitialized]
2012-09-28 14:06:07 +03:00
Tommi Rantala
d3fd3dc3ca Default to non-verbose mode in Ltest-cxx-exceptions 2012-09-28 14:06:07 +03:00
Konstantin Belousov
80e852cb38 Do not allow the reference to the local var to outlive the local var scope. 2012-09-21 23:06:24 -07:00
Cody P Schafer
b45c27b6ee ppc64: remove tests/ppc64-test-wchar
It is not clear what is special about wchar on PPC64, and no one can
remember why this was added.

Removing.
2012-09-15 10:47:42 -07:00
Cody P Schafer
3a5d7ff694 build: make libunwind-coredump build optional
Disable the building of libunwind-coredump except on x86_64 and x86
(where implimentations exsist).

Allow overriding of this autodetection via --enable-coredump and
--disable-coredump.
2012-09-15 10:47:42 -07:00
Tommi Rantala
1c1dbbe296 Do not print garbage proc info in tests/Gtest-bt.c
Check the return value of the unw_get_proc_info() call to avoid printing
garbage if the call fails.
2012-09-04 14:58:38 +03:00
Tommi Rantala
8203c955c8 Change test-varargs to check libunwind backtracing
test-varargs is checking how `backtrace()' provided by the system
behaves when varargs are used. Let's make the test more useful by
changing it to test the `backtrace()' provided by libunwind.

Change the testcase to return 0/1 for success/failure, and add it to the
set of checks, so that it gets run on `make check'. Also call
`unw_backtrace()' explicitly so that we do not need to bother with
`execinfo.h' and `backtrace()' prototype.
2012-09-04 14:58:38 +03:00
Tommi Rantala
ffbe29940e Check correct variable for offset in tests/Gtest-init.cxx
Checking `off' for positiveness does not make any sense, check `offset'
instead.
2012-09-04 14:58:37 +03:00
Tommi Rantala
6470a67461 Rename backtrace' to do_backtrace' in tests/Gtest-init.cxx
Rename `backtrace' to `do_backtrace' in tests/Gtest-init.cxx for sanity;
the `backtrace' name is already defined in various other places.
2012-09-04 14:58:37 +03:00
Tommi Rantala
aed6c8b994 Check __builtin___clear_cache() at configuration time
Fixup commit 39b83981 ("Flush icache with __builtin___clear_cache() in
tests when compiling with GCC") to fix compilation with older GCC
versions that do not provide __builtin___clear_cache().
2012-09-04 13:26:13 +03:00
Tommi Rantala
39b8398159 Flush icache with __builtin___clear_cache() in tests when compiling with GCC
When compiling with GCC, use the builtin instruction cache flushing
mechanism in all tests where it is needed.

Quoting GCC docs: ''If the target does not require instruction cache
flushes, __builtin___clear_cache has no effect. Otherwise either
instructions are emitted in-line to clear the instruction cache or a
call to the __clear_cache function in libgcc is made.''.
2012-08-21 22:33:56 +03:00
Tommi Rantala
5fedf3407c Avoid -Wunused-value warning in tests/Gtest-exc.c
Gtest-exc.c: In function 'a':
Gtest-exc.c💯15: warning: value computed is not used [-Wunused-value]
2012-08-21 22:33:56 +03:00
Tommi Rantala
5b55e556ca test-resume-sig-rt: test unw_resume() in presence of "realtime" signal frame
Introduce a new test case that is derived from test-resume-sig, but
using the SA_SIGINFO sigaction() flag. This case is referred in the
linux kernel sources as "realtime" signal handler, and is handled
differently in the kernel on many architectures and in libunwind as
well.
2012-08-21 22:33:56 +03:00
Tommi Rantala
ff0c6ccf6b Remove unneeded length modifier from suppressed match in sscanf() format in tests/crasher.c
GCC is complaining about the `%*jx' match in sscanf() format string.
Replace it with `%*x'; sscanf() will identically match an unsigned
hexadecimal integer without the length modifier.

crasher.c: In function 'write_maps':
crasher.c:30:9: warning: use of assignment suppression and length modifier together in gnu_scanf format [-Wformat]
2012-08-21 22:30:47 +03:00
Tommi Rantala
9a6d921230 Fix plain return from main() in tests/test-async-sig.c
test-async-sig.c: In function 'main':
test-async-sig.c:185:4: warning: 'return' with no value, in function returning non-void [-Wreturn-type]
2012-08-21 22:30:46 +03:00
Tommi Rantala
56f07a8e55 Stop using nonportable echo arguments in tests
echo arguments are not portable, so use printf when we need to print
tabs or newlines.
2012-08-21 22:30:46 +03:00
Tommi Rantala
f42a8de0fa Annotate unused parameters in tests
Compiling the tests with -Wextra results to lots of warnings for unused
parameters. Annotate these cases with the `unused' attribute to avoid
the warnings.
2012-08-21 22:30:46 +03:00
Tommi Rantala
47a99b6f00 Eliminate unused parameters in tests 2012-08-21 22:30:41 +03:00
Tommi Rantala
6f374ccb5a Ignore _fbss, _fdata, _ftext and _gp symbols on MIPS 2012-08-20 08:46:47 +03:00
Tommi Rantala
a63c209fed Add PPC namespace checking
PPC is the only architecture that has the get_func_addr() symbol
exported, so add specific checks for this architecture.
2012-08-20 08:46:46 +03:00
Arun Sharma
201bb8733d Use libtool to build libunwind-ptrace 2012-08-18 12:41:21 -07:00
Konstantin Belousov
04c77cced4 Fix for test suite build in the separate directory.
Avoid manually coding the rule to build crasher, instead fuddle
the compiler so that even -O2 optimization does not eliminate call
to b().

First, put calls to both a() and b() in the b() into non-tail-recursive
position. Second, as recommended in gcc manual, use asm volatile("");
to prevent further prevent inlining, besides attribute((noinline).
And third, call b() by alias, which current gcc optimizer cannot see
through.

Also, do not dereference NULL in a, and mark the memory access as volatile.
[ Minor portability improvements: asharma@fb.com ]
2012-08-11 22:02:55 -07:00
Arun Sharma
538f63d796 Fix test-ptrace in automated mode
Tested via:
./test-ptrace
./test-ptrace -v /bin/ls /usr
2012-08-11 21:21:54 -07:00
Martin Milata
4ab9e5dd10 MiniDebugInfo test: tests/run-coredump-unwind-mdi
Test that creates MiniDebugInfo-containing binary and then checks if it
can recover the procedure names from its coredump.

Signed-off-by: Martin Milata <mmilata@redhat.com>
2012-08-10 15:29:03 +02:00
Martin Milata
2dbc26dde8 Make coredump test also test unw_get_proc_name
Signed-off-by: Martin Milata <mmilata@redhat.com>
2012-08-08 13:54:05 +02:00
Arun Sharma
707b1dba99 Fix a SIGSEGV in test-ptrace.c
./test-ptrace -v resulted in a SIGSEGV.
2012-08-04 18:06:07 -07:00
Arun Sharma
32202619c4 Fix a test failure
The test contains hints to users of unw_backtrace() and friends
on how to ensure correctness in a multi-threaded program
2012-08-04 17:58:24 -07:00
Arun Sharma
814bd79fb1 Fix some compiler warnings 2012-08-04 12:48:56 -07:00
Tommi Rantala
4bf1b71952 Use unw_context_t instead of ucontext_t in tests/Gtest-trace.c and tests/Gtest-bt.c
At least on ARM unw_context_t and ucontext_t are not the same types, so
use unw_context_t.

See also commit 24112f6d9b ("Fix some test
failures on x86_64 on distros with small default stacks.")

Gtest-trace.c: In function 'do_backtrace':
Gtest-trace.c:66:3: warning: initialization from incompatible pointer type [enabled by default]
Gtest-trace.c:67:3: warning: passing argument 2 of '_Uarm_init_local' from incompatible pointer type [enabled by default]
../include/libunwind-common.h:239:1: note: expected 'struct unw_context_t *' but argument is of type 'struct ucontext_t *'

Gtest-bt.c: In function 'do_backtrace':
Gtest-bt.c:65:3: warning: initialization from incompatible pointer type [enabled by default]
Gtest-bt.c:66:3: warning: passing argument 2 of '_Uarm_init_local' from incompatible pointer type [enabled by default]
../include/libunwind-common.h:239:1: note: expected 'struct unw_context_t *' but argument is of type 'struct ucontext_t *'
2012-07-31 16:21:15 +03:00
Tommi Rantala
9158e522db Fix IP vs. PC confusion in tests on ARM
The intention in the test cases is to print the "instruction pointer"
value at certain places, and on ARM we will want to get the Program
Counter in these cases. IP is a scratch register, and not very
interesting.
2012-07-31 16:21:15 +03:00
Tommi Rantala
a06f189baf Rip out AC_TYPE_SIGNAL and sighandler_t check
AC_TYPE_SIGNAL is an obsolete autoconf macro, and we were not using
sighandler_t or RETSIGTYPE for anything anyways.
2012-07-31 15:01:02 +03:00
Martin Milata
de28c51e63 Build libunwind-coredump using libtool
So that it builds shared/pic library that can be linked with other
libraries.

Signed-off-by: Martin Milata <mmilata@redhat.com>
2012-07-04 17:01:44 -07:00
Konstantin Belousov
0f6c8313b7 Port crasher to FreeBSD. 2012-06-23 11:39:18 -07:00
Martin Milata
0f9a540c8c coredump: add test
Program test-coredump-unwind was modified to map backing files based on
virtual addresses instead of segment numbers.

The crasher.c is a program that essentially calls some functions and
then writes to invalid address causing a crash. Before that, it detects
which executables are mapped to which virtual addresses and writes this
information to a file suitable for consumption by test-coredump-unwind.
The mapping information is obtained form /proc/self/maps, so currently
it only works on linux.

The test itself is a shell script, which first runs the program and then
runs test-coredump-unwind on the resulting core and address space
map file to check whether the stack trace obtained from the dump roughly
corresponds to what it should look like.

Signed-off-by: Martin Milata <mmilata@redhat.com>
2012-05-31 11:00:40 +02:00
Konstantin Belousov
61a173763e Fix test build on FreeBSD. 2012-05-24 12:45:23 +03:00
Martin Milata
d93d96ad83 Fix compilation on IA64
- Add tdep macro for {dwarf,ia64}_find_unwind_table so that ia64
   doesn't try to use dwarf code.
 - Fix extraneous #if.
 - Fix mistyped filename in Makefile.am.
 - Link ia64-specific tests with correct libraries.

Signed-off-by: Martin Milata <mmilata@redhat.com>
2012-05-23 20:52:28 -07:00
Arun Sharma
46dfe3ecf5 Fixup whitespace in Makefile. 2012-03-14 17:20:58 -07:00
Arun Sharma
7e5d2791f9 Update namespace checks for dwarf_find_unwind_tables 2012-03-12 20:11:49 -07:00
Arun Sharma
6da4dde70e Compile fix for platforms other than linux-i386 2012-03-12 20:11:49 -07:00
Arun Sharma
f0bb806ecb Move the test case to tests dir. 2012-03-12 20:11:49 -07:00
Ken Werner
3977724e82 Add missing <signal.h> include directive
The testcase tests/Gtest-dyn1.c uses the signal() function and should
therefore include the corresponding header file.

Signed-off-by: Ken Werner <ken.werner@linaro.org>
2011-10-29 17:12:43 -07:00
Ken Werner
9a311bf48b [ARM] fix for the check-namespace test case
Add ARM specific symbols and ignore some symbols generated by the ARM Linux
default linker script.

Signed-off-by: Ken Werner <ken.werner@linaro.org>
2011-10-15 23:10:28 -07:00
Arun Sharma
42b67080eb Fix linker errors with recent binutils
Without this, tests that called unw_getcontext() got a linker error

Signed-off-by: Arun Sharma <asharma@fb.com>
2011-10-15 23:03:46 -07:00
Arun
f89fb17695 Fix incorrect calls to memset.
Found when compiling libunwind with clang.

Signed-off-by: Paul Pluzhnikov <ppluzhnikov@google.com>
2011-10-02 22:43:28 -07:00
Arun Sharma
1d8e2c1ae5 Explicitly specify the libraries
Without this linking fails with gold and newer versions of ld.
2011-09-10 19:57:10 -07:00
Sven Neumann
f195c9ad52 Skip a few tests on uCLibC
Without this, the build fails on platforms that don't implement
backtrace().
2011-08-27 21:54:52 -07:00
Arun Sharma
4dbc2bcb94 Fix a compiler warning
backtrace() needs execinfo.h
2011-08-15 20:19:47 -07:00
Ken Werner
288f18f7ae ARM: tests/Gtest-dyn1.c workaround for GCC bug.
Temporarily workaround for a GCC bug that prevents code from obtaining the
thumb marker: https://bugs.launchpad.net/gcc-linaro/+bug/721531.

Signed-off-by: Ken Werner <ken.werner@linaro.org>
2011-04-21 17:25:42 +02:00
Ken Werner
3b917f2d16 ARM: tests/Gtest-dyn1.c fixes.
Define an appropriate fdesc struct and its corresponding accessors that take
care of the thumb marker on ARM. Call the __clear_cache built-in instead of
flush_cache if the GNU compiler is used.

Signed-off-by: Ken Werner <ken.werner@linaro.org>
2011-04-21 17:25:42 +02:00
Ken Werner
a624812e2a ARM: tests/Gtest-trace.c - IP printing
Print the instruction pointer on ARM as well.

Signed-off-by: Ken Werner <ken.werner@linaro.org>
2011-04-21 17:25:42 +02:00
Ken Werner
d589e20506 Add the appropriate libraries to the *_LDADD variables.
The test-async-sig.c, test-flush-cache.c and Ltest_resume_sig.c define
UNW_LOCAL_ONLY and therefore only need LIBUNWIND_local. Gtest-dyn1.c is
calling '_U_dyn_cancel' and test-trace.c is using 'unw_backtrace' which
are in LIBUNWIND_local.

Signed-off-by: Ken Werner <ken.werner@linaro.org>
2011-04-21 17:25:42 +02:00
Ken Werner
e4593e2493 Increase alternate signal stack size.
Creating an alternate signal stack with a size of SIGSTKSZ (usually 8k) is
not enough on some targets because unw_cursor_t is bigger than that already.
Since the size of unw_cursor_t is part of the ABI the UNW_TDEP_CURSOR_LEN
can't be changed without breaking existent code. Therefore size of the
alternate signal stack has been increased to 1 MiB.

Signed-off-by: Ken Werner <ken.werner@linaro.org>
2011-04-05 20:59:10 -07:00
Arun Sharma
d86155f72e Add a test to catch calls to calloc from libunwind
We'd like to avoid calls to all malloc related functions
so libunwind is still usable from such allocators.

Signed-off-by: Paul Pluzhnikov <ppluzhnikov@google.com>
2011-04-05 20:59:03 -07:00
Arun Sharma
4dc222cf8a Undo parts of 2f9b04e9c2
Linking to local unwind library seems to be unrelated to
failures seen earlier.
2011-04-05 13:41:29 -07:00
Lassi Tuura
5f38f35d5d Drop a call frame in tdep_trace and avoid a call to unw_step.
Dropping the extra frame for unw_backtrace itself using unw_step is
approximately 15% slower than skipping the frame in tdep_trace.  So
drop the frame in the latter, and make the function a private
implementation detail for libunwind, not an exported interface.

Also moves unw_getcontext call back into unw_backtrace to avoid an
extra call frame in case slow_backtrace does not get inlined into
unw_backtrace.
2011-04-01 00:00:39 -07:00
Lassi Tuura
50bc12afba Export unw_backtrace() and alias backtrace() to it. 2011-04-01 00:00:33 -07:00
Arun Sharma
2f9b04e9c2 Mark slow_backtrace() ALWAYS_INLINE
Also fix Makefile.am so remote unwinding tests such Gtest-trace
don't link with the local unwind library (libunwind.a).
2011-03-31 22:58:07 -07:00
Arun Sharma
27d0dbfecb Ensure tests pass on 32 bit x86. 2011-03-25 14:34:41 -07:00
Lassi Tuura
3b9fd99cb7 Assign copyright as requested by the author. 2011-03-25 00:20:49 -07:00
Arun Sharma
741a5a2149 Add some performance tests for fast backtracing. 2011-03-25 00:20:46 -07:00
Arun Sharma
7ff83c051e Fix up compilation and test failures 2011-03-24 23:32:25 -07:00
Lassi Tuura
9e98f15e9a Fast back-trace for x86_64 for only collecting the call stack.
Adds new function to perform a pure stack walk without unwinding,
functionally similar to backtrace() but accelerated by an address
attribute cache the caller maintains across calls.
2011-03-24 22:33:17 -07:00
Arun Sharma
6c1a58fd06 Remove the unused arm_extbl_test_LDADD from Makefile.am 2011-03-24 21:49:17 -07:00
Ken Werner
6e25c11505 Remove the arm-extbl-test.
This test case relies on old libunwind internals such as the arm_stackframe.
Since the ARM extbtl-parser now operates on the DWARF model directly the
arm-extbl-test isn't of any particular use anymore.

Signed-off-by: Ken Werner <ken.werner@linaro.org>
2011-03-24 20:42:01 -07:00
Konstantin Belousov
04fc88fa31 Fix build and distribution on the FreeBSD.
Signed-off-by: Konstantin Belousov <kostikbel@gmail.com>
2011-03-24 20:41:07 -07:00
Arun Sharma
0613d4c680 Fixup trailing whitespace
Signed-off-by: Arun Sharma <asharma@fb.com>
2011-03-22 08:40:49 -07:00
Arun Sharma
57695518b3 Replace libuwind-elf32.la with $(LIBUNWIND_ELF)
This was needed to fix build errors on x86_64.

Signed-off-by: Arun Sharma <asharma@fb.com>
2011-03-22 08:34:33 -07:00
Zachary T Welch
4870386087 Add test of backtracing using ARM-specific tables
Uses .ARM.exidx and .ARM.extbl sections to produce a backtrace.

Signed-off-by: Ken Werner <ken.werner@linaro.org>
2011-03-22 08:15:03 -07:00
Zachary T Welch
13cd3b0c26 Fix test-ptrace argument parsing.
Avoids an endless loop when passing unknown options.

Signed-off-by: Zachary T Welch <zwelch@codesourcery.com>
Signed-off-by: Ken Werner <ken.werner@linaro.org>
2011-03-07 21:24:51 -08:00
Ken Werner
c2cc122a62 Explicitly add dependent shared libraries.
This adds support for linkers that do not pull in the dependent shared
libraries of libunwind-$(arch).la and libunwind-setjmp.la implicitly.

Signed-off-by: Ken Werner <ken.werner@linaro.org>
2011-03-07 21:24:50 -08:00
Zachary T Welch
7e767a2838 Improve test LDADD settings.
Eliminates unused libraries from test program linking.  Substitutes
'$(top_builddir)' for '..' to clarify library locations.

Signed-off-by: Zachary T Welch <zwelch@codesourcery.com>
2010-11-29 11:28:35 -08:00
Zachary T Welch
651e9bb4fd Add MAINTAINERCLEANFILES to Makefile.am files.
Ensures 'make maintainer-clean' removes files generated by autotools.

Signed-off-by: Zachary T Welch <zwelch@codesourcery.com>
2010-11-08 09:06:09 -08:00
Arun Sharma
982d590ddb Add Gtest-nomalloc.c to EXTRA_DIST so we pass "make check" 2010-08-04 15:11:19 -07:00
Arun Sharma
546463d1e7 Factor out and export dwarf_find_debug_frame() function
Signed-off-by: Andris Zeila <andris.zeila@accenture.com>
2010-05-26 19:21:30 -07:00
Arun Sharma
215afa30b7 Add unwind descriptors to getcontext.S 2010-04-28 16:32:30 -07:00
Arun Sharma
c2d78041cc GCC compatibility on x86 for C++ exception handling 2010-04-12 12:08:43 -07:00
Konstantin Belousov
fd88f41818 Merge remote branch 'origin/master' into freebsd
Conflicts:
	src/x86/Gis_signal_frame.c
	src/x86/Gstep.c
	src/x86_64/Gis_signal_frame.c
	src/x86_64/Gstep.c
2010-04-05 16:14:50 +03:00
Arun Sharma
8e53e62db9 Refactor os specific code for x86 (both 32 and 64 bit).
Move Linux specific code into ${arch}/Gos-linux.c
2010-04-04 16:46:13 -07:00
Konstantin Belousov
459b2a5ba8 Normalize test code 2010-04-04 17:09:33 +03:00
Konstantin Belousov
574d32a829 malloc.h is not needed. 2010-04-04 11:59:31 +03:00
Konstantin Belousov
6e07e94d5d Revert "Test for malloc.h."
This reverts commit 22b17269cf.
2010-04-04 11:57:57 +03:00
Konstantin Belousov
22b17269cf Test for malloc.h. 2010-04-03 23:34:33 +03:00
Konstantin Belousov
9bb9c972e6 Merge with origin/master 2010-03-31 16:01:38 +03:00
Arun Sharma
d3ddc9b96b Cap the runtime for rs-race 2010-03-10 22:57:43 -08:00
Arun Sharma
f8a15e9679 Fix a couple of test breakages on x86_64
setcontext() now restores the signal mask. Also remove a check
in the test that doesn't seem to be valid.
2010-03-10 22:52:12 -08:00
Arun Sharma
24112f6d9b Fix some test failures on x86_64 on distros with small default stacks. 2010-03-10 21:13:26 -08:00
Konstantin Belousov
d737709640 Close #if 2010-03-11 00:02:11 +02:00
Konstantin Belousov
3b026a7ed8 Fix i386 distinctions between freebsd and linux for mcontext. 2010-03-10 23:51:09 +02:00
Konstantin Belousov
4b3ca293bf Fix PT_SYSCALL ignoring of ip 2010-03-08 17:01:31 +02:00
Konstantin Belousov
ad932154a6 Port test-ptrace 2010-03-08 00:50:50 +02:00
Konstantin Belousov
da357e3c2e Revert "sys/types.h"
This reverts commit 5976f1a5b3.
2010-03-08 00:20:23 +02:00
Konstantin Belousov
59d38aaccd Properly handle -ldl and -lutil 2010-03-07 12:46:05 +02:00
Konstantin Belousov
5976f1a5b3 sys/types.h 2010-03-06 17:47:26 +02:00
Konstantin Belousov
d7f5141075 MAP_ANONYMOUS 2010-03-06 16:46:52 +02:00
Paul Pluzhnikov
9626d66019 Fix a race condition in dwarf unwinding.
Original code was accessing rs_cache memory without holding a lock
in some cases. If there was sufficient cache pressure, entry being
accessed may be overwritten by another thread, resulting in a data
race.

We now make a thread local copy of the data, before releasing the
lock. If we end up supporting UNW_CACHE_PER_THREAD properly
in the future, this memcpy should be unnecessary.
2009-11-24 15:18:48 -08:00