Szabolcs Nagy
d2e0491883
Single threaded stdio optimization
...
Locking overhead can be significant in some stdio operations
that are common in single threaded applications.
This patch adds the _IO_FLAGS2_NEED_LOCK flag to indicate if
an _IO_FILE object needs to be locked and some of the stdio
functions just jump to their _unlocked variant when not. The
flag is set on all _IO_FILE objects when the first thread is
created. A new GLIBC_PRIVATE libc symbol, _IO_enable_locks,
was added to do this from libpthread.
The optimization can be applied to more stdio functions,
currently it is only applied to single flag check or single
non-wide-char standard operations. The flag should probably
be never set for files with _IO_USER_LOCK, but that's just a
further optimization, not a correctness requirement.
The optimization is valid in a single thread because stdio
operations are non-as-safe (so lock state is not observable
from a signal handler) and stdio locks are recursive (so lock
state is not observable via deadlock). The optimization is not
valid if a thread may be created while an stdio lock is taken
and thus it should be disabled if any user code may run during
an stdio operation (interposed malloc, printf hooks, etc).
This makes the optimization more complicated for some stdio
operations (e.g. printf), but those are bigger and thus less
important to optimize so this patch does not try to do that.
* libio/libio.h (_IO_FLAGS2_NEED_LOCK, _IO_need_lock): Define.
* libio/libioP.h (_IO_enable_locks): Declare.
* libio/Versions (_IO_enable_locks): New symbol.
* libio/genops.c (_IO_enable_locks): Define.
(_IO_old_init): Initialize flags2.
* libio/feof.c.c (_IO_feof): Avoid locking when not needed.
* libio/ferror.c (_IO_ferror): Likewise.
* libio/fputc.c (fputc): Likewise.
* libio/putc.c (_IO_putc): Likewise.
* libio/getc.c (_IO_getc): Likewise.
* libio/getchar.c (getchar): Likewise.
* libio/ioungetc.c (_IO_ungetc): Likewise.
* nptl/pthread_create.c (__pthread_create_2_1): Enable stdio locks.
* libio/iofopncook.c (_IO_fopencookie): Enable locking for the file.
* sysdeps/pthread/flockfile.c (__flockfile): Likewise.
2017-07-04 16:05:12 +01:00
..
2017-01-01 00:14:16 +00:00
2017-06-23 17:38:17 -03:00
2004-06-29 23:03:20 +00:00
2017-01-01 00:14:16 +00:00
2014-03-03 15:30:42 -08:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2014-02-10 15:07:12 +01:00
2017-01-28 19:21:44 -05:00
2017-01-01 00:14:16 +00:00
2017-05-20 19:01:46 -04:00
2015-06-30 17:05:44 +02:00
2017-01-01 00:14:16 +00:00
2013-07-02 08:46:54 -07:00
2005-12-14 08:43:25 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-05-25 14:53:40 -03:00
2017-01-10 11:50:17 +01:00
2017-03-01 20:33:46 -05:00
2017-01-20 14:56:39 +01:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2015-06-10 10:18:12 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-06-23 17:38:17 -03:00
2017-03-01 20:33:46 -05:00
2017-03-01 20:33:46 -05:00
2017-01-01 00:14:16 +00:00
2017-03-01 20:33:46 -05:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-07-04 16:05:12 +01:00
2017-06-23 17:38:17 -03:00
2017-06-23 17:38:17 -03:00
2017-06-23 17:38:17 -03:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-28 19:21:44 -05:00
2017-06-23 17:38:17 -03:00
2017-06-23 17:38:17 -03:00
2017-06-23 17:38:17 -03:00
2017-06-23 17:38:17 -03:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-13 17:16:07 +01:00
2017-01-01 00:14:16 +00:00
2017-06-23 17:38:17 -03:00
2017-01-01 00:14:16 +00:00
2017-06-23 17:38:17 -03:00
2017-06-23 17:38:17 -03:00
2017-01-01 00:14:16 +00:00
2017-06-23 17:38:17 -03:00
2017-06-23 17:38:17 -03:00
2017-06-23 17:38:17 -03:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-06-23 17:38:17 -03:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-06-23 17:38:17 -03:00
2017-01-01 00:14:16 +00:00
2017-01-10 11:50:17 +01:00
2017-01-01 00:14:16 +00:00
2017-01-10 11:50:17 +01:00
2017-01-10 11:50:17 +01:00
2017-01-10 11:50:17 +01:00
2017-01-10 11:50:17 +01:00
2017-01-10 11:50:17 +01:00
2017-01-10 11:50:17 +01:00
2017-01-10 11:50:17 +01:00
2017-01-10 11:50:17 +01:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-06-23 17:38:17 -03:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2004-09-20 00:16:11 +00:00
2004-09-20 00:16:11 +00:00
2004-09-20 00:16:11 +00:00
2017-01-01 00:14:16 +00:00
2004-09-20 00:16:11 +00:00
2004-09-20 00:16:11 +00:00
2004-09-20 00:16:11 +00:00
2004-09-20 00:16:11 +00:00
2017-01-28 19:21:44 -05:00
2017-01-28 19:21:44 -05:00
2017-06-23 17:38:17 -03:00
2004-09-20 00:16:11 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-06-06 09:41:56 +02:00
2017-06-06 09:41:56 +02:00
2017-06-06 09:41:56 +02:00
2017-06-06 09:41:56 +02:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2008-01-10 18:34:43 +00:00
2014-07-07 09:28:38 -07:00
2017-01-01 00:14:16 +00:00
2017-06-23 17:38:17 -03:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2014-09-12 12:28:47 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2014-05-07 14:00:01 +02:00
2017-02-06 15:58:32 -02:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-20 14:56:39 +01:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-10 11:50:17 +01:00
2017-01-10 11:50:17 +01:00
2017-01-10 11:50:17 +01:00
2007-05-15 06:49:29 +00:00
2017-06-23 17:38:17 -03:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-02-16 17:33:18 -05:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-05-01 15:41:46 -03:00
2017-05-01 15:41:46 -03:00
2017-05-01 15:41:46 -03:00
2017-05-01 15:41:46 -03:00
2017-05-31 17:35:46 -03:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2012-09-06 11:50:21 -07:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2012-10-05 10:23:58 -07:00
2006-01-04 09:26:31 +00:00
2017-02-16 17:33:18 -05:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2016-06-29 20:24:44 -07:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-02-16 17:33:18 -05:00
2017-01-01 00:14:16 +00:00
2017-02-16 17:33:18 -05:00
2017-01-01 00:14:16 +00:00
2012-10-05 10:23:58 -07:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-02-16 17:33:18 -05:00
2004-05-18 20:18:14 +00:00
2017-02-16 17:33:18 -05:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2004-09-02 18:59:24 +00:00
2016-12-31 14:56:47 +01:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-28 19:21:44 -05:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2016-08-26 19:40:17 +02:00
2016-08-26 19:40:17 +02:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-05-10 09:38:18 +02:00
2017-01-01 00:14:16 +00:00
2017-05-31 09:45:38 +02:00
2017-01-01 00:14:16 +00:00
2006-08-01 06:40:11 +00:00
2015-10-27 21:48:34 +00:00
2006-01-09 23:05:00 +00:00
2006-01-09 23:05:00 +00:00
2015-10-27 21:48:34 +00:00
2006-01-09 23:05:00 +00:00
2006-01-09 23:05:00 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2006-08-13 01:56:09 +00:00
2017-01-01 00:14:16 +00:00
2017-03-01 20:32:50 -05:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2015-02-06 12:30:58 -08:00
2007-07-28 20:36:21 +00:00
2017-02-25 09:59:46 -05:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2004-03-24 06:36:06 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2006-07-29 04:42:09 +00:00
2012-10-05 10:23:58 -07:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2014-12-02 22:33:57 +00:00
2006-07-29 04:42:09 +00:00
2006-07-29 04:42:09 +00:00
2006-07-29 04:42:09 +00:00
2006-07-29 04:42:09 +00:00
2006-07-29 04:42:09 +00:00
2011-10-24 21:43:33 -04:00
2006-07-29 04:42:09 +00:00
2006-07-29 04:42:09 +00:00
2012-10-05 10:23:58 -07:00
2006-07-29 04:42:09 +00:00
2006-07-29 04:42:09 +00:00
2014-12-02 22:33:57 +00:00
2014-12-12 11:14:00 +01:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2005-12-27 01:04:06 +00:00
2005-12-27 01:04:06 +00:00
2005-12-27 01:04:06 +00:00
2005-12-27 01:04:06 +00:00
2005-12-27 01:04:06 +00:00
2017-01-01 00:14:16 +00:00
2006-07-29 04:42:09 +00:00
2007-05-21 22:12:40 +00:00
2017-01-01 00:14:16 +00:00
2017-01-27 06:53:20 +01:00
2006-07-29 04:42:09 +00:00
2006-07-29 04:42:09 +00:00
2006-07-29 04:42:09 +00:00
2006-07-29 04:42:09 +00:00
2006-07-29 04:42:09 +00:00
2006-07-29 04:42:09 +00:00
2006-07-29 04:42:09 +00:00
2006-07-29 04:42:09 +00:00
2007-05-19 08:21:27 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2008-05-31 08:56:14 +00:00
2017-01-10 11:50:17 +01:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-10 11:50:17 +01:00
2017-01-10 11:50:17 +01:00
2017-01-10 11:50:17 +01:00
2017-01-10 11:50:17 +01:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-10 11:50:17 +01:00
2017-01-10 11:50:17 +01:00
2017-01-10 11:50:17 +01:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2012-10-05 10:23:58 -07:00
2015-01-21 00:46:16 -05:00
2012-10-05 10:23:58 -07:00
2007-05-26 01:23:04 +00:00
2015-01-21 00:46:16 -05:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2004-11-12 01:27:04 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2014-06-03 16:10:48 -07:00
2017-01-01 00:14:16 +00:00
2017-02-16 17:33:18 -05:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2005-06-26 18:14:26 +00:00
2017-02-16 17:33:18 -05:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-02-16 17:33:18 -05:00
2017-02-16 17:33:18 -05:00
2017-02-16 17:33:18 -05:00
2017-01-01 00:14:16 +00:00
2017-02-16 17:33:18 -05:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2007-08-21 23:55:36 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2004-03-10 05:25:48 +00:00
2004-03-10 05:25:48 +00:00
2004-03-10 05:25:48 +00:00
2004-03-10 05:25:48 +00:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:14:16 +00:00
2014-07-07 09:28:38 -07:00
2017-01-01 00:14:16 +00:00
2017-01-01 00:26:24 +00:00
2015-09-22 09:32:38 -07:00