summaryrefslogtreecommitdiffstats
path: root/dive.c
diff options
context:
space:
mode:
authorGravatar Linus Torvalds <torvalds@linux-foundation.org>2012-11-23 16:05:38 -1000
committerGravatar Dirk Hohndel <dirk@hohndel.org>2012-11-23 19:33:39 -0800
commita9786564c23fbf032f47096f543699c8c402785b (patch)
tree551231e54e017c9e83fd44da59edbe4c94dfa716 /dive.c
parent10ce60e2120419282ff7694e8deda60e94832aa1 (diff)
downloadsubsurface-a9786564c23fbf032f47096f543699c8c402785b.tar.gz
Allocate dive samples separately from 'struct dive'
We used to avoid some extra allocations by just allocating the dive samples as part of the 'struct dive' allocation itself, but that ends up complicating things, and will make it impossible to have multiple different sets of samples (for multiple dive computers). So stop doing it. Just allocate the dive samples array separately. Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
Diffstat (limited to 'dive.c')
-rw-r--r--dive.c52
1 files changed, 23 insertions, 29 deletions
diff --git a/dive.c b/dive.c
index c76b71056..ebf121643 100644
--- a/dive.c
+++ b/dive.c
@@ -145,36 +145,30 @@ double get_weight_units(unsigned int grams, int *frac, const char **units)
struct dive *alloc_dive(void)
{
- const int initial_samples = 5;
- unsigned int size;
struct dive *dive;
- size = dive_size(initial_samples);
- dive = malloc(size);
+ dive = malloc(sizeof(*dive));
if (!dive)
exit(1);
- memset(dive, 0, size);
- dive->alloc_samples = initial_samples;
+ memset(dive, 0, sizeof(*dive));
return dive;
}
-struct sample *prepare_sample(struct dive **divep)
+struct sample *prepare_sample(struct dive *dive)
{
- struct dive *dive = *divep;
if (dive) {
int nr = dive->samples;
int alloc_samples = dive->alloc_samples;
struct sample *sample;
if (nr >= alloc_samples) {
- unsigned int size;
+ struct sample *newsamples;
alloc_samples = (alloc_samples * 3)/2 + 10;
- size = dive_size(alloc_samples);
- dive = realloc(dive, size);
- if (!dive)
+ newsamples = realloc(dive->sample, alloc_samples * sizeof(struct sample));
+ if (!newsamples)
return NULL;
dive->alloc_samples = alloc_samples;
- *divep = dive;
+ dive->sample = newsamples;
}
sample = dive->sample + nr;
memset(sample, 0, sizeof(*sample));
@@ -593,16 +587,16 @@ struct dive *fixup_dive(struct dive *dive)
#define MERGE_MAX_PREFDL(res, dl, a, b, n) res->n = (dl && dl->n) ? dl->n : MAX(a->n, b->n)
#define MERGE_MIN_PREFDL(res, dl, a, b, n) res->n = (dl && dl->n) ? dl->n : (a->n)?(b->n)?MIN(a->n, b->n):(a->n):(b->n)
-static struct dive *add_sample(struct sample *sample, int time, struct dive *dive)
+static struct sample *add_sample(struct sample *sample, int time, struct dive *dive)
{
- struct sample *p = prepare_sample(&dive);
+ struct sample *p = prepare_sample(dive);
- if (!p)
- return NULL;
- *p = *sample;
- p->time.seconds = time;
- finish_sample(dive);
- return dive;
+ if (p) {
+ *p = *sample;
+ p->time.seconds = time;
+ finish_sample(dive);
+ }
+ return p;
}
/*
@@ -613,18 +607,18 @@ static struct dive *add_sample(struct sample *sample, int time, struct dive *div
* that the time in between the dives is at the surface, not some "last
* sample that happened to be at a depth of 1.2m".
*/
-static struct dive *merge_one_sample(struct sample *sample, int time, struct dive *dive)
+static void merge_one_sample(struct sample *sample, int time, struct dive *dive)
{
int last = dive->samples-1;
if (last >= 0) {
static struct sample surface;
int last_time = dive->sample[last].time.seconds;
if (time > last_time + 60) {
- dive = add_sample(&surface, last_time+20, dive);
- dive = add_sample(&surface, time - 20, dive);
+ add_sample(&surface, last_time+20, dive);
+ add_sample(&surface, time - 20, dive);
}
}
- return add_sample(sample, time, dive);
+ add_sample(sample, time, dive);
}
@@ -670,7 +664,7 @@ static struct dive *merge_samples(struct dive *res, struct dive *a, struct dive
/* Only samples from a? */
if (bt < 0) {
add_sample_a:
- res = merge_one_sample(as, at, res);
+ merge_one_sample(as, at, res);
as++;
asamples--;
continue;
@@ -679,7 +673,7 @@ add_sample_a:
/* Only samples from b? */
if (at < 0) {
add_sample_b:
- res = merge_one_sample(bs, bt, res);
+ merge_one_sample(bs, bt, res);
bs++;
bsamples--;
continue;
@@ -701,7 +695,7 @@ add_sample_b:
if (as->cylinderindex)
sample.cylinderindex = as->cylinderindex;
- res = merge_one_sample(&sample, at, res);
+ merge_one_sample(&sample, at, res);
as++;
bs++;
@@ -717,7 +711,7 @@ static struct dive *copy_samples(struct dive *res, struct dive *src)
while (samples) {
if (!res)
return NULL;
- res = add_sample(s, s->time.seconds, res);
+ add_sample(s, s->time.seconds, res);
s++;
samples--;
}