Exemple #1
0
/******************************************************************************
 **函数名称: sdrd_cli_send
 **功    能: 接收客户端发送数据
 **输入参数:
 **输出参数: NONE
 **返    回: 0:成功 !0:失败
 **实现描述: 将数据放入应答队列
 **注意事项:
 **作    者: # Qifeng.zou # 2015.06.01 #
 ******************************************************************************/
int sdrd_cli_send(sdrd_cli_t *cli, int type, int dest, void *data, size_t len)
{
    void *addr;
    sdtp_frwd_t *frwd;

    /* > 申请队列空间 */
    addr = shm_queue_malloc(cli->sendq, sizeof(sdtp_frwd_t)+len);
    if (NULL == addr) {
        return SDTP_ERR;
    }

    frwd = (sdtp_frwd_t *)addr;

    frwd->type = type; 
    frwd->dest = dest;
    frwd->length = len;

    memcpy(addr+sizeof(sdtp_frwd_t), data, len);

    /* > 压入队列空间 */
    if (shm_queue_push(cli->sendq, addr)) {
        shm_queue_dealloc(cli->sendq, addr);
        return SDTP_ERR;
    }

    return SDTP_OK;
}
Exemple #2
0
static void add_event(enum local_event_type type, struct local_node *lnode,
		void *buf, size_t buf_len)
{
	int idx, i;
	struct local_node *n;
	struct local_event ev = {
		.type = type,
		.sender = *lnode,
	};

	ev.buf_len = buf_len;
	if (buf)
		memcpy(ev.buf, buf, buf_len);

	ev.nr_lnodes = get_nodes(ev.lnodes);

	switch (type) {
	case EVENT_JOIN_REQUEST:
		ev.lnodes[ev.nr_lnodes] = *lnode;
		ev.nr_lnodes++;
		break;
	case EVENT_LEAVE:
		n = find_lnode(lnode, ev.nr_lnodes, ev.lnodes);
		idx = n - ev.lnodes;

		ev.nr_lnodes--;
		memmove(n, n + 1, sizeof(*n) * (ev.nr_lnodes - idx));
		break;
	case EVENT_GATEWAY:
		n = find_lnode(lnode, ev.nr_lnodes, ev.lnodes);
		n->gateway = true;
		break;
	case EVENT_NOTIFY:
	case EVENT_BLOCK:
		break;
	case EVENT_UPDATE_NODE:
		n = find_lnode(lnode, ev.nr_lnodes, ev.lnodes);
		n->node = lnode->node;
		break;
	case EVENT_JOIN_RESPONSE:
		abort();
	}

	sd_dprintf("type = %d, sender = %s", ev.type, lnode_to_str(&ev.sender));
	for (i = 0; i < ev.nr_lnodes; i++)
		sd_dprintf("%d: %s", i, lnode_to_str(ev.lnodes + i));

	shm_queue_push(&ev);

	shm_queue_notify();
}
Exemple #3
0
static int add_event(enum local_event_type type, struct local_node *lnode,
		      void *buf, size_t buf_len)
{
	struct local_node *n;
	struct local_event ev = {
		.type = type,
		.sender = *lnode,
	};

	ev.buf_len = buf_len;
	if (buf)
		memcpy(ev.buf, buf, buf_len);

	ev.nr_lnodes = get_nodes(ev.lnodes);

	switch (type) {
	case EVENT_JOIN:
		ev.lnodes[ev.nr_lnodes] = *lnode;
		ev.nr_lnodes++;
		break;
	case EVENT_LEAVE:
		xlremove(lnode, ev.lnodes, &ev.nr_lnodes, lnode_cmp);
		break;
	case EVENT_GATEWAY:
		n = xlfind(lnode, ev.lnodes, ev.nr_lnodes, lnode_cmp);
		n->gateway = true;
		break;
	case EVENT_NOTIFY:
	case EVENT_BLOCK:
		break;
	case EVENT_UPDATE_NODE:
		n = xlfind(lnode, ev.lnodes, ev.nr_lnodes, lnode_cmp);
		n->node = lnode->node;
		break;
	case EVENT_ACCEPT:
		abort();
	}

	sd_debug("type = %d, sender = %s", ev.type, lnode_to_str(&ev.sender));
	for (int i = 0; i < ev.nr_lnodes; i++)
		sd_debug("%d: %s", i, lnode_to_str(ev.lnodes + i));

	shm_queue_push(&ev);

	shm_queue_notify();

	return SD_RES_SUCCESS;
}
Exemple #4
0
static void add_event(enum local_event_type type,
		      struct sheepdog_node_list_entry *node, void *buf,
		      size_t buf_len, void (*block_cb)(void *arg))
{
	int idx;
	struct sheepdog_node_list_entry *n;
	pid_t *p;
	struct local_event ev = {
		.type = type,
		.sender = *node,
	};

	ev.buf_len = buf_len;
	if (buf)
		memcpy(ev.buf, buf, buf_len);

	ev.nr_nodes = get_nodes(ev.nodes, ev.pids);

	switch (type) {
	case EVENT_JOIN:
		ev.blocked = 1;
		ev.nodes[ev.nr_nodes] = *node;
		ev.pids[ev.nr_nodes] = getpid(); /* must be local node */
		ev.nr_nodes++;
		break;
	case EVENT_LEAVE:
		n = lfind(node, ev.nodes, &ev.nr_nodes, sizeof(*n), node_cmp);
		if (!n)
			panic("internal error\n");
		idx = n - ev.nodes;
		p = ev.pids + idx;

		ev.nr_nodes--;
		memmove(n, n + 1, sizeof(*n) * (ev.nr_nodes - idx));
		memmove(p, p + 1, sizeof(*p) * (ev.nr_nodes - idx));
		break;
	case EVENT_NOTIFY:
		ev.blocked = !!block_cb;
		ev.block_cb = block_cb;
		break;
	}

	shm_queue_push(&ev);

	shm_queue_notify();
}
Exemple #5
0
static void add_event(enum local_event_type type, struct sd_node *node,
		void *buf, size_t buf_len)
{
	int idx;
	struct sd_node *n;
	pid_t *p;
	struct local_event ev = {
		.type = type,
		.sender = *node,
	};

	ev.buf_len = buf_len;
	if (buf)
		memcpy(ev.buf, buf, buf_len);

	ev.nr_nodes = get_nodes(ev.nodes, ev.pids);

	switch (type) {
	case EVENT_JOIN_REQUEST:
		ev.nodes[ev.nr_nodes] = *node;
		ev.pids[ev.nr_nodes] = getpid(); /* must be local node */
		ev.nr_nodes++;
		break;
	case EVENT_LEAVE:
		n = lfind(node, ev.nodes, &ev.nr_nodes, sizeof(*n), node_id_cmp);
		if (!n)
			panic("internal error\n");
		idx = n - ev.nodes;
		p = ev.pids + idx;

		ev.nr_nodes--;
		memmove(n, n + 1, sizeof(*n) * (ev.nr_nodes - idx));
		memmove(p, p + 1, sizeof(*p) * (ev.nr_nodes - idx));
		break;
	case EVENT_NOTIFY:
	case EVENT_BLOCK:
		break;
	case EVENT_JOIN_RESPONSE:
		abort();
	}

	shm_queue_push(&ev);

	shm_queue_notify();
}