C Rotating C buffers for IO

Here is a little program that can be used to store data in three buffers as it is acquired. Notice that the scratch pad data structure is particularly useful if you have slower IO (e.g., JSON, packets or writing to file). Among which, there is a stub main and output for your enjoyment.

/**
 * @file test_datastruct.c
 * @author Ron Brash
 *
 * @desc Datastruct functions
 * @note gcc -Wall -o test_ds datastruct.c
 *
 */

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdint.h>
#include <string.h>             /* memset */

typedef struct sample_s {
        double ts;
        double ch1;
        double ch2;
        double ch3;
        double ch4;
        double ch5;
        double ch6;
        double ch7;
        double ch8;
} sample_t;

typedef struct datastore_s {
        int cur_n_elements;
        int max_n_elements;
        sample_t *sample;
} datastore_t;

// Pointers to the dynamically allocated memory itself
datastore_t *datastore_ptr_a;
datastore_t *datastore_ptr_b;
datastore_t *datastore_ptr_c;

// Pointers to the dynamic arrays for swapping
datastore_t *datastore_ptr_cur;
datastore_t *datastore_ptr_scpad;       // scratch pad
datastore_t *datastore_ptr_past;

int test_datastore_init(int max_samples)
{
        datastore_ptr_a = (datastore_t *) malloc(sizeof(datastore_t));
        if (datastore_ptr_a == NULL) {
                fprintf(stdout, "error mallocing datastore A\n");
        }
        datastore_ptr_a->sample = malloc(sizeof(sample_t) * max_samples);
        if (datastore_ptr_a == NULL) {
                fprintf(stdout, "error mallocing datastore A sample\n");
        }
        datastore_ptr_a->cur_n_elements = 0;
        datastore_ptr_a->max_n_elements = max_samples;
        memset(datastore_ptr_a->sample, 0, sizeof(sample_t) * max_samples);

        datastore_ptr_b = (datastore_t *) malloc(sizeof(datastore_t));
        if (datastore_ptr_b == NULL) {
                fprintf(stdout, "error mallocing datastore B\n");
        }
        datastore_ptr_b->sample = (sample_t *) malloc(sizeof(sample_t) * max_samples);
        if (datastore_ptr_b == NULL) {
                fprintf(stdout, "error mallocing datastore B samples\n");
        }
        datastore_ptr_b->cur_n_elements = 0;
        datastore_ptr_b->max_n_elements = max_samples;
        memset(datastore_ptr_b->sample, 0, sizeof(sample_t) * max_samples);

        datastore_ptr_c = (datastore_t *) malloc(sizeof(datastore_t));
        if (datastore_ptr_c == NULL) {
                fprintf(stdout, "error mallocing datastore B\n");
        }
        datastore_ptr_c->sample = (sample_t *) malloc(sizeof(sample_t) * max_samples);
        if (datastore_ptr_c == NULL) {
                fprintf(stdout, "error mallocing datastore B samples\n");
        }
        datastore_ptr_c->cur_n_elements = 0;
        datastore_ptr_c->max_n_elements = max_samples;
        memset(datastore_ptr_c->sample, 0, sizeof(sample_t) * max_samples);

        // Set current and past pointers
        datastore_ptr_cur = datastore_ptr_a;
        datastore_ptr_past = datastore_ptr_b;
        datastore_ptr_scpad = datastore_ptr_c;
        return (0);
}

static inline datastore_t *test_datastore_retrieve(void)
{
        return datastore_ptr_cur;
}

int test_datastore_cleanup()
{
        free(datastore_ptr_a);
        datastore_ptr_a = NULL;

        free(datastore_ptr_b);
        datastore_ptr_b = NULL;

        free(datastore_ptr_c);
        datastore_ptr_c = NULL;

        datastore_ptr_cur = NULL;
        datastore_ptr_scpad = NULL;
        datastore_ptr_past = NULL;

        return (0);
}

int test_datastore_rotate()
{
        if (datastore_ptr_cur == datastore_ptr_c) {

                datastore_ptr_cur = datastore_ptr_a;
                datastore_ptr_cur->cur_n_elements = 0;
                datastore_ptr_past = datastore_ptr_c;
                datastore_ptr_scpad = datastore_ptr_b;

        } else if (datastore_ptr_cur == datastore_ptr_b) {

                datastore_ptr_cur = datastore_ptr_c;
                datastore_ptr_cur->cur_n_elements = 0;
                datastore_ptr_past = datastore_ptr_b;
                datastore_ptr_scpad = datastore_ptr_a;

        } else if (datastore_ptr_cur == datastore_ptr_a) {

                datastore_ptr_cur = datastore_ptr_b;
                datastore_ptr_cur->cur_n_elements = 0;
                datastore_ptr_past = datastore_ptr_a;
                datastore_ptr_scpad = datastore_ptr_c;

        }
}

