projects
/
babeltrace.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Adding a test which do a sequence of seek BEGIN, LAST, BEGIN, LAST
[babeltrace.git]
/
formats
/
ctf
/
types
/
float.c
diff --git
a/formats/ctf/types/float.c
b/formats/ctf/types/float.c
index 9ad4e602f0df705276ee45bbf92cfe7b154e921e..782f72bfef514433303a9c232188e86bee4f4e80 100644
(file)
--- a/
formats/ctf/types/float.c
+++ b/
formats/ctf/types/float.c
@@
-25,6
+25,7
@@
#include <float.h> /* C99 floating point definitions */
#include <limits.h> /* C99 limits */
#include <babeltrace/endian.h>
#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.
/*
* This library is limited to binary representation of floating point values.
@@
-58,13
+59,35
@@
union doubleIEEE754 {
#endif
};
#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 {
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,
int _ctf_float_copy(struct stream_pos *destp,
struct definition_float *dest_definition,
struct stream_pos *srcp,
@@
-148,6
+171,7
@@
int ctf_float_read(struct stream_pos *ppos, struct definition *definition)
struct mmap_align mma;
int ret;
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(
switch (float_declaration->mantissa->len + 1) {
case FLT_MANT_DIG:
tmpdef = static_float_declaration->p.definition_new(
@@
-160,7
+184,8
@@
int ctf_float_read(struct stream_pos *ppos, struct definition *definition)
NULL, 0, 0, "__tmpfloat");
break;
default:
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));
}
tmpfloat = container_of(tmpdef, struct definition_float, p);
memset(&destp, 0, sizeof(destp));
@@
-178,9
+203,14
@@
int ctf_float_read(struct stream_pos *ppos, struct definition *definition)
float_definition->value = u.vd;
break;
default:
float_definition->value = u.vd;
break;
default:
- return -EINVAL;
+ ret = -EINVAL;
+ goto end_unref;
}
}
+
+end_unref:
definition_unref(tmpdef);
definition_unref(tmpdef);
+end:
+ float_unlock();
return ret;
}
return ret;
}
@@
-198,6
+228,7
@@
int ctf_float_write(struct stream_pos *ppos, struct definition *definition)
struct mmap_align mma;
int ret;
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(
switch (float_declaration->mantissa->len + 1) {
case FLT_MANT_DIG:
tmpdef = static_float_declaration->p.definition_new(
@@
-210,7
+241,8
@@
int ctf_float_write(struct stream_pos *ppos, struct definition *definition)
NULL, 0, 0, "__tmpfloat");
break;
default:
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);
}
tmpfloat = container_of(tmpdef, struct definition_float, p);
ctf_init_pos(&srcp, -1, O_RDONLY);
@@
-225,11
+257,16
@@
int ctf_float_write(struct stream_pos *ppos, struct definition *definition)
u.vd = float_definition->value;
break;
default:
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);
}
ctf_align_pos(pos, float_declaration->p.alignment);
ret = _ctf_float_copy(ppos, float_definition, &srcp.parent, tmpfloat);
+
+end_unref:
definition_unref(tmpdef);
definition_unref(tmpdef);
+end:
+ float_unlock();
return ret;
}
return ret;
}
This page took
0.036285 seconds
and
4
git commands to generate.