Add a simple scheduler
This commit is contained in:
47
mud.c
47
mud.c
@@ -513,40 +513,43 @@ int mud_recv (struct mud *mud, void *data, size_t size)
|
|||||||
|
|
||||||
int mud_push (struct mud *mud)
|
int mud_push (struct mud *mud)
|
||||||
{
|
{
|
||||||
uint32_t now = mud_now();
|
|
||||||
|
|
||||||
if (!now) {
|
|
||||||
errno = EAGAIN;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
while (mud->tx.start != mud->tx.end) {
|
while (mud->tx.start != mud->tx.end) {
|
||||||
|
uint32_t now = mud_now();
|
||||||
|
|
||||||
|
if (!now) {
|
||||||
|
errno = EAGAIN;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
struct packet *packet = &mud->tx.packet[mud->tx.start];
|
struct packet *packet = &mud->tx.packet[mud->tx.start];
|
||||||
|
|
||||||
// if (packet->time > time)
|
// if (packet->time > time)
|
||||||
// break;
|
// break;
|
||||||
|
|
||||||
mud->tx.start++;
|
|
||||||
|
|
||||||
struct path *path;
|
struct path *path;
|
||||||
|
struct path *path_min = NULL;
|
||||||
|
int32_t dt_min = INT32_MAX;
|
||||||
|
|
||||||
for (path = mud->path; path; path = path->next) {
|
for (path = mud->path; path; path = path->next) {
|
||||||
ssize_t ret = mud_send_path(path, packet->data, packet->size);
|
int32_t dt = (int32_t)path->recv.dt-(int32_t)(now-path->send.time);
|
||||||
|
|
||||||
if (ret <= 0)
|
if (dt_min > dt) {
|
||||||
continue;
|
dt_min = dt;
|
||||||
|
path_min = path;
|
||||||
if (ret != packet->size)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (path->send.count == 256) {
|
|
||||||
path->send.count = 0;
|
|
||||||
path->send.dt = (now-path->send.time)>>8;
|
|
||||||
path->send.time = now;
|
|
||||||
} else {
|
|
||||||
path->send.count++;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!path_min)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
ssize_t ret = mud_send_path(path_min, packet->data, packet->size);
|
||||||
|
|
||||||
|
mud->tx.start++;
|
||||||
|
|
||||||
|
if (ret != packet->size)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
path_min->send.time = now;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user