-* Create list for peers by port, so it will not be necessary to
- traverse the peer tree when destroying ports.
-
* Add forb_init() parameters: argc, argv and orb_id
* More flexible handling of log messages (dynamic registration,
parsing of command line parameters).
* Error checking of deserialization in skeletons
+
+* Add FNA as transport protocol (probably with some reliable protocol
+ on top of FNA)
+
+* Add routing layer
+
$(Q)$(SOURCES_DIR)/ul_log_domains $(SOURCES_DIR) > $@
clean-custom:
- $(Q)rm log_domains.inc
+ -$(Q)rm log_domains.inc
# request_gavl.inc: $(SOURCES_DIR)/request_gavl.c
# @echo " CPP $@"
#include <ul_log.h>
#include "exec_req.h"
#include <errno.h>
+#include "peer.h"
/** Version of the protocol */
#define VER_MAJOR 0
forb_peer_get(peer);
forb_peer_nolock_insert(forb, peer);
}
+ forb_peer_get(peer);
+ forb_port_peer_ins_tail(port, peer);
fosa_mutex_unlock(&forb->peer_mutex);
forb_peer_put(peer);
}
forb_peer_t, /* cust_item_t */
forb_server_id, /* cust_key_t */
peers, /* cust_root_node */
- node, /* cust_item_node */
+ gnode, /* cust_item_node */
server_id, /* cust_item_key */
forb_server_id_cmp);/* cust_cmp_fnc */
forb_peer_delete_by_port(forb_t *forb, forb_port_t *port)
{
forb_peer_t *peer;
- fosa_mutex_lock(&port->forb->peer_mutex);
- /* FIXME: Is gavl_cust_for_each() deletion safe? What about
- * recursive locking of mutex. */
-#warning Delete during GAVL traversal is probably not correct.
- gavl_cust_for_each(forb_peer_nolock, forb, peer) {
- if (peer->port == port) {
- forb_peer_nolock_delete(forb, peer);
- forb_peer_put(peer);
- }
+ ul_list_for_each_cut(forb_port_peer, port, peer) {
+ forb_peer_delete(forb, peer);
+ forb_peer_put(peer);
}
- fosa_mutex_unlock(&port->forb->peer_mutex);
}
forb_peer_t *
#include <forb/forb-internal.h>
#include "port.h"
#include "refcnt.h"
+#include <ul_gavl.h>
+#include <ul_list.h>
enum forb_peer_state {
FORB_PEER_WANTED, /**< Somebody is waiting for the peer to be discovered. In this state, only @a server_id field is set. */
forb_port_t *port; /**< Port of this peer is connected to */
void *addr; /**< Protocol specific address of the peer. */
void *proto_priv; /**< Protocol private data (e.g. info about established connection) */
- gavl_node_t node; /**< Node of port's peers tree */
+ gavl_node_t gnode; /**< Node of forb's peers tree */
+ ul_list_node_t lnode; /**< Node of port's peer list */
forb_ref_t ref; /**< Reference count */
enum forb_peer_state state;
fosa_cond_t cond; /**< Condition variable for waiting after the peer is discovered. Used together with forb::peer_mutex. */
forb_peer_t, /* cust_item_t */
forb_server_id, /* cust_key_t */
peers, /* cust_root_node */
- node, /* cust_item_node */
+ gnode, /* cust_item_node */
server_id, /* cust_item_key */
forb_server_id_cmp)/* cust_cmp_fnc */
+UL_LIST_CUST_DEC(forb_port_peer, /* cust_prefix */
+ forb_port_t, /* cust_head_t */
+ forb_peer_t, /* cust_item_t */
+ peers, /* cust_head_field */
+ lnode) /* cust_node_field */
+
forb_peer_t *
forb_peer_new(void);
port->forb = forb;
port->finish = false;
+
+ forb_port_peer_init_head(port);
fosa_mutex_lock(&forb->port_mutex);
forb_port_insert(forb, port);
port->proto->port_destroy(port);
}
+ /* Because of no locking of port->peers, this must be called
+ * after receiver thread is stopped. */
forb_peer_delete_by_port(forb, port);
CDR_codec_release_buffer(&port->codec);
CDR_Codec codec; /**< Receiving buffer for receiver thread */
void *addr; /**< Port's address in a protocol specific format. */
ul_list_node_t node; /**< Node in forb's port list */
- gavl_cust_root_field_t peers; /**< Peers discovered on this port by discovery protocol */
+ ul_list_head_t peers; /**< Peers discovered on this port by discovery protocol */
bool finish; /**< True when the threads should finish their execution, false otherwise. */
};