port-array: Add port_array_delete() function.
authorBen Pfaff <blp@nicira.com>
Thu, 3 Jun 2010 17:17:51 +0000 (10:17 -0700)
committerBen Pfaff <blp@nicira.com>
Thu, 17 Jun 2010 17:30:19 +0000 (10:30 -0700)
port_array_delete(pa, idx) is equivalent to port_array_set(pa, idx, NULL),
but it never allocates memory and avoids conditionals.

lib/port-array.c
lib/port-array.h
ofproto/ofproto-sflow.c
ofproto/ofproto.c
ofproto/pinsched.c

index e8f35be9ee7436f2f7a7bfff43ce05dad5fb2e65..be4c0dcc02d1033789fb24e631795ce4b236fb2d 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2008 Nicira Networks.
+ * Copyright (c) 2008, 2010 Nicira Networks.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -95,6 +95,17 @@ port_array_set(struct port_array *pa, uint16_t idx, void *p)
     l3->l3[PORT_ARRAY_L3(idx)] = p;
 }
 
+/* Sets 'pa' element numbered 'idx' to NULL. */
+void
+port_array_delete(struct port_array *pa, uint16_t idx)
+{
+    unsigned int l1_idx = PORT_ARRAY_L1(idx);
+    unsigned int l2_idx = PORT_ARRAY_L2(idx);
+    unsigned int l3_idx = PORT_ARRAY_L3(idx);
+
+    pa->l1[l1_idx]->l2[l2_idx]->l3[l3_idx] = NULL;
+}
+
 static void *
 next(const struct port_array *pa, unsigned int *idxp)
 {
index 36410bfed534c0bbeec07fb8dc17d7b3fea9fdea..15fa41d1c2f123ea454a7d8dab823014c14751ed 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2008, 2009 Nicira Networks.
+ * Copyright (c) 2008, 2009, 2010 Nicira Networks.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -84,6 +84,7 @@ void port_array_init(struct port_array *);
 void port_array_destroy(struct port_array *);
 void port_array_clear(struct port_array *);
 void port_array_set(struct port_array *, uint16_t idx, void *);
+void port_array_delete(struct port_array *, uint16_t idx);
 void *port_array_first(const struct port_array *, unsigned int *);
 void *port_array_next(const struct port_array *, unsigned int *);
 unsigned int port_array_count(const struct port_array *);
index a96d8b496b980a91bf4be91990af493005d3b1c7..cc6a6935a0538d5695c7d323215064bded243a98 100644 (file)
@@ -354,7 +354,7 @@ ofproto_sflow_del_port(struct ofproto_sflow *os, uint16_t odp_port)
         }
         netdev_close(osp->netdev);
         free(osp);
-        port_array_set(&os->ports, odp_port, NULL);
+        port_array_delete(&os->ports, odp_port);
     }
 }
 
index 031531c71f0c6da54517e125c63012a581197dde..d877d36a9851ac52119555b46ac3184e3d7d6d64 100644 (file)
@@ -1478,7 +1478,7 @@ ofport_remove(struct ofproto *p, struct ofport *ofport)
     uint16_t odp_port = ofp_port_to_odp_port(ofport->opp.port_no);
 
     netdev_monitor_remove(p->netdev_monitor, ofport->netdev);
-    port_array_set(&p->ports, odp_port, NULL);
+    port_array_delete(&p->ports, odp_port);
     shash_delete(&p->port_by_name,
                  shash_find(&p->port_by_name, (char *) ofport->opp.name));
     if (p->sflow) {
index 6af2bb6765e2edcc18f46284f32fdfea3b01b17c..d749ee4e6f912cd71f1d75873cc45e94626c7533 100644 (file)
@@ -70,7 +70,7 @@ dequeue_packet(struct pinsched *ps, struct ovs_queue *q,
     struct ofpbuf *packet = queue_pop_head(q);
     if (!q->n) {
         free(q);
-        port_array_set(&ps->queues, port_no, NULL);
+        port_array_delete(&ps->queues, port_no);
     }
     ps->n_queued--;
     return packet;