コード例 #1
0
ファイル: cpp.c プロジェクト: rui314/8cc-old
static bool is_defined(CppContext *ctx, Token *tok) {
    if (!tok || tok->toktype != TOKTYPE_IDENT)
        error_token(tok, "identifier expected, but got '%s'", token_to_string(tok));
    return dict_has(ctx->defs, tok->val.str);
}
コード例 #2
0
ファイル: dyn_gossip.c プロジェクト: amimimor/dynomite
static rstatus_t
gossip_pool_each_init(void *elem, void *data)
{
	rstatus_t status;
	struct server_pool *sp = elem;

	gn_pool.ctx = sp->ctx;
	gn_pool.name = &sp->name;
	gn_pool.idx = sp->idx;
	gn_pool.g_interval = sp->g_interval;

	//dictDisableResize();
	gn_pool.dict_dc = dictCreate(&string_table_dict_type, NULL);

	gossip_set_seeds_provider(&sp->seed_provider);

	uint32_t n_dc = array_n(&sp->datacenters);
	if (n_dc == 0)
		return DN_OK;

	if (n_dc > 0) {
		status = array_init(&gn_pool.datacenters, n_dc, sizeof(struct gossip_dc));
		if (status != DN_OK) {
			return status;
		}
	}

	//add racks and datacenters
	uint32_t dc_cnt = array_n(&sp->datacenters);
	uint32_t dc_index;
	for(dc_index = 0; dc_index < dc_cnt; dc_index++) {
		struct datacenter *dc = array_get(&sp->datacenters, dc_index);
		uint32_t rack_cnt = array_n(&dc->racks);
		uint32_t rack_index;
		for(rack_index = 0; rack_index < rack_cnt; rack_index++) {
			struct rack *rack = array_get(&dc->racks, rack_index);

			if (dictFind(gn_pool.dict_dc, rack->dc) == NULL) {
				struct gossip_dc *g_dc = array_push(&gn_pool.datacenters);
				gossip_dc_init(g_dc, rack->dc);
				dictAdd(gn_pool.dict_dc, &g_dc->name, g_dc);
			}

			struct gossip_dc *g_dc = dictFetchValue(gn_pool.dict_dc, rack->dc);
			if (dictFind(g_dc->dict_rack, rack->name) == NULL) {
				log_debug(LOG_VERB, "What?? No rack in Dict for rack         : '%.*s'", g_dc->name);
				struct gossip_rack *g_rack = array_push(&g_dc->racks);
				gossip_rack_init(g_rack, rack->dc, rack->name);
				dictAdd(g_dc->dict_rack, &g_rack->name, g_rack);
			}
		}
	}

	uint32_t i, nelem;
	for (i = 0, nelem = array_n(&sp->peers); i < nelem; i++) {
		struct server *peer = array_get(&sp->peers, i);
		struct gossip_dc *g_dc = dictFetchValue(gn_pool.dict_dc, &peer->dc);
		struct gossip_rack *g_rack = dictFetchValue(g_dc->dict_rack, &peer->rack);
		struct node *gnode = array_push(&g_rack->nodes);

		node_init(gnode);

		string_copy(&gnode->dc, peer->dc.data, peer->dc.len);
		string_copy(&gnode->rack, g_rack->name.data, g_rack->name.len);
		string_copy(&gnode->name, peer->name.data, peer->name.len);
		string_copy(&gnode->pname, peer->pname.data, peer->pname.len); //ignore the port for now
		gnode->port = peer->port;
		gnode->is_local = peer->is_local;


		if (i == 0) { //Don't override its own state
			gnode->state = sp->ctx->dyn_state;  //likely it is JOINING state
			gnode->ts = (uint64_t)time(NULL);
			current_node = gnode;
			char *b_address = get_broadcast_address(sp);
			string_deinit(&gnode->name);
			string_copy(&gnode->name, b_address, dn_strlen(b_address));
		} else {
			gnode->state = DOWN;
			gnode->ts = 1010101;  //make this to be a very aged ts
		}

		struct dyn_token *ptoken = array_get(&peer->tokens, 0);
		copy_dyn_token(ptoken, &gnode->token);

		//copy socket stuffs

		g_rack->nnodes++;
		//add into dicts
		dictAdd(g_rack->dict_name_nodes, &gnode->name, gnode);
		dictAdd(g_rack->dict_token_nodes, token_to_string(&gnode->token), gnode);

		node_count++;

	}

	//gossip_debug();

	status = gossip_start(sp);
	if (status != DN_OK) {
		goto error;
	}

	return DN_OK;

	error:
	gossip_destroy(sp);
	return DN_OK;

}
コード例 #3
0
ファイル: cpp.c プロジェクト: rui314/8cc-old
void expect_newline(CppContext *ctx) {
    Token *tok = read_cpp_token(ctx);
    if (tok && tok->toktype != TOKTYPE_NEWLINE)
        error_token(tok, "newline expected, but got '%s'", token_to_string(tok));

}
コード例 #4
0
ファイル: dyn_gossip.c プロジェクト: amimimor/dynomite
static rstatus_t
gossip_add_node_if_absent(struct server_pool *sp,
		struct string *dc,
		struct string *rack,
		struct string *address,
		struct string *ip,
		struct string *port,
		struct dyn_token *token,
		uint8_t state,
		uint64_t timestamp)
{
	rstatus_t status;
	bool rack_existed = false;

	log_debug(LOG_VERB, "gossip_add_node_if_absent          : '%.*s'", address->len, address->data);

	struct gossip_dc * g_dc = dictFetchValue(gn_pool.dict_dc, dc);
	if (g_dc == NULL) {
		log_debug(LOG_VERB, "We don't have this datacenter? '%.*s' ", dc->len, dc->data);
		g_dc = array_push(&gn_pool.datacenters);
		gossip_dc_init(g_dc, dc);
		dictAdd(gn_pool.dict_dc, &g_dc->name, g_dc);
	} else {
		log_debug(LOG_VERB, "We got a datacenter in dict for '%.*s' ", dc->len, dc->data);
	}

	struct gossip_rack *g_rack = dictFetchValue(g_dc->dict_rack, rack);
	if (g_rack == NULL) {
		log_debug(LOG_VERB, "We don't have this rack? '%.*s' ", rack->len, rack->data);
		g_rack = array_push(&g_dc->racks);
		gossip_rack_init(g_rack, dc, rack);
		dictAdd(g_dc->dict_rack, &g_rack->name, g_rack);
	} else {
		log_debug(LOG_VERB, "We got a rack for '%.*s' ", rack->len, rack->data);
	}

	struct string *token_str = token_to_string(token);
	struct node *g_node = dictFetchValue(g_rack->dict_token_nodes, token_str);

	if (g_node == NULL) { //never existed
		log_debug(LOG_VERB, "Node not found!  We need to add it");
		log_debug(LOG_VERB, "adding node : dc[%.*s]", dc->len, dc->data);
		log_debug(LOG_VERB, "adding node : g_rack[%.*s]", g_rack->name.len, g_rack->name.data);
		log_debug(LOG_VERB, "adding node : address[%.*s]", address->len, address->data);
		log_debug(LOG_VERB, "adding node : ip[%.*s]", ip->len, ip->data);
		log_debug(LOG_VERB, "adding node : port[%.*s]", port->len, port->data);
		log_debug(LOG_VERB, "suggested state : %d", state);
		//print_dyn_token(token, 6);
		gossip_add_node(sp, dc, g_rack, address, ip, port, token, state);
	} else if (dictFind(g_rack->dict_name_nodes, ip) != NULL) {
		log_debug(LOG_VERB, "Node found");
		if (!g_node->is_local) {  //don't update myself here
			if (string_compare(&g_node->name, ip) != 0) {
				log_debug(LOG_WARN, "Replacing an existing token with new info");
				gossip_replace_node(sp, g_node, address, ip, state);
			} else {  //update state
				gossip_update_state(sp, g_node, state, timestamp);
			}
		}
	} else {
		log_debug(LOG_WARN, "Replacing an existing token with new IP or address");
		gossip_replace_node(sp, g_node, address, ip, state);
		dictAdd(g_rack->dict_name_nodes, &g_node->name, g_node);
	}

	//free token_str
	string_deinit(token_str);
	dn_free(token_str);
	return 0;
}