]> sigrok.org Git - libsigrok.git/commitdiff
sr_driver_init(): Improve checks.
authorUwe Hermann <redacted>
Mon, 28 Jan 2013 18:36:16 +0000 (19:36 +0100)
committerUwe Hermann <redacted>
Tue, 29 Jan 2013 11:56:02 +0000 (12:56 +0100)
Check the relevant arguments for != NULL before calling the actual
driver-specific function, so that the driver can safely assume those
arguments are non-NULL. This removes the need to duplicate these
checks in every driver.

Also, change one SR_ERR to the more correct SR_ERR_MALLOC, and assign
sr_ctx in the rigol-ds1xx2's hw_init() function, like all the other
drivers do.

hardware/asix-sigma/asix-sigma.c
hardware/colead-slm/api.c
hardware/demo/demo.c
hardware/openbench-logic-sniffer/api.c
hardware/rigol-ds1xx2/api.c
hardware/victor-dmm/api.c
hardware/zeroplus-logic-cube/zeroplus.c
hwdriver.c

index 667df3a32f183ab1e60e33e03ce087b7ec35252e..ec50a2b257ee734ee84804f4519fc6784c76d089 100644 (file)
@@ -426,6 +426,7 @@ static int hw_init(struct sr_context *sr_ctx)
                sr_err("Driver context malloc failed.");
                return SR_ERR_MALLOC;
        }
+
        drvc->sr_ctx = sr_ctx;
        di->priv = drvc;
 
index 048fdd918e84587d8be369e4a27fcc4f0c4c7bc3..fd6112d86b80b6042e3cf8c2b7414daaa68a2f53 100644 (file)
@@ -78,7 +78,7 @@ static int hw_init(struct sr_context *sr_ctx)
 
        if (!(drvc = g_try_malloc0(sizeof(struct drv_context)))) {
                sr_err("Driver context malloc failed.");
-               return SR_ERR;
+               return SR_ERR_MALLOC;
        }
 
        drvc->sr_ctx = sr_ctx;
index df6a2543bad4d2190ba05d1a5f892c3f50cab8db..b20239a1d137e5b13364f691c2f64ab666911ac5 100644 (file)
@@ -154,6 +154,7 @@ static int hw_init(struct sr_context *sr_ctx)
                sr_err("Driver context malloc failed.");
                return SR_ERR_MALLOC;
        }
+
        drvc->sr_ctx = sr_ctx;
        di->priv = drvc;
 
index 52b9d975615ef746303093e3cb4a087bfa989da7..c7e1e687c9018ab7f1d7213dc3a4fe86609ffb58 100644 (file)
@@ -63,6 +63,7 @@ static int hw_init(struct sr_context *sr_ctx)
                sr_err("Driver context malloc failed.");
                return SR_ERR_MALLOC;
        }
+
        drvc->sr_ctx = sr_ctx;
        di->priv = drvc;
 
index 5d2e36b6b864714a1ea0140f30a0eef04b2bbac2..7cb579126dc83370d485553c488d954f34f95767 100644 (file)
@@ -153,13 +153,13 @@ static int clear_instances(void)
 static int hw_init(struct sr_context *sr_ctx)
 {
        struct drv_context *drvc;
-       (void)sr_ctx;
 
        if (!(drvc = g_try_malloc0(sizeof(struct drv_context)))) {
                sr_err("Driver context malloc failed.");
                return SR_ERR_MALLOC;
        }
 
+       drvc->sr_ctx = sr_ctx;
        di->priv = drvc;
 
        return SR_OK;
index 53178b2a35ace216ce3cdbeab350321a1bd86f23..d6bc5a34a671591efb27fb62de8d83d9b347043c 100644 (file)
@@ -80,6 +80,7 @@ static int hw_init(struct sr_context *sr_ctx)
                sr_err("Driver context malloc failed.");
                return SR_ERR_MALLOC;
        }
+
        drvc->sr_ctx = sr_ctx;
        di->priv = drvc;
 
index 7a72e7c42e994f9ee895a70bb0877bf379eda6c6..f8cf81f8bc73c2d6ed4d677a403cb30c8340d185 100644 (file)
@@ -292,9 +292,10 @@ static int hw_init(struct sr_context *sr_ctx)
        struct drv_context *drvc;
 
        if (!(drvc = g_try_malloc0(sizeof(struct drv_context)))) {
-               sr_err("zeroplus: driver context malloc failed.");
+               sr_err("Driver context malloc failed.");
                return SR_ERR_MALLOC;
        }
+
        drvc->sr_ctx = sr_ctx;
        di->priv = drvc;
 
index def770e993705e09f277c4b79080f13edf4035e6..364d97bd471a72141a0de46ec11c882e88d1b12c 100644 (file)
@@ -245,19 +245,38 @@ SR_API struct sr_dev_driver **sr_driver_list(void)
 /**
  * Initialize a hardware driver.
  *
+ * This usually involves memory allocations and variable initializations
+ * within the driver, but _not_ scanning for attached devices.
+ * The API call sr_driver_scan() is used for that.
+ *
  * @param ctx A libsigrok context object allocated by a previous call to
- *             sr_init().
- * @param driver The driver to initialize.
+ *            sr_init(). Must not be NULL.
+ * @param driver The driver to initialize. This must be a pointer to one of
+ *               the entries returned by sr_driver_list(). Must not be NULL.
  *
- * @return SR_OK if all went well, or an error code otherwise.
+ * @return SR_OK upon success, SR_ERR_ARG upon invalid parameters,
+ *         SR_ERR_BUG upon internal errors, or another negative error code
+ *         upon other errors.
  */
 SR_API int sr_driver_init(struct sr_context *ctx, struct sr_dev_driver *driver)
 {
+       int ret;
 
-       if (driver->init)
-               return driver->init(ctx);
+       if (!ctx) {
+               sr_err("Invalid libsigrok context, can't initialize.");
+               return SR_ERR_ARG;
+       }
 
-       return SR_OK;
+       if (!driver) {
+               sr_err("Invalid driver, can't initialize.");
+               return SR_ERR_ARG;
+       }
+
+       sr_spew("Initializing driver '%s'.", driver->name);
+       if ((ret = driver->init(ctx)) < 0)
+               sr_err("Failed to initialize the driver: %d.", ret);
+
+       return ret;
 }
 
 /**