Browse Source

Merge branch 'uniscan2' into bfgminer

Luke Dashjr 12 years ago
parent
commit
70876fa073
1 changed files with 147 additions and 41 deletions
  1. 147 41
      miner.c

+ 147 - 41
miner.c

@@ -540,13 +540,34 @@ bool devpaths_match(const char * const ap, const char * const bp)
 	return rv;
 }
 
+static
+int proc_letter_to_number(const char *s, const char ** const rem)
+{
+	int n = 0, c;
+	for ( ; s[0]; ++s)
+	{
+		if (unlikely(n > INT_MAX / 26))
+			break;
+		c = tolower(s[0]) - 'a';
+		if (unlikely(c < 0 || c > 25))
+			break;
+		if (unlikely(INT_MAX - c < n))
+			break;
+		n = (n * 26) + c;
+	}
+	*rem = s;
+	return n;
+}
+
 static
 bool cgpu_match(const char * const pattern, const struct cgpu_info * const cgpu)
 {
 	// all - matches anything
 	// d0 - matches all processors of device 0
+	// d0-3 - matches all processors of device 0, 1, 2, or 3
 	// d0a - matches first processor of device 0
 	// 0 - matches processor 0
+	// 0-4 - matches processors 0, 1, 2, 3, or 4
 	// ___ - matches all processors on all devices using driver/name ___
 	// ___0 - matches all processors of 0th device using driver/name ___
 	// ___0a - matches first processor of 0th device using driver/name ___
@@ -559,9 +580,11 @@ bool cgpu_match(const char * const pattern, const struct cgpu_info * const cgpu)
 	const char *p = pattern, *p2;
 	size_t L;
 	int n, i, c = -1;
+	int n2;
+	int proc_first = -1, proc_last;
 	struct cgpu_info *device;
 	
-	while (p[0] && p[0] != '@' && !isdigit(p[0]))
+	while (p[0] && p[0] != '@' && p[0] != '-' && !isdigit(p[0]))
 		++p;
 	
 	L = p - pattern;
@@ -594,16 +617,56 @@ bool cgpu_match(const char * const pattern, const struct cgpu_info * const cgpu)
 		}
 	}
 	else
-		n = strtol(p, (void*)&p2, 0);
-	if (p == pattern)
 	{
-		if (!p[0])
-			return true;
-		if (p2 && p2[0])
-			goto invsyntax;
-		if (n >= total_devices)
+		if (isdigit(p[0]))
+			n = strtol(p, (void*)&p2, 0);
+		else
+		{
+			n = 0;
+			p2 = p;
+		}
+		if (p2[0] == '-')
+		{
+			++p2;
+			if (p2[0] && isdigit(p2[0]))
+				n2 = strtol(p2, (void*)&p2, 0);
+			else
+				n2 = INT_MAX;
+		}
+		else
+			n2 = n;
+		if (p == pattern)
+		{
+			if (!p[0])
+				return true;
+			if (p2 && p2[0])
+				goto invsyntax;
+			for (i = n; i <= n2; ++i)
+			{
+				if (i >= total_devices)
+					break;
+				if (cgpu == devices[i])
+					return true;
+			}
 			return false;
-		return (cgpu == devices[n]);
+		}
+	}
+	
+	if (p2[0])
+	{
+		proc_first = proc_letter_to_number(&p2[0], &p2);
+		if (p2[0] == '-')
+		{
+			++p2;
+			if (p2[0])
+				proc_last = proc_letter_to_number(p2, &p2);
+			else
+				proc_last = INT_MAX;
+		}
+		else
+			proc_last = proc_first;
+		if (p2[0])
+			goto invsyntax;
 	}
 	
 	if (L > 1 || tolower(pattern[0]) != 'd' || !p[0])
@@ -615,9 +678,9 @@ bool cgpu_match(const char * const pattern, const struct cgpu_info * const cgpu)
 			{}  // Matched name or dname
 		else
 			return false;
-		if (p[0] && n != cgpu->device_id)
+		if (p[0] && (cgpu->device_id < n || cgpu->device_id > n2))
 			return false;
-		if (p2[0] && strcasecmp(p2, &cgpu->proc_repr[5]))
+		if (proc_first != -1 && (cgpu->proc_id < proc_first || cgpu->proc_id > proc_last))
 			return false;
 		return true;
 	}
@@ -631,15 +694,19 @@ bool cgpu_match(const char * const pattern, const struct cgpu_info * const cgpu)
 			return false;
 		if (devices[i]->device != devices[i])
 			continue;
-		if (++c == n)
-			break;
-	}
-	for (device = devices[i]; device; device = device->next_proc)
-	{
-		if (p2 && p2[0] && strcasecmp(p2, &cgpu->proc_repr[5]))
+		++c;
+		if (c < n)
 			continue;
-		if (device == cgpu)
-			return true;
+		if (c > n2)
+			break;
+		
+		for (device = devices[i]; device; device = device->next_proc)
+		{
+			if (proc_first != -1 && (device->proc_id < proc_first || device->proc_id > proc_last))
+				continue;
+			if (device == cgpu)
+				return true;
+		}
 	}
 	return false;
 
