diff options
| -rw-r--r-- | src/ipcpd/normal/graph.c | 14 | ||||
| -rw-r--r-- | src/ipcpd/normal/routing.c | 4 | ||||
| -rw-r--r-- | src/lib/rib.c | 10 | 
3 files changed, 19 insertions, 9 deletions
| diff --git a/src/ipcpd/normal/graph.c b/src/ipcpd/normal/graph.c index b3e105e3..272576bb 100644 --- a/src/ipcpd/normal/graph.c +++ b/src/ipcpd/normal/graph.c @@ -106,15 +106,15 @@ static void del_edge(struct edge * edge)         free(edge);  } -static int add_vertex(struct graph * graph, -                      uint64_t       addr) +static struct vertex * add_vertex(struct graph * graph, +                                  uint64_t       addr)  {          struct vertex *    vertex;          struct list_head * p;          vertex = malloc(sizeof(*vertex));          if (vertex == NULL) -                return -1; +                return NULL;          list_head_init(&vertex->next);          list_head_init(&vertex->edges); @@ -130,7 +130,7 @@ static int add_vertex(struct graph * graph,          graph->nr_vertices++; -        return 0; +        return vertex;  }  static void del_vertex(struct graph * graph, @@ -206,7 +206,8 @@ int graph_add_edge(struct graph * graph,          v = find_vertex_by_addr(graph, s_addr);          if (v == NULL) { -                if (add_vertex(graph, s_addr)) { +                v = add_vertex(graph, s_addr); +                if (v == NULL) {                          pthread_mutex_unlock(&graph->lock);                          return -ENOMEM;                  } @@ -221,7 +222,8 @@ int graph_add_edge(struct graph * graph,          nb = find_vertex_by_addr(graph, d_addr);          if (nb == NULL) { -                if (add_vertex(graph, d_addr)) { +                nb = add_vertex(graph, d_addr); +                if (nb == NULL) {                          pthread_mutex_unlock(&graph->lock);                          return -ENOMEM;                  } diff --git a/src/ipcpd/normal/routing.c b/src/ipcpd/normal/routing.c index b750ca84..998b294a 100644 --- a/src/ipcpd/normal/routing.c +++ b/src/ipcpd/normal/routing.c @@ -291,12 +291,12 @@ static void * rib_listener(void * o)                  }          } -        while (rib_event_wait(routing.set, routing.queue, NULL)) { +        while (rib_event_wait(routing.set, routing.queue, NULL) == 0) {                  flag = rqueue_next(routing.queue, path);                  if (flag < 0)                          continue; -                if (read_fso(children[i], flag)) { +                if (read_fso(path, flag)) {                          log_err("Failed to parse FSO.");                          continue;                  } diff --git a/src/lib/rib.c b/src/lib/rib.c index 8468e88c..fc58f266 100644 --- a/src/lib/rib.c +++ b/src/lib/rib.c @@ -177,6 +177,8 @@ static struct revent * revent_dup(struct revent * ev)          re->flags = ev->flags; +        list_head_init(&re->next); +          return re;  } @@ -196,7 +198,13 @@ static void rnode_notify_subs(struct rnode *  node,                  struct rn_sub * s = list_entry(p, struct rn_sub, next);                  if (s->flags & ev->flags) {                          struct revent * e = revent_dup(ev); +                        if (e == NULL) +                                continue; + +                        pthread_mutex_lock(&s->sub->lock);                          list_add_tail(&e->next, &s->sub->events); +                        pthread_cond_signal(&s->sub->cond); +                        pthread_mutex_unlock(&s->sub->lock);                  }                  if (ev->flags & RO_DELETE) @@ -1130,7 +1138,7 @@ int rib_event_wait(ro_set_t *              set,          while (list_is_empty(&sub->events) && ret != -ETIMEDOUT) {                  if (timeout != NULL) -                        ret = -pthread_cond_timedwait(&sub->cond , +                        ret = -pthread_cond_timedwait(&sub->cond,                                                        &sub->lock,                                                        &abstime);                  else | 