int test_datastore_insert(sample_t * new_element)
{
        if (new_element == NULL) {
                return (-1);
        }
        datastore_t *cur_store = test_datastore_retrieve();
        if (cur_store->cur_n_elements == cur_store->max_n_elements) {
                test_datastore_rotate();
                cur_store = test_datastore_retrieve();
        }
        memcpy(&(cur_store->sample[cur_store->cur_n_elements]), new_element, sizeof(sample_t));
        cur_store->cur_n_elements++;
        return (0);
}

void dump_datastore(datastore_t * ds, char *caption)
{
        int i = 0;
        printf("\n============== %s =====================\n", caption);
        for (i = 0; i < ds->cur_n_elements; i++) {
                printf("%4d,%lf,%10.2f,%10.2f,%10.2f,%10.2f,%10.2f,%10.2f,%10.2f,%10.2f\n", i,
                       ds->sample[i].ts, ds->sample[i].ch1, ds->sample[i].ch2,
                       ds->sample[i].ch3, ds->sample[i].ch4, ds->sample[i].ch5,
                       ds->sample[i].ch6, ds->sample[i].ch7, ds->sample[i].ch8);
        }
        printf("\n============== Done =====================\n");
}

int main(int argc, char **argv)
{

        // Init dstores A, B, C
        test_datastore_init(10);
        int i = 0;
        for (i = 0; i < 12; i++) {
                sample_t new_element = { 10000 + i, i, i, i, i, i, i, i, i };
                test_datastore_insert(&new_element);
        }
        dump_datastore(datastore_ptr_a, "ds a");
        dump_datastore(datastore_ptr_b, "ds b");
        dump_datastore(datastore_ptr_c, "ds c");
        for (i = 12; i < 33; i++) {
                sample_t new_element = { 10000 + i, i, i, i, i, i, i, i, i };
                test_datastore_insert(&new_element);
        }
        dump_datastore(datastore_ptr_a, "ds a");
        dump_datastore(datastore_ptr_b, "ds b");
        dump_datastore(datastore_ptr_c, "ds c");
       
        for (i = 33; i < 41; i++) {
                sample_t new_element = { 10000 + i, i, i, i, i, i, i, i, i };
                test_datastore_insert(&new_element);
        }
        dump_datastore(datastore_ptr_a, "ds a");
        dump_datastore(datastore_ptr_b, "ds b");
        dump_datastore(datastore_ptr_c, "ds c");
       
        for (i = 41; i < 51; i++) {
                sample_t new_element = { 10000 + i, i, i, i, i, i, i, i, i };
                test_datastore_insert(&new_element);
        }
        dump_datastore(datastore_ptr_a, "ds a");
        dump_datastore(datastore_ptr_b, "ds b");
        dump_datastore(datastore_ptr_c, "ds c");
       
        test_datastore_cleanup();

        return (0);
}

Sample output from stub

<a href="mailto:rbrash@moon">rbrash@moon</a>:~/Desktop$ ./test_ds

============== ds a =====================
   0,10000.000000,      0.00,      0.00,      0.00,      0.00,      0.00,      0.00,      0.00,      0.00
   1,10001.000000,      1.00,      1.00,      1.00,      1.00,      1.00,      1.00,      1.00,      1.00
   2,10002.000000,      2.00,      2.00,      2.00,      2.00,      2.00,      2.00,      2.00,      2.00
   3,10003.000000,      3.00,      3.00,      3.00,      3.00,      3.00,      3.00,      3.00,      3.00
   4,10004.000000,      4.00,      4.00,      4.00,      4.00,      4.00,      4.00,      4.00,      4.00
   5,10005.000000,      5.00,      5.00,      5.00,      5.00,      5.00,      5.00,      5.00,      5.00
   6,10006.000000,      6.00,      6.00,      6.00,      6.00,      6.00,      6.00,      6.00,      6.00
   7,10007.000000,      7.00,      7.00,      7.00,      7.00,      7.00,      7.00,      7.00,      7.00
   8,10008.000000,      8.00,      8.00,      8.00,      8.00,      8.00,      8.00,      8.00,      8.00
   9,10009.000000,      9.00,      9.00,      9.00,      9.00,      9.00,      9.00,      9.00,      9.00

============== Done =====================