@@ -666,45 +733,84 @@ void test_cgpu_match()
 	struct cgpu_info cgpu = {
 		.drv = &drv,
 		.device = &cgpu,
+		.device_id = 1,
+		.proc_id = 1,
+		.proc_repr = "TST 1b",
+	}, cgpu0a = {
+		.drv = &drv,
+		.device = &cgpu0a,
+		.device_id = 0,
+		.proc_id = 0,
 		.proc_repr = "TST 0a",
+	}, cgpu1a = {
+		.drv = &drv,
+		.device = &cgpu0a,
+		.device_id = 1,
+		.proc_id = 0,
+		.proc_repr = "TST 1a",
 	};
-	struct cgpu_info *devices_list[1] = {&cgpu,};
+	struct cgpu_info *devices_list[3] = {&cgpu0a, &cgpu1a, &cgpu,};
 	devices = devices_list;
-	total_devices = 1;
+	total_devices = 3;
 	TEST_CGPU_MATCH("all")
-	TEST_CGPU_MATCH("d0")
-	TEST_CGPU_NOMATCH("d1")
-	TEST_CGPU_MATCH("0")
-	TEST_CGPU_NOMATCH("1")
+	TEST_CGPU_MATCH("d1")
+	TEST_CGPU_NOMATCH("d2")
+	TEST_CGPU_MATCH("d0-5")
+	TEST_CGPU_NOMATCH("d0-0")
+	TEST_CGPU_NOMATCH("d2-5")
+	TEST_CGPU_MATCH("d-1")
+	TEST_CGPU_MATCH("d1-")
+	TEST_CGPU_NOMATCH("d-0")
+	TEST_CGPU_NOMATCH("d2-")
+	TEST_CGPU_MATCH("2")
+	TEST_CGPU_NOMATCH("3")
+	TEST_CGPU_MATCH("1-2")
+	TEST_CGPU_MATCH("2-3")
+	TEST_CGPU_NOMATCH("1-1")
+	TEST_CGPU_NOMATCH("3-4")
 	TEST_CGPU_MATCH("TST")
 	TEST_CGPU_NOMATCH("TSF")
 	TEST_CGPU_NOMATCH("TS")
 	TEST_CGPU_NOMATCH("TSTF")
-	TEST_CGPU_MATCH("TST0")
-	TEST_CGPU_MATCH("TST 0")
-	TEST_CGPU_NOMATCH("TST1")
-	TEST_CGPU_MATCH("TST0a")
-	TEST_CGPU_NOMATCH("TST0b")
-	TEST_CGPU_NOMATCH("TST0aa")
+	TEST_CGPU_MATCH("TST1")
+	TEST_CGPU_MATCH("TST0-1")
+	TEST_CGPU_MATCH("TST 1")
+	TEST_CGPU_MATCH("TST 1-2")
+	TEST_CGPU_NOMATCH("TST2")
+	TEST_CGPU_NOMATCH("TST2-3")
+	TEST_CGPU_NOMATCH("TST0-0")
+	TEST_CGPU_MATCH("TST1b")
+	TEST_CGPU_NOMATCH("TST1c")
+	TEST_CGPU_NOMATCH("TST1bb")
+	TEST_CGPU_MATCH("TST0-1b")
+	TEST_CGPU_NOMATCH("TST0-1c")
+	TEST_CGPU_MATCH("TST1a-d")
+	TEST_CGPU_NOMATCH("TST1a-a")
+	TEST_CGPU_NOMATCH("TST1-a")
+	TEST_CGPU_NOMATCH("TST1c-z")
+	TEST_CGPU_NOMATCH("TST1c-")
 	TEST_CGPU_MATCH("@")
 	TEST_CGPU_NOMATCH("@abc")
-	TEST_CGPU_MATCH("@@a")
-	TEST_CGPU_NOMATCH("@@b")
+	TEST_CGPU_MATCH("@@b")
+	TEST_CGPU_NOMATCH("@@c")
 	TEST_CGPU_MATCH("TST@")
 	TEST_CGPU_NOMATCH("TST@abc")
-	TEST_CGPU_MATCH("TST@@a")
-	TEST_CGPU_NOMATCH("TST@@b")
+	TEST_CGPU_MATCH("TST@@b")
+	TEST_CGPU_NOMATCH("TST@@c")
+	TEST_CGPU_MATCH("TST@@b-f")
+	TEST_CGPU_NOMATCH("TST@@c-f")
+	TEST_CGPU_NOMATCH("TST@@-a")
 	cgpu.device_path = "/dev/test";
 	cgpu.dev_serial = "testy";
 	TEST_CGPU_MATCH("TST@/dev/test")
 	TEST_CGPU_MATCH("TST@testy")
 	TEST_CGPU_NOMATCH("TST@")
-	TEST_CGPU_NOMATCH("TST@/dev/test5@a")
-	TEST_CGPU_NOMATCH("TST@testy3@a")
-	TEST_CGPU_MATCH("TST@/dev/test@a")
-	TEST_CGPU_MATCH("TST@testy@a")
-	TEST_CGPU_NOMATCH("TST@/dev/test@b")
-	TEST_CGPU_NOMATCH("TST@testy@b")
+	TEST_CGPU_NOMATCH("TST@/dev/test5@b")
+	TEST_CGPU_NOMATCH("TST@testy3@b")
+	TEST_CGPU_MATCH("TST@/dev/test@b")
+	TEST_CGPU_MATCH("TST@testy@b")
+	TEST_CGPU_NOMATCH("TST@/dev/test@c")
+	TEST_CGPU_NOMATCH("TST@testy@c")
 }
 
 static