]> sigrok.org Git - libsigrok.git/commitdiff
Use GVariant for sr_config_*() functions
authorBert Vermeulen <redacted>
Mon, 25 Mar 2013 14:38:44 +0000 (15:38 +0100)
committerBert Vermeulen <redacted>
Thu, 11 Apr 2013 16:32:06 +0000 (18:32 +0200)
sr_config_get() provides a GVariant owned by the caller, so it must be
released with g_variant_unref() when done.

sr_config_set() takes a GVariant from the caller which may be floating;
it will be properly sunk and release after use by this function. Thus
the output of g_variant_new_*() may be used as an argument.

sr_config_list() also provides a GVariant owned by the caller, to be
unreferenced when done.

sr_config_make() can take a floating reference.

hwdriver.c
libsigrok-internal.h
libsigrok.h
proto.h

index 1d0aa46c5bb45f986877738da99d56c3d9573314..4635f3c4b7ace23bd64b39b295197e3d3d1becbf 100644 (file)
@@ -355,14 +355,15 @@ SR_PRIV void sr_hw_cleanup_all(void)
        }
 }
 
-SR_PRIV struct sr_config *sr_config_new(int key, const void *value)
+/** A floating reference can be passed in for data. */
+SR_PRIV struct sr_config *sr_config_new(int key, GVariant *data)
 {
        struct sr_config *src;
 
        if (!(src = g_try_malloc(sizeof(struct sr_config))))
                return NULL;
        src->key = key;
-       src->value = value;
+       src->data = g_variant_ref_sink(data);
 
        return src;
 }
@@ -372,9 +373,14 @@ SR_PRIV struct sr_config *sr_config_new(int key, const void *value)
  *
  * @param driver The sr_dev_driver struct to query.
  * @param key The configuration key (SR_CONF_*).
- * @param data Pointer where the value will be stored. Must not be NULL.
- * @param sdi If the key is specific to a device, this must contain a
- *            pointer to the struct sr_dev_inst to be checked.
+ * @param data Pointer to a GVariant where the value will be stored. Must
+ *             not be NULL. The caller is given ownership of the GVariant
+ *             and must thus decrease the refcount after use. However if
+ *             this function returns an error code, the field should be
+ *             considered unused, and should not be unreferenced.
+ * @param sdi (optional) If the key is specific to a device, this must
+ *            contain a pointer to the struct sr_dev_inst to be checked.
+ *            Otherwise it must be NULL.
  *
  * @return SR_OK upon success or SR_ERR in case of error. Note SR_ERR_ARG
  *         may be returned by the driver indicating it doesn't know that key,
@@ -382,14 +388,18 @@ SR_PRIV struct sr_config *sr_config_new(int key, const void *value)
  *         as an indication that it's not applicable.
  */
 SR_API int sr_config_get(const struct sr_dev_driver *driver, int key,
-               const void **data, const struct sr_dev_inst *sdi)
+               GVariant **data, const struct sr_dev_inst *sdi)
 {
        int ret;
 
        if (!driver || !data)
                return SR_ERR;
 
-       ret = driver->config_get(key, data, sdi);
+       if ((ret = driver->config_get(key, data, sdi)) == SR_OK) {
+               /* Got a floating reference from the driver. Sink it here,
+                * caller will need to unref when done with it. */
+               g_variant_ref_sink(*data);
+       }
 
        return ret;
 }
