diff --git a/filter/data.c b/filter/data.c index 6311ac30..77d3bcec 100644 --- a/filter/data.c +++ b/filter/data.c @@ -654,6 +654,7 @@ mem_hash_mix_f_val(u64 *h, struct f_val *v) case T_PTR: case T_ENUM_STATE: case T_BTIME: + case T_BMP_CLOSING: bug("Invalid type %s in f_val hashing", f_type_name(v->type)); } } diff --git a/nest/proto.c b/nest/proto.c index e07def62..e8c2f11b 100644 --- a/nest/proto.c +++ b/nest/proto.c @@ -51,7 +51,7 @@ static char *c_states[] = { "DOWN", "START", "UP", "STOP", "RESTART" }; extern struct protocol proto_unix_iface; struct proto_attrs *proto_state_table; -struct proto_attrs *channel_state_table; +//struct proto_attrs *channel_state_table; static void proto_rethink_goal(struct proto *p); static char *proto_state_name(struct proto *p); @@ -1314,7 +1314,7 @@ proto_new(struct proto_config *cf) log("protocol %s %x has id %i", p->name, p, p->id); if (p->id >= proto_state_table->length) //TODO check protos_attr_field_grow(); - init_list(&proto_state_table->channels_attrs[p->id]); + //init_list(&proto_state_table->channels_attrs[p->id]); //log("init chann list %x (pid %i)", &proto_state_table->channels_attrs[p->id], p->id); init_list(&p->channels); @@ -2917,8 +2917,8 @@ protos_attr_field_init(void) log("start of protos_attr_field_init"); int init_length = 16; proto_state_table = mb_allocz(&root_pool, sizeof(struct proto_attrs)); - proto_state_table->attrs = mb_allocz(&root_pool, sizeof(ea_list)*init_length); - proto_state_table->channels_attrs = mb_allocz(&root_pool, sizeof(list)*init_length); + proto_state_table->attrs = mb_allocz(&root_pool, sizeof(ea_list *_Atomic)*init_length); + proto_state_table->channels_attrs = mb_allocz(&root_pool, sizeof(struct channel_attrs_list) * init_length); proto_state_table->length = init_length; proto_state_table->proto_id_maker = mb_allocz(&root_pool, sizeof(struct hmap)); proto_state_table->channel_id_maker = mb_allocz(&root_pool, sizeof(struct hmap)); @@ -2934,12 +2934,12 @@ protos_attr_field_grow(void) log("grow"); ea_list *_Atomic * new_field = mb_allocz(&root_pool, proto_state_table->length * sizeof(ea_list *_Atomic) * 2); log("for realocated field allocated %x", new_field); - list * new_chann = mb_allocz(&root_pool, proto_state_table->length * sizeof(list) * 2); + struct channel_attrs_list * new_chann = mb_allocz(&root_pool, proto_state_table->length * sizeof(struct channel_attrs_list) * 2); log("for realocated chann field allocated %x", new_chann); memcpy(new_field, proto_state_table->attrs, proto_state_table->length * (sizeof(ea_list* _Atomic))); memcpy(new_chann, proto_state_table->channels_attrs, proto_state_table->length * (sizeof(list))); atomic_store(&proto_state_table->attrs, new_field); - atomic_store(&proto_state_table->channels_attrs, new_chann); //TODO atomic + atomic_store(&proto_state_table->channels_attrs, new_chann); atomic_store(&proto_state_table->length, (proto_state_table->length*2)); } @@ -3091,9 +3091,10 @@ struct channel_attrs * get_channel_ea(struct channel *ch) { struct channel_attrs *chan_att; - WALK_LIST(chan_att, proto_state_table->channels_attrs[ch->proto->id]) + WALK_TLIST(channel_attrs, chan_att, &proto_state_table->channels_attrs[ch->proto->id]) { const int id = ea_get_int(chan_att->attrs, &ea_channel_id, 0); + log("%x %i", chan_att, id); if (ch->id == id) return chan_att; } @@ -3106,6 +3107,8 @@ channel_journal_state_push(ea_list *attr, struct channel *ch) attr = ea_lookup(attr, 0, EALS_CUSTOM); return; // do we need the journal? ea_list *old_attr = get_channel_ea(ch)->attrs; + struct channel_attrs *ch_attr = get_channel_ea(ch); //TODO is this ok? What about add new tail and delete old chan attr? + ch_attr->attrs = attr; LOCK_DOMAIN(rtable, proto_journal_domain); struct channel_pending_update *pupdate = SKIP_BACK(struct channel_pending_update, li, lfjour_push_prepare(channel_journal)); if (!pupdate) @@ -3113,8 +3116,6 @@ channel_journal_state_push(ea_list *attr, struct channel *ch) UNLOCK_DOMAIN(rtable, proto_journal_domain); return; } - struct channel_attrs *ch_attr = get_channel_ea(ch); - atomic_store(&ch_attr->attrs, attr); *pupdate = (struct channel_pending_update) { .li = pupdate->li, /* Keep the item's internal state */ .channel_attr = attr, @@ -3137,15 +3138,17 @@ channel_journal_state_change(struct channel *ch, int old_state, int new_state) void add_journal_channel(struct channel *ch) { - if (!NODE_VALID(HEAD(proto_state_table->channels_attrs[ch->proto->id]))) - init_list(&proto_state_table->channels_attrs[ch->proto->id]); // if we realocated channels lists, earlier inicialization would be problematic. But it does not seem to be problem for nonempty lists + //if (!NODE_VALID(HEAD(proto_state_table->channels_attrs[ch->proto->id]))) + // init_list(&proto_state_table->channels_attrs[ch->proto->id]); // if we realocated channels lists, earlier inicialization would be problematic. But it does not seem to be problem for nonempty lists ea_list *eal = channel_state_to_eattr(ch, 0); - struct channel_attrs *attr = mb_allocz(&root_pool, 1230);//sizeof(struct channel_attrs)); + struct channel_attrs *attr = mb_allocz(&root_pool, sizeof(struct channel_attrs)); //TODO free log("for new channel allocated %x, eal %x", attr, eal); attr->attrs = eal; - add_tail(&proto_state_table->channels_attrs[ch->proto->id], &attr->n); - log("added tail to lis %x ch id %i, p id %i", &proto_state_table->channels_attrs[ch->proto->id], ch->id, ch->proto->id); + log("chann id %i %x",ea_get_int(eal, &ea_channel_id, 0), eal); + channel_attrs_add_tail(&proto_state_table->channels_attrs[ch->proto->id], attr); + log("added tail to lis %x ch id %i, p id %i ", + &proto_state_table->channels_attrs[ch->proto->id], ch->id, ch->proto->id); if (get_channel_ea(ch) == 0) bug("channel not stored ch id %i, p id %i", ch->id, ch->proto->id); } diff --git a/nest/protocol.h b/nest/protocol.h index 9a8d6902..217ea202 100644 --- a/nest/protocol.h +++ b/nest/protocol.h @@ -402,9 +402,26 @@ static inline int proto_is_inactive(struct proto *p) } +#include "lib/tlists.h" + +#define TLIST_PREFIX channel_attrs +#define TLIST_TYPE struct channel_attrs +#define TLIST_ITEM n + + +struct channel_attrs { + TLIST_DEFAULT_NODE; + ea_list *attrs; +}; + +#define TLIST_WANT_ADD_TAIL +#define TLIST_WANT_WALK + +#include "lib/tlists.h" + struct proto_attrs { ea_list *_Atomic *attrs; - list *channels_attrs; + struct channel_attrs_list *channels_attrs; _Atomic u32 length; struct hmap *proto_id_maker; struct hmap *channel_id_maker; @@ -415,10 +432,6 @@ extern struct lfjour *channel_journal; extern struct proto_attrs *proto_state_table; extern DOMAIN(rtable) proto_journal_domain; -struct channel_attrs { - node n; - ea_list *_Atomic attrs; -}; struct proto_pending_update { LFJOUR_ITEM_INHERIT(li);