Add missing permission notice in each source file
[babeltrace.git] / formats / ctf / types / float.c
index 7a7c323afc674bf689596b95a28fd5f7a76a01ad..0cf9caeb6c7795212c53dc7d540c1a9fdd53b36e 100644 (file)
  * The above copyright notice and this permission notice shall be included in
  * all copies or substantial portions of the Software.
  *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
  * Reference: ISO C99 standard 5.2.4
  */
 
@@ -25,6 +33,7 @@
 #include <float.h>     /* C99 floating point definitions */
 #include <limits.h>    /* C99 limits */
 #include <babeltrace/endian.h>
+#include <pthread.h>
 
 /*
  * This library is limited to binary representation of floating point values.
@@ -58,13 +67,35 @@ union doubleIEEE754 {
 #endif
 };
 
+/*
+ * This mutex protects the static temporary float and double
+ * declarations (static_float_declaration and static_double_declaration).
+ */
+static pthread_mutex_t float_mutex = PTHREAD_MUTEX_INITIALIZER;
+
 static struct declaration_float *static_float_declaration,
                *static_double_declaration;
 
 struct pos_len {
-       size_t sign_start, exp_start, mantissa_start, len;
+       size_t len;
 };
 
+static void float_lock(void)
+{
+       int ret;
+
+       ret = pthread_mutex_lock(&float_mutex);
+       assert(!ret);
+}
+
+static void float_unlock(void)
+{
+       int ret;
+
+       ret = pthread_mutex_unlock(&float_mutex);
+       assert(!ret);
+}
+
 int _ctf_float_copy(struct stream_pos *destp,
                    struct definition_float *dest_definition,
                    struct stream_pos *srcp,
@@ -148,6 +179,7 @@ int ctf_float_read(struct stream_pos *ppos, struct definition *definition)
        struct mmap_align mma;
        int ret;
 
+       float_lock();
        switch (float_declaration->mantissa->len + 1) {
        case FLT_MANT_DIG:
                tmpdef = static_float_declaration->p.definition_new(
@@ -160,9 +192,11 @@ int ctf_float_read(struct stream_pos *ppos, struct definition *definition)
                                NULL, 0, 0, "__tmpfloat");
                break;
        default:
-               return -EINVAL;
+               ret = -EINVAL;
+               goto end;
        }
        tmpfloat = container_of(tmpdef, struct definition_float, p);
+       memset(&destp, 0, sizeof(destp));
        ctf_init_pos(&destp, -1, O_RDWR);
        mmap_align_set_addr(&mma, (char *) u.bits);
        destp.base_mma = &mma;
@@ -177,9 +211,14 @@ int ctf_float_read(struct stream_pos *ppos, struct definition *definition)
                float_definition->value = u.vd;
                break;
        default:
-               return -EINVAL;
+               ret = -EINVAL;
+               goto end_unref;
        }
+
+end_unref:
        definition_unref(tmpdef);
+end:
+       float_unlock();
        return ret;
 }
 
@@ -197,6 +236,7 @@ int ctf_float_write(struct stream_pos *ppos, struct definition *definition)
        struct mmap_align mma;
        int ret;
 
+       float_lock();
        switch (float_declaration->mantissa->len + 1) {
        case FLT_MANT_DIG:
                tmpdef = static_float_declaration->p.definition_new(
@@ -209,7 +249,8 @@ int ctf_float_write(struct stream_pos *ppos, struct definition *definition)
                                NULL, 0, 0, "__tmpfloat");
                break;
        default:
-               return -EINVAL;
+               ret = -EINVAL;
+               goto end;
        }
        tmpfloat = container_of(tmpdef, struct definition_float, p);
        ctf_init_pos(&srcp, -1, O_RDONLY);
@@ -224,11 +265,16 @@ int ctf_float_write(struct stream_pos *ppos, struct definition *definition)
                u.vd = float_definition->value;
                break;
        default:
-               return -EINVAL;
+               ret = -EINVAL;
+               goto end_unref;
        }
        ctf_align_pos(pos, float_declaration->p.alignment);
        ret = _ctf_float_copy(ppos, float_definition, &srcp.parent, tmpfloat);
+
+end_unref:
        definition_unref(tmpdef);
+end:
+       float_unlock();
        return ret;
 }
 
This page took 0.023751 seconds and 4 git commands to generate.