]> sigrok.org Git - libsigrok.git/blobdiff - datastore.c
sr: fx2lafw: Forgot to add (C) line to fx2lafw.h in recent commit.
[libsigrok.git] / datastore.c
index 30d1d9b3f535b3fd91683f3926644812912278b0..36bde28105e24d1ec5d4b3cd570ac23934b6c329 100644 (file)
@@ -96,8 +96,7 @@ SR_API int sr_datastore_destroy(struct sr_datastore *ds)
                g_free(chunk->data);
        g_slist_free(ds->chunklist);
        g_free(ds);
-
-       /* TODO: Set ds = NULL? */
+       ds = NULL;
 
        return SR_OK;
 }
@@ -111,7 +110,6 @@ SR_API int sr_datastore_destroy(struct sr_datastore *ds)
  *       of struct sr_datastore (instead of hardcoding DATASTORE_CHUNKSIZE).
  * TODO: in_unitsize and probelist are unused?
  * TODO: A few of the parameters can be const.
- * TODO: Handle new_chunk() returning NULL.
  * TODO: Ideally, 'ds' should be unmodified upon errors.
  *
  * @param ds Pointer to the datastore which shall receive the data.
@@ -130,16 +128,12 @@ SR_API int sr_datastore_destroy(struct sr_datastore *ds)
  *         is returned, the value/state of 'ds' is undefined.
  */
 SR_API int sr_datastore_put(struct sr_datastore *ds, void *data,
-               unsigned int length, int in_unitsize, int *probelist)
+               unsigned int length, int in_unitsize, const int *probelist)
 {
        unsigned int stored;
        int capacity, size, num_chunks, chunk_bytes_free, chunk_offset;
        gpointer chunk;
 
-       /* Avoid compiler warnings. */
-       (void)in_unitsize;
-       (void)probelist;
-
        if (!ds) {
                sr_err("ds: %s: ds was NULL", __func__);
                return SR_ERR_ARG;
@@ -168,10 +162,14 @@ SR_API int sr_datastore_put(struct sr_datastore *ds, void *data,
        }
 
        /* Get the last chunk in the list, or create a new one if needed. */
-       if (ds->chunklist == NULL)
-               chunk = new_chunk(&ds);
-       else
+       if (ds->chunklist == NULL) {
+               if (!(chunk = new_chunk(&ds))) {
+                       sr_err("ds: %s: couldn't allocate new chunk", __func__);
+                       return SR_ERR_MALLOC;
+               }
+       } else {
                chunk = g_slist_last(ds->chunklist)->data;
+       }
 
        /* Get/calculate number of chunks, free space, etc. */
        num_chunks = g_slist_length(ds->chunklist);
@@ -184,7 +182,11 @@ SR_API int sr_datastore_put(struct sr_datastore *ds, void *data,
        while (stored < length) {
                /* No more free space left, allocate a new chunk. */
                if (chunk_bytes_free == 0) {
-                       chunk = new_chunk(&ds);
+                       if (!(chunk = new_chunk(&ds))) {
+                               sr_err("ds: %s: couldn't allocate new chunk",
+                                      __func__);
+                               return SR_ERR_MALLOC;
+                       }
                        chunk_bytes_free = DATASTORE_CHUNKSIZE;
                        chunk_offset = 0;
                }
@@ -226,10 +228,7 @@ static gpointer new_chunk(struct sr_datastore **ds)
 {
        gpointer chunk;
 
-       if (!ds) {
-               sr_err("ds: %s: ds was NULL", __func__);
-               return NULL; /* TODO: SR_ERR_ARG later? */
-       }
+       /* Note: Caller checked that ds != NULL. */
 
        chunk = g_try_malloc0(DATASTORE_CHUNKSIZE * (*ds)->ds_unitsize);
        if (!chunk) {