/****************************************************************************** **函数名称: 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; }
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(); }
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; }
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(); }
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(); }