Browse Source

Build hash tables to find drivers by dname or name

Luke Dashjr 12 years ago
parent
commit
29035c0f9c
7 changed files with 49 additions and 15 deletions
  1. 34 2
      deviceapi.c
  2. 7 1
      deviceapi.h
  3. 1 5
      driver-cairnsmore.c
  4. 4 6
      driver-erupter.c
  5. 1 1
      driver-opencl.c
  6. 1 0
      miner.c
  7. 1 0
      miner.h

+ 34 - 2
deviceapi.c

@@ -31,16 +31,48 @@
 #include "miner.h"
 #include "util.h"
 
-void _bfg_register_driver(const struct device_drv * const drv)
+struct driver_registration *_bfg_drvreg1;
+struct driver_registration *_bfg_drvreg2;
+
+void _bfg_register_driver(const struct device_drv *drv)
 {
 	static struct driver_registration *initlist;
-	struct driver_registration *ndr = malloc(sizeof(*ndr));
+	struct driver_registration *ndr;
+	
+	if (!drv)
+	{
+		// Move initlist to hashtables
+		LL_FOREACH(initlist, ndr)
+		{
+			drv = ndr->drv;
+			if (drv->drv_init)
+				drv->drv_init();
+			HASH_ADD_KEYPTR(hh , _bfg_drvreg1, drv->dname, strlen(drv->dname), ndr);
+			HASH_ADD_KEYPTR(hh2, _bfg_drvreg2, drv->name , strlen(drv->name ), ndr);
+		}
+		initlist = NULL;
+		return;
+	}
+	
+	ndr = malloc(sizeof(*ndr));
 	*ndr = (struct driver_registration){
 		.drv = drv,
 	};
 	LL_PREPEND(initlist, ndr);
 }
 
+static
+int sort_drv_by_dname(struct driver_registration * const a, struct driver_registration * const b)
+{
+	return strcmp(a->drv->dname, b->drv->dname);
+};
+
+void bfg_devapi_init()
+{
+	_bfg_register_driver(NULL);
+	HASH_SRT(hh , _bfg_drvreg1, sort_drv_by_dname   );
+}
+
 
 bool hashes_done(struct thr_info *thr, int64_t hashes, struct timeval *tvp_hashes, uint32_t *max_nonce)
 {

+ 7 - 1
deviceapi.h

@@ -11,9 +11,15 @@ struct driver_registration;
 struct driver_registration {
 	const struct device_drv *drv;
 	
-	struct driver_registration *next;
+	UT_hash_handle hh;   // hash & order by dname
+	UT_hash_handle hh2;  // hash by name, order by priority
+	struct driver_registration *next;  // DO NOT USE
 };
 
+extern struct driver_registration *_bfg_drvreg1;
+extern struct driver_registration *_bfg_drvreg2;
+extern void bfg_devapi_init();
+
 extern void _bfg_register_driver(const struct device_drv *);
 #define BFG_REGISTER_DRIVER(drv)                \
 	struct device_drv drv;                      \

+ 1 - 5
driver-cairnsmore.c

@@ -29,8 +29,6 @@
 
 BFG_REGISTER_DRIVER(cairnsmore_drv)
 
-static void cairnsmore_drv_init();
-
 static bool cairnsmore_detect_one(const char *devpath)
 {
 	struct ICARUS_INFO *info = calloc(1, sizeof(struct ICARUS_INFO));
@@ -59,7 +57,6 @@ static int cairnsmore_detect_auto(void)
 
 static void cairnsmore_detect()
 {
-	cairnsmore_drv_init();
 	// Actual serial detection is handled by Icarus driver
 	serial_detect_auto_byname(&cairnsmore_drv, cairnsmore_detect_one, cairnsmore_detect_auto);
 }
@@ -214,6 +211,5 @@ static void cairnsmore_drv_init()
 }
 
 struct device_drv cairnsmore_drv = {
-	// Needed to get to cairnsmore_drv_init at all
-	.drv_detect = cairnsmore_detect,
+	.drv_init = cairnsmore_drv_init,
 };

+ 4 - 6
driver-erupter.c

@@ -68,11 +68,8 @@ static int erupter_detect_auto(void)
 	return serial_autodetect(erupter_detect_one, "Block", "Erupter");
 }
 
-static void erupter_drv_init();
-
 static void erupter_detect()
 {
-	erupter_drv_init();
 	// Actual serial detection is handled by Icarus driver
 	serial_detect_auto_byname(&erupter_drv, erupter_detect_one, erupter_detect_auto);
 	serial_detect_auto_byname(&erupter_drv_emerald, erupter_emerald_detect_one, erupter_emerald_detect_auto);
@@ -99,8 +96,9 @@ static void erupter_drv_init()
 }
 
 struct device_drv erupter_drv = {
-	// Needed to get to erupter_drv_init at all
-	.drv_detect = erupter_detect,
+	.drv_init = erupter_drv_init,
 };
 
-struct device_drv erupter_drv_emerald;
+struct device_drv erupter_drv_emerald = {
+	.drv_init = erupter_drv_init,
+};

+ 1 - 1
driver-opencl.c

@@ -787,7 +787,7 @@ char *set_intensity(char *arg)
 
 
 #ifdef HAVE_OPENCL
-BFG_REGISTER_DRIVER(opencl_drv)
+BFG_REGISTER_DRIVER(opencl_api)
 
 char *print_ndevs_and_exit(int *ndevs)
 {

+ 1 - 0
miner.c

@@ -10826,6 +10826,7 @@ int main(int argc, char *argv[])
 	}
 #endif
 
+	bfg_devapi_init();
 	drv_detect_all();
 	total_devices = total_devices_new;
 	devices = devices_new;

+ 1 - 0
miner.h

@@ -292,6 +292,7 @@ struct device_drv {
 	const char *name;
 
 	// DRV-global functions
+	void (*drv_init)();
 	void (*drv_detect)();
 
 	// Processor-specific functions