@@ -399,26 +409,29 @@ SR_API int sr_config_get(const struct sr_dev_driver *driver, int key,
  *
  * @param sdi The device instance.
  * @param key The configuration key (SR_CONF_*).
- * @param value The new value for the key, as a pointer to whatever type
- *        is appropriate for that key.
+ * @param data The new value for the key, as a GVariant with GVariantType
+ *        appropriate to that key. A floating reference can be passed
+ *        in; its refcount will be sunk and unreferenced after use.
  *
  * @return SR_OK upon success or SR_ERR in case of error. Note SR_ERR_ARG
  *         may be returned by the driver indicating it doesn't know that key,
  *         but this is not to be flagged as an error by the caller; merely
  *         as an indication that it's not applicable.
  */
-SR_API int sr_config_set(const struct sr_dev_inst *sdi, int key,
-               const void *value)
+SR_API int sr_config_set(const struct sr_dev_inst *sdi, int key, GVariant *data)
 {
        int ret;
 
-       if (!sdi || !sdi->driver || !value)
-               return SR_ERR;
+       g_variant_ref_sink(data);
 
-       if (!sdi->driver->config_set)
-               return SR_ERR_ARG;
+       if (!sdi || !sdi->driver || !data)
+               ret = SR_ERR;
+       else if (!sdi->driver->config_set)
+               ret = SR_ERR_ARG;
+       else
+               ret = sdi->driver->config_set(key, data, sdi);
 
-       ret = sdi->driver->config_set(key, value, sdi);
+       g_variant_unref(data);
 
        return ret;
 }
@@ -428,10 +441,13 @@ SR_API int sr_config_set(const struct sr_dev_inst *sdi, int key,
  *
  * @param driver The sr_dev_driver struct to query.
  * @param key The configuration key (SR_CONF_*).
- * @param data A pointer to a list of values, in whatever format is
- *             appropriate for that key.
- * @param sdi If the key is specific to a device, this must contain a
- *            pointer to the struct sr_dev_inst to be checked.
+ * @param data A pointer to a GVariant where the list will be stored. The
+ *             caller is given ownership of the GVariant and must thus
+ *             unref the GVariant after use. However if this function
+ *             returns an error code, the field should be considered
+ *             unused, and should not be unreferenced.
+ * @param sdi (optional) If the key is specific to a device, this must
+ *            contain a pointer to the struct sr_dev_inst to be checked.
  *
  * @return SR_OK upon success or SR_ERR in case of error. Note SR_ERR_ARG
  *         may be returned by the driver indicating it doesn't know that key,
@@ -439,14 +455,14 @@ SR_API int sr_config_set(const struct sr_dev_inst *sdi, int key,
  *         as an indication that it's not applicable.
  */
 SR_API int sr_config_list(const struct sr_dev_driver *driver, int key,
-               const void **data, const struct sr_dev_inst *sdi)
+               GVariant **data, const struct sr_dev_inst *sdi)
 {
        int ret;
 
-       if (!driver || !data)
-               return SR_ERR;
-
-       ret = driver->config_list(key, data, sdi);
+       if (!driver || !data || !driver->config_list)
+               ret = SR_ERR;
+       else if ((ret = driver->config_list(key, data, sdi)) == SR_OK)
+               g_variant_ref_sink(*data);
 
        return ret;
 }
index ff6223c64ff7adf700f5ab43969319457f5659e0..649a0a311b1d70037fb1337999b355a5c15a38da 100644 (file)
@@ -113,7 +113,7 @@ SR_PRIV void sr_serial_dev_inst_free(struct sr_serial_dev_inst *serial);
 /*--- hwdriver.c ------------------------------------------------------------*/
 
 SR_PRIV void sr_hw_cleanup_all(void);
-SR_PRIV struct sr_config *sr_config_new(int key, const void *value);
+SR_PRIV struct sr_config *sr_config_new(int key, GVariant *data);
 SR_PRIV int sr_source_remove(int fd);
 SR_PRIV int sr_source_add(int fd, int events, int timeout,
                          sr_receive_data_callback_t cb, void *cb_data);
index 6f6163b6e2c0a2b99cb2a5c1123d4d0b7967142e..351bc0a4aa6466dbf5e622d81634c5045bd798de 100644 (file)
@@ -522,7 +522,7 @@ struct sr_probe {
 
 struct sr_config {
        int key;
-       const void *value;
+       GVariant *data;
 };
 
 struct sr_config_info {
@@ -744,11 +744,11 @@ struct sr_dev_driver {
        GSList *(*scan) (GSList *options);
        GSList *(*dev_list) (void);
        int (*dev_clear) (void);
-       int (*config_get) (int id, const void **value,
+       int (*config_get) (int id, GVariant **data,
                        const struct sr_dev_inst *sdi);
-       int (*config_set) (int id, const void *value,
+       int (*config_set) (int id, GVariant *data,
                        const struct sr_dev_inst *sdi);
-       int (*config_list) (int info_id, const void **data,
+       int (*config_list) (int info_id, GVariant **data,
                        const struct sr_dev_inst *sdi);
 
        /* Device-specific */
diff --git a/proto.h b/proto.h
index ed72d4b320ea312cdcb3ce89e4f25660e90896ee..f993d605d2946942d6f708e2d940a6f1a990f4f5 100644 (file)
--- a/proto.h
+++ b/proto.h
@@ -69,11 +69,11 @@ SR_API int sr_driver_init(struct sr_context *ctx,
                struct sr_dev_driver *driver);
 SR_API GSList *sr_driver_scan(struct sr_dev_driver *driver, GSList *options);
 SR_API int sr_config_get(const struct sr_dev_driver *driver, int key,
-               const void **data, const struct sr_dev_inst *sdi);
+               GVariant **data, const struct sr_dev_inst *sdi);
 SR_API int sr_config_set(const struct sr_dev_inst *sdi, int key,
-               const void *value);
+               GVariant *data);
 SR_API int sr_config_list(const struct sr_dev_driver *driver, int key,
-               const void **data, const struct sr_dev_inst *sdi);
+               GVariant **data, const struct sr_dev_inst *sdi);
 SR_API const struct sr_config_info *sr_config_info_get(int key);
 SR_API const struct sr_config_info *sr_config_info_name_get(const char *optname);