X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=datastore.c;h=31dc770ecec3970ee3a3cad30e5c062d65bd5f02;hb=6c29007211e3a35bb90db53cd22042f04fbe4e44;hp=443ab1539d96c0bbf920f8da369488f9905cd684;hpb=1b452b8510922bac08db87f8ea769515c795e22f;p=libsigrok.git diff --git a/datastore.c b/datastore.c index 443ab153..31dc770e 100644 --- a/datastore.c +++ b/datastore.c @@ -25,26 +25,37 @@ static gpointer new_chunk(struct datastore **ds); -struct datastore *datastore_new(int unitsize) +int datastore_new(int unitsize, struct datastore **ds) { - struct datastore *ds; + if (!ds) + return SR_ERR; - ds = g_malloc(sizeof(struct datastore)); - ds->ds_unitsize = unitsize; - ds->num_units = 0; - ds->chunklist = NULL; + if (unitsize <= 0) + return SR_ERR; /* TODO: Different error? */ - return ds; + if (!(*ds = g_malloc(sizeof(struct datastore)))) + return SR_ERR_MALLOC; + + (*ds)->ds_unitsize = unitsize; + (*ds)->num_units = 0; + (*ds)->chunklist = NULL; + + return SR_OK; } -void datastore_destroy(struct datastore *ds) +int datastore_destroy(struct datastore *ds) { GSList *chunk; + if (!ds) + return SR_ERR; + for (chunk = ds->chunklist; chunk; chunk = chunk->next) g_free(chunk->data); g_slist_free(ds->chunklist); g_free(ds); + + return SR_OK; } void datastore_put(struct datastore *ds, void *data, unsigned int length, @@ -54,7 +65,7 @@ void datastore_put(struct datastore *ds, void *data, unsigned int length, int capacity, size, num_chunks, chunk_bytes_free, chunk_offset; gpointer chunk; - /* QUICK HACK */ + /* Avoid compiler warnings. */ in_unitsize = in_unitsize; probelist = probelist; @@ -93,7 +104,9 @@ static gpointer new_chunk(struct datastore **ds) { gpointer chunk; - chunk = g_malloc(DATASTORE_CHUNKSIZE * (*ds)->ds_unitsize); + if (!(chunk = malloc(DATASTORE_CHUNKSIZE * (*ds)->ds_unitsize))) + return NULL; + (*ds)->chunklist = g_slist_append((*ds)->chunklist, chunk); return chunk;