Browse Source

bifury: Abstract line parsing into bifury_readln function

Luke Dashjr 12 years ago
parent
commit
d122541141
1 changed files with 30 additions and 13 deletions
  1. 30 13
      driver-bifury.c

+ 30 - 13
driver-bifury.c

@@ -41,6 +41,30 @@ ssize_t bifury_write(const struct cgpu_info * const dev, const void * const buf,
 	return write(fd, buf, count);
 }
 
+static
+void *bifury_readln(int fd, bytes_t *leftover)
+{
+	uint8_t buf[0x40];
+	ssize_t r;
+	
+parse:
+	if ( (r = bytes_find(leftover, '\n')) >= 0)
+	{
+		uint8_t *ret = malloc(r+1);
+		if (r)
+			memcpy(ret, bytes_buf(leftover), r);
+		ret[r] = '\0';
+		bytes_shift(leftover, r + 1);
+		return ret;
+	}
+	if ( (r = read(fd, buf, sizeof(buf))) > 0)
+	{
+		bytes_append(leftover, buf, r);
+		goto parse;
+	}
+	return NULL;
+}
+
 struct bifury_state {
 	bytes_t buf;
 	uint32_t last_work_id;
@@ -287,8 +311,7 @@ void bifury_poll(struct thr_info * const master_thr)
 	struct cgpu_info * const dev = master_thr->cgpu;
 	struct bifury_state * const state = dev->device_data;
 	int fd = dev->device_fd;
-	char buf[0x100];
-	ssize_t r;
+	char *cmd;
 	
 	if (unlikely(fd == -1))
 	{
@@ -314,18 +337,12 @@ void bifury_poll(struct thr_info * const master_thr)
 		bifury_set_queue_full(dev, dev->procs);
 	}
 	
-	while ( (r = read(fd, buf, sizeof(buf))) > 0)
+	while ( (cmd = bifury_readln(fd, &state->buf)) )
 	{
-		bytes_append(&state->buf, buf, r);
-		while ( (r = bytes_find(&state->buf, '\n')) >= 0)
-		{
-			char * const cmd = (void*)bytes_buf(&state->buf);
-			cmd[r] = '\0';
-			if (opt_dev_protocol)
-				applog(LOG_DEBUG, "%s: DEVPROTO: RECV %s", dev->dev_repr, cmd);
-			bifury_handle_cmd(dev, cmd);
-			bytes_shift(&state->buf, r + 1);
-		}
+		if (opt_dev_protocol)
+			applog(LOG_DEBUG, "%s: DEVPROTO: RECV %s", dev->dev_repr, cmd);
+		bifury_handle_cmd(dev, cmd);
+		free(cmd);
 	}
 }