diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2014-05-29 13:22:59 +0300 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2014-05-29 17:04:56 +0300 |
commit | 2035536f831b0ce54c28c2a0b405febb113e0fab (patch) | |
tree | 2408086b3eae646006a39e0b78892e2838cb2f35 | |
parent | 35e2816614ab2a1aa585b1ae2547683a69ed9d22 (diff) | |
download | vmod-binlog-2035536f831b0ce54c28c2a0b405febb113e0fab.tar.gz vmod-binlog-2035536f831b0ce54c28c2a0b405febb113e0fab.tar.bz2 |
Further thread-safety fixes.
* NEWS: Version 1.0.90
* configure.ac: Likewise.
* src/binlog.c (binlog_env) <inst_head>: New member.
(binlog_env_init): Initialize inst_head and use it
instead of conf->inst_head.
(env_free): Free inst_head.
* src/pack.c (packdup): New function.
* src/pack.h (packdup): New proto.
-rw-r--r-- | NEWS | 4 | ||||
-rw-r--r-- | configure.ac | 4 | ||||
-rw-r--r-- | src/binlog.c | 10 | ||||
-rw-r--r-- | src/binlogsel.c | 2 | ||||
-rw-r--r-- | src/pack.c | 25 | ||||
-rw-r--r-- | src/pack.h | 1 |
6 files changed, 39 insertions, 7 deletions
@@ -1,9 +1,11 @@ | |||
1 | Vmod-binlog NEWS -- history of user-visible changes. 2013-10-19 | 1 | Vmod-binlog NEWS -- history of user-visible changes. 2014-05-29 |
2 | Copyright (C) 2013 Sergey Poznyakoff | 2 | Copyright (C) 2013 Sergey Poznyakoff |
3 | See the end of file for copying conditions. | 3 | See the end of file for copying conditions. |
4 | 4 | ||
5 | Please send Vmod-binlog bug reports to <gray@gnu.org> | 5 | Please send Vmod-binlog bug reports to <gray@gnu.org> |
6 | 6 | ||
7 | Version 1,0.90 (Git) | ||
8 | |||
7 | Version 1.0, 2013-10-19 | 9 | Version 1.0, 2013-10-19 |
8 | 10 | ||
9 | Initial release. | 11 | Initial release. |
diff --git a/configure.ac b/configure.ac index 692b052..3d80940 100644 --- a/configure.ac +++ b/configure.ac | |||
@@ -1,5 +1,5 @@ | |||
1 | # This file is part of vmod-binlog | 1 | # This file is part of vmod-binlog |
2 | # Copyright (C) 2013 Sergey Poznyakoff | 2 | # Copyright (C) 2013, 2014 Sergey Poznyakoff |
3 | # | 3 | # |
4 | # Vmod-binlog is free software; you can redistribute it and/or modify | 4 | # Vmod-binlog is free software; you can redistribute it and/or modify |
5 | # it under the terms of the GNU General Public License as published by | 5 | # it under the terms of the GNU General Public License as published by |
@@ -14,7 +14,7 @@ | |||
14 | # You should have received a copy of the GNU General Public License | 14 | # You should have received a copy of the GNU General Public License |
15 | # along with vmod-binlog. If not, see <http://www.gnu.org/licenses/>. | 15 | # along with vmod-binlog. If not, see <http://www.gnu.org/licenses/>. |
16 | AC_PREREQ(2.69) | 16 | AC_PREREQ(2.69) |
17 | AC_INIT([vmod-binlog], 1.0, [gray@gnu.org]) | 17 | AC_INIT([vmod-binlog], 1.0.90, [gray@gnu.org]) |
18 | AC_CONFIG_AUX_DIR([build-aux]) | 18 | AC_CONFIG_AUX_DIR([build-aux]) |
19 | AC_CONFIG_MACRO_DIR([m4]) | 19 | AC_CONFIG_MACRO_DIR([m4]) |
20 | AC_CONFIG_SRCDIR(src/binlog.c) | 20 | AC_CONFIG_SRCDIR(src/binlog.c) |
diff --git a/src/binlog.c b/src/binlog.c index 4c3f40e..45299f2 100644 --- a/src/binlog.c +++ b/src/binlog.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* This file is part of vmod-binlog | 1 | /* This file is part of vmod-binlog |
2 | Copyright (C) 2013 Sergey Poznyakoff | 2 | Copyright (C) 2013, 2014 Sergey Poznyakoff |
3 | 3 | ||
4 | Vmod-binlog is free software; you can redistribute it and/or modify | 4 | Vmod-binlog is free software; you can redistribute it and/or modify |
5 | it under the terms of the GNU General Public License as published by | 5 | it under the terms of the GNU General Public License as published by |
@@ -72,6 +72,7 @@ struct binlog_env { | |||
72 | enum binlog_state state; /* binlog machine state */ | 72 | enum binlog_state state; /* binlog machine state */ |
73 | struct binlog_config *conf; | 73 | struct binlog_config *conf; |
74 | time_t timestamp; /* timestamp for the entry being built */ | 74 | time_t timestamp; /* timestamp for the entry being built */ |
75 | struct packinst *inst_head; /* compiled format */ | ||
75 | struct packinst *inst_cur; /* current instruction */ | 76 | struct packinst *inst_cur; /* current instruction */ |
76 | struct packenv *env; /* pack environment */ | 77 | struct packenv *env; /* pack environment */ |
77 | }; | 78 | }; |
@@ -121,12 +122,14 @@ void | |||
121 | binlog_env_init(struct binlog_env *ep, struct binlog_config *conf, time_t ts) | 122 | binlog_env_init(struct binlog_env *ep, struct binlog_config *conf, time_t ts) |
122 | { | 123 | { |
123 | if (!ep->env) { | 124 | if (!ep->env) { |
124 | ep->env = packenv_create(packsize(conf->inst_head)); | 125 | ep->inst_head = packdup(conf->inst_head); |
126 | AN(ep->inst_head); | ||
127 | ep->env = packenv_create(packsize(ep->inst_head)); | ||
125 | AN(ep->env); | 128 | AN(ep->env); |
126 | } | 129 | } |
127 | packenv_init(ep->env); | 130 | packenv_init(ep->env); |
128 | ep->state = state_start; | 131 | ep->state = state_start; |
129 | ep->inst_cur = packinit(conf->inst_head); | 132 | ep->inst_cur = packinit(ep->inst_head); |
130 | ep->timestamp = ts; | 133 | ep->timestamp = ts; |
131 | } | 134 | } |
132 | 135 | ||
@@ -247,6 +250,7 @@ static void | |||
247 | env_free(void *f) | 250 | env_free(void *f) |
248 | { | 251 | { |
249 | struct binlog_env *ep = f; | 252 | struct binlog_env *ep = f; |
253 | packfree(ep->inst_head); | ||
250 | packenv_free(ep->env); | 254 | packenv_free(ep->env); |
251 | free(ep); | 255 | free(ep); |
252 | } | 256 | } |
diff --git a/src/binlogsel.c b/src/binlogsel.c index fad0881..da04636 100644 --- a/src/binlogsel.c +++ b/src/binlogsel.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* This file is part of vmod-binlog | 1 | /* This file is part of vmod-binlog |
2 | Copyright (C) 2013 Sergey Poznyakoff | 2 | Copyright (C) 2013, 2014 Sergey Poznyakoff |
3 | 3 | ||
4 | Vmod-binlog is free software; you can redistribute it and/or modify | 4 | Vmod-binlog is free software; you can redistribute it and/or modify |
5 | it under the terms of the GNU General Public License as published by | 5 | it under the terms of the GNU General Public License as published by |
@@ -714,6 +714,31 @@ packcomp(const char *s, char **endp) | |||
714 | return head; | 714 | return head; |
715 | } | 715 | } |
716 | 716 | ||
717 | struct packinst * | ||
718 | packdup(struct packinst *src) | ||
719 | { | ||
720 | struct packinst *head = NULL, *tail = NULL, *p; | ||
721 | |||
722 | for (; src; src = src->next) { | ||
723 | p = malloc(sizeof(*p)); | ||
724 | if (!p) { | ||
725 | packfree(head); | ||
726 | errno = ENOMEM; | ||
727 | return NULL; | ||
728 | } | ||
729 | p->next = NULL; | ||
730 | p->spec = src->spec; | ||
731 | p->rep = src->rep; | ||
732 | p->cur = src->cur; | ||
733 | if (tail) | ||
734 | tail->next = p; | ||
735 | else | ||
736 | head = p; | ||
737 | tail = p; | ||
738 | } | ||
739 | return head; | ||
740 | } | ||
741 | |||
717 | void | 742 | void |
718 | packfree(struct packinst *pi) | 743 | packfree(struct packinst *pi) |
719 | { | 744 | { |
@@ -29,6 +29,7 @@ struct packenv { | |||
29 | struct packinst; | 29 | struct packinst; |
30 | 30 | ||
31 | struct packinst *packcomp(const char *s, char **endp); | 31 | struct packinst *packcomp(const char *s, char **endp); |
32 | struct packinst *packdup(struct packinst *s); | ||
32 | void packfree(struct packinst *pi); | 33 | void packfree(struct packinst *pi); |
33 | struct packinst *packinit(struct packinst *pi); | 34 | struct packinst *packinit(struct packinst *pi); |
34 | void packin(struct packinst *pi, struct packenv *env); | 35 | void packin(struct packinst *pi, struct packenv *env); |