============== ds b =====================
   0,10010.000000,     10.00,     10.00,     10.00,     10.00,     10.00,     10.00,     10.00,     10.00
   1,10011.000000,     11.00,     11.00,     11.00,     11.00,     11.00,     11.00,     11.00,     11.00

============== Done =====================

============== ds c =====================

============== Done =====================

============== ds a =====================
   0,10030.000000,     30.00,     30.00,     30.00,     30.00,     30.00,     30.00,     30.00,     30.00
   1,10031.000000,     31.00,     31.00,     31.00,     31.00,     31.00,     31.00,     31.00,     31.00
   2,10032.000000,     32.00,     32.00,     32.00,     32.00,     32.00,     32.00,     32.00,     32.00

============== Done =====================

============== ds b =====================
   0,10010.000000,     10.00,     10.00,     10.00,     10.00,     10.00,     10.00,     10.00,     10.00
   1,10011.000000,     11.00,     11.00,     11.00,     11.00,     11.00,     11.00,     11.00,     11.00
   2,10012.000000,     12.00,     12.00,     12.00,     12.00,     12.00,     12.00,     12.00,     12.00
   3,10013.000000,     13.00,     13.00,     13.00,     13.00,     13.00,     13.00,     13.00,     13.00
   4,10014.000000,     14.00,     14.00,     14.00,     14.00,     14.00,     14.00,     14.00,     14.00
   5,10015.000000,     15.00,     15.00,     15.00,     15.00,     15.00,     15.00,     15.00,     15.00
   6,10016.000000,     16.00,     16.00,     16.00,     16.00,     16.00,     16.00,     16.00,     16.00
   7,10017.000000,     17.00,     17.00,     17.00,     17.00,     17.00,     17.00,     17.00,     17.00
   8,10018.000000,     18.00,     18.00,     18.00,     18.00,     18.00,     18.00,     18.00,     18.00
   9,10019.000000,     19.00,     19.00,     19.00,     19.00,     19.00,     19.00,     19.00,     19.00

============== Done =====================

============== ds c =====================
   0,10020.000000,     20.00,     20.00,     20.00,     20.00,     20.00,     20.00,     20.00,     20.00
   1,10021.000000,     21.00,     21.00,     21.00,     21.00,     21.00,     21.00,     21.00,     21.00
   2,10022.000000,     22.00,     22.00,     22.00,     22.00,     22.00,     22.00,     22.00,     22.00
   3,10023.000000,     23.00,     23.00,     23.00,     23.00,     23.00,     23.00,     23.00,     23.00
   4,10024.000000,     24.00,     24.00,     24.00,     24.00,     24.00,     24.00,     24.00,     24.00
   5,10025.000000,     25.00,     25.00,     25.00,     25.00,     25.00,     25.00,     25.00,     25.00
   6,10026.000000,     26.00,     26.00,     26.00,     26.00,     26.00,     26.00,     26.00,     26.00
   7,10027.000000,     27.00,     27.00,     27.00,     27.00,     27.00,     27.00,     27.00,     27.00
   8,10028.000000,     28.00,     28.00,     28.00,     28.00,     28.00,     28.00,     28.00,     28.00
   9,10029.000000,     29.00,     29.00,     29.00,     29.00,     29.00,     29.00,     29.00,     29.00

============== Done =====================

============== ds a =====================
   0,10030.000000,     30.00,     30.00,     30.00,     30.00,     30.00,     30.00,     30.00,     30.00
   1,10031.000000,     31.00,     31.00,     31.00,     31.00,     31.00,     31.00,     31.00,     31.00
   2,10032.000000,     32.00,     32.00,     32.00,     32.00,     32.00,     32.00,     32.00,     32.00
   3,10033.000000,     33.00,     33.00,     33.00,     33.00,     33.00,     33.00,     33.00,     33.00
   4,10034.000000,     34.00,     34.00,     34.00,     34.00,     34.00,     34.00,     34.00,     34.00
   5,10035.000000,     35.00,     35.00,     35.00,     35.00,     35.00,     35.00,     35.00,     35.00
   6,10036.000000,     36.00,     36.00,     36.00,     36.00,     36.00,     36.00,     36.00,     36.00
   7,10037.000000,     37.00,     37.00,     37.00,     37.00,     37.00,     37.00,     37.00,     37.00
   8,10038.000000,     38.00,     38.00,     38.00,     38.00,     38.00,     38.00,     38.00,     38.00
   9,10039.000000,     39.00,     39.00,     39.00,     39.00,     39.00,     39.00,     39.00,     39.00

============== Done =====================

============== ds b =====================
   0,10040.000000,     40.00,     40.00,     40.00,     40.00,     40.00,     40.00,     40.00,     40.00

============== Done =====================

============== ds c =====================
   0,10020.000000,     20.00,     20.00,     20.00,     20.00,     20.00,     20.00,     20.00,     20.00
   1,10021.000000,     21.00,     21.00,     21.00,     21.00,     21.00,     21.00,     21.00,     21.00
   2,10022.000000,     22.00,     22.00,     22.00,     22.00,     22.00,     22.00,     22.00,     22.00
   3,10023.000000,     23.00,     23.00,     23.00,     23.00,     23.00,     23.00,     23.00,     23.00
   4,10024.000000,     24.00,     24.00,     24.00,     24.00,     24.00,     24.00,     24.00,     24.00
   5,10025.000000,     25.00,     25.00,     25.00,     25.00,     25.00,     25.00,     25.00,     25.00
   6,10026.000000,     26.00,     26.00,     26.00,     26.00,     26.00,     26.00,     26.00,     26.00
   7,10027.000000,     27.00,     27.00,     27.00,     27.00,     27.00,     27.00,     27.00,     27.00
   8,10028.000000,     28.00,     28.00,     28.00,     28.00,     28.00,     28.00,     28.00,     28.00
   9,10029.000000,     29.00,     29.00,     29.00,     29.00,     29.00,     29.00,     29.00,     29.00

============== Done =====================

============== ds a =====================
   0,10030.000000,     30.00,     30.00,     30.00,     30.00,     30.00,     30.00,     30.00,     30.00
   1,10031.000000,     31.00,     31.00,     31.00,     31.00,     31.00,     31.00,     31.00,     31.00
   2,10032.000000,     32.00,     32.00,     32.00,     32.00,     32.00,     32.00,     32.00,     32.00
   3,10033.000000,     33.00,     33.00,     33.00,     33.00,     33.00,     33.00,     33.00,     33.00
   4,10034.000000,     34.00,     34.00,     34.00,     34.00,     34.00,     34.00,     34.00,     34.00
   5,10035.000000,     35.00,     35.00,     35.00,     35.00,     35.00,     35.00,     35.00,     35.00
   6,10036.000000,     36.00,     36.00,     36.00,     36.00,     36.00,     36.00,     36.00,     36.00
   7,10037.000000,     37.00,     37.00,     37.00,     37.00,     37.00,     37.00,     37.00,     37.00
   8,10038.000000,     38.00,     38.00,     38.00,     38.00,     38.00,     38.00,     38.00,     38.00
   9,10039.000000,     39.00,     39.00,     39.00,     39.00,     39.00,     39.00,     39.00,     39.00

============== Done =====================

============== ds b =====================
   0,10040.000000,     40.00,     40.00,     40.00,     40.00,     40.00,     40.00,     40.00,     40.00
   1,10041.000000,     41.00,     41.00,     41.00,     41.00,     41.00,     41.00,     41.00,     41.00
   2,10042.000000,     42.00,     42.00,     42.00,     42.00,     42.00,     42.00,     42.00,     42.00
   3,10043.000000,     43.00,     43.00,     43.00,     43.00,     43.00,     43.00,     43.00,     43.00
   4,10044.000000,     44.00,     44.00,     44.00,     44.00,     44.00,     44.00,     44.00,     44.00
   5,10045.000000,     45.00,     45.00,     45.00,     45.00,     45.00,     45.00,     45.00,     45.00
   6,10046.000000,     46.00,     46.00,     46.00,     46.00,     46.00,     46.00,     46.00,     46.00
   7,10047.000000,     47.00,     47.00,     47.00,     47.00,     47.00,     47.00,     47.00,     47.00
   8,10048.000000,     48.00,     48.00,     48.00,     48.00,     48.00,     48.00,     48.00,     48.00
   9,10049.000000,     49.00,     49.00,     49.00,     49.00,     49.00,     49.00,     49.00,     49.00

============== Done =====================

============== ds c =====================
   0,10050.000000,     50.00,     50.00,     50.00,     50.00,     50.00,     50.00,     50.00,     50.00

============== Done =====================

Blog tags: 

Add new comment

Filtered HTML

  • Web page addresses and e-mail addresses turn into links automatically.
  • Allowed HTML tags: <a> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd> <python> <c>
  • Lines and paragraphs break automatically.

Plain text

  • No HTML tags allowed.
  • Web page addresses and e-mail addresses turn into links automatically.
  • Lines and paragraphs break automatically.
CAPTCHA
This question is for testing whether you are a human visitor and to prevent automated spam submissions.