Browse Source

fpgautils: Replace serial_claim with bfg_claim_serial using a more cleanly extensible interface and implementation

Luke Dashjr 12 years ago
parent
commit
f1051250d5
2 changed files with 30 additions and 23 deletions
  1. 27 20
      fpgautils.c
  2. 3 3
      fpgautils.h

+ 27 - 20
fpgautils.c

@@ -425,12 +425,35 @@ struct _device_claim {
 	UT_hash_handle hh;
 };
 
-struct device_drv *_serial_claim(const char *devpath, struct device_drv *api, bool verbose)
+static
+struct device_drv *bfg_claim_any(struct device_drv * const api, const char * const verbose, const my_dev_t * const dev)
 {
 	static struct _device_claim *claims = NULL;
 	struct _device_claim *c;
-	my_dev_t dev;
+	
+	HASH_FIND(hh, claims, dev, sizeof(*dev), c);
+	if (c)
+	{
+		if (verbose)
+			applog(LOG_DEBUG, "%s device %s already claimed by other driver: %s",
+			       api->dname, verbose, c->drv->dname);
+		return c->drv;
+	}
+	
+	if (!api)
+		return NULL;
+	
+	c = malloc(sizeof(*c));
+	c->dev = *dev;
+	c->drv = api;
+	HASH_ADD(hh, claims, dev, sizeof(*dev), c);
+	return NULL;
+}
 
+struct device_drv *bfg_claim_serial(struct device_drv * const api, const bool verbose, const char * const devpath)
+{
+	my_dev_t dev;
+	
 	dev.bus = BDB_SERIAL;
 #ifndef WIN32
 	{
@@ -449,24 +472,8 @@ struct device_drv *_serial_claim(const char *devpath, struct device_drv *api, bo
 			return NULL;
 	}
 #endif
-
-	HASH_FIND(hh, claims, &dev, sizeof(dev), c);
-	if (c)
-	{
-		if (verbose)
-			applog(LOG_DEBUG, "%s device %s already claimed by other driver: %s",
-			       api->dname, devpath, c->drv->dname);
-		return c->drv;
-	}
-
-	if (!api)
-		return NULL;
-
-	c = malloc(sizeof(*c));
-	c->dev = dev;
-	c->drv = api;
-	HASH_ADD(hh, claims, dev, sizeof(dev), c);
-	return NULL;
+	
+	return bfg_claim_any(api, (verbose ? devpath : NULL), &dev);
 }
 
 // This code is purely for debugging but is very useful for that

+ 3 - 3
fpgautils.h

@@ -28,9 +28,9 @@ extern int _serial_detect(struct device_drv *api, detectone_func_t, autoscan_fun
 extern int _serial_autodetect(detectone_func_t, ...);
 #define serial_autodetect(...)  _serial_autodetect(__VA_ARGS__, NULL)
 
-extern struct device_drv *_serial_claim(const char *devpath, struct device_drv *, bool verbose);
-#define serial_claim(devpath, drv)    _serial_claim(devpath, drv, false)
-#define serial_claim_v(devpath, drv)  _serial_claim(devpath, drv, true)
+extern struct device_drv *bfg_claim_serial(struct device_drv * const, const bool verbose, const char * const devpath);
+#define serial_claim(devpath, drv)    bfg_claim_serial(drv, false, devpath)
+#define serial_claim_v(devpath, drv)  bfg_claim_serial(drv, true , devpath)
 
 extern int serial_open(const char *devpath, unsigned long baud, uint8_t timeout, bool purge);
 extern ssize_t _serial_read(int fd, char *buf, size_t buflen, char *eol);