int main(int argc, char **argv) { struct lru_tree_s *lt; (void) argc; (void) argv; lt = lru_tree_create((GCompareFunc)g_strcmp0, g_free, NULL, 0); g_assert(lt != NULL); lru_tree_insert(lt, g_strdup("plop"), GINT_TO_POINTER(1)); lru_tree_insert(lt, g_strdup("plop"), GINT_TO_POINTER(1)); lru_tree_insert(lt, g_strdup("plip"), GINT_TO_POINTER(1)); lru_tree_insert(lt, g_strdup("plup"), GINT_TO_POINTER(1)); lru_tree_get(lt, "plop"); lru_tree_get(lt, "plop"); lru_tree_get(lt, "plop"); lru_tree_get(lt, "plop"); gpointer k, v; while (lru_tree_steal_first(lt, &k, &v)) { g_printerr("K %s %p\n", (gchar*)k, v); g_free(k); } lru_tree_destroy(lt); return 0; }
static void _NOLOCK_local_score_update (const struct service_info_s *si0) { gchar *k = service_info_key (si0); STRING_STACKIFY(k); struct service_info_s *si = lru_tree_get (srv_registered, k); if (si) si->score.value = si0->score.value; }
static enum http_rc_e _registration (struct req_args_s *args, enum reg_op_e op, struct json_object *jsrv) { GError *err; if (!jsrv || !json_object_is_type (jsrv, json_type_object)) return _reply_common_error (args, BADREQ("Expected: json object")); if (!push_queue) return _reply_bad_gateway(args, SYSERR("Service upstream disabled")); if (NULL != (err = _cs_check_tokens(args))) return _reply_notfound_error (args, err); struct service_info_s *si = NULL; err = service_info_load_json_object (jsrv, &si, TRUE); if (err) { g_prefix_error (&err, "JSON error: "); if (err->code == CODE_BAD_REQUEST) return _reply_format_error (args, err); else return _reply_system_error (args, err); } if (!si->type[0]) { service_info_clean (si); return _reply_format_error (args, BADREQ("Service type not specified")); } if (!si->ns_name[0]) { GRID_TRACE2("%s NS forced to %s", __FUNCTION__, si->ns_name); g_strlcpy (si->ns_name, nsname, sizeof(si->ns_name)); } else if (!validate_namespace (si->ns_name)) { service_info_clean (si); return _reply_format_error (args, BADNS()); } gchar *k = service_info_key (si); STRING_STACKIFY(k); GRID_TRACE2("%s op=%s score=%d key=[%s]", __FUNCTION__, _regop_2str(op), si->score.value, k); switch (op) { case REGOP_PUSH: si->score.value = SCORE_UNSET; if (!service_is_known (k)) { service_learn (k); service_tag_set_value_boolean (service_info_ensure_tag ( si->tags, NAME_TAGNAME_RAWX_FIRST), TRUE); } break; case REGOP_LOCK: si->score.value = CLAMP(si->score.value, SCORE_DOWN, SCORE_MAX); break; case REGOP_UNLOCK: si->score.value = SCORE_UNLOCK; break; default: g_assert_not_reached(); } if (cs_expire_local_services > 0) { struct service_info_s *v = service_info_dup (si); v->score.timestamp = oio_ext_monotonic_seconds (); PUSH_DO( const struct service_info_s *si0 = lru_tree_get(srv_registered, k); if (si0) v->score.value = si0->score.value; lru_tree_insert (srv_registered, g_strdup(k), v); ); }