阅读swoole遇到的问题

摸虾米 发布于 2015/05/15 13:58
阅读 1K+
收藏 1

@matyhtf 你好,想跟你请教个问题:


@matyhtf 你好,想跟你请教个问题:


if (SwooleTG.type == SW_THREAD_REACTOR)
    {
        return swReactorThread_send2worker((void *) &(task->data), send_len, target_worker_id);
    }
    else
    {
        return swServer_send2worker_blocking(serv, (void *) &(task->data), send_len, target_worker_id);
    }


static sw_inline int swServer_send2worker_blocking(swServer *serv, void *data, int len, uint16_t target_worker_id)
{
    int ret = -1;
    swWorker *worker = &(serv->workers[target_worker_id]);

    if (serv->ipc_mode == SW_IPC_MSGQUEUE)
    {
        swQueue_data *in_data = (swQueue_data *) ((void *) data - sizeof(long));

        //加1,消息队列的type必须不能为0
        in_data->mtype = target_worker_id + 1;
        ret = serv->read_queue.in(&serv->read_queue, in_data, len);
    }
    else
    {
        sendto_unix_sock:
        ret = write(worker->pipe_master, (void *) data, len);
        if (ret < 0)
        {
            if (errno == EINTR)
            {
                goto sendto_unix_sock;
            }
            else if (errno == EAGAIN)
            {
                swSocket_wait(worker->pipe_master, SW_WORKER_WAIT_TIMEOUT, SW_EVENT_WRITE);
            }
        }
    }
    return ret;
}

swServer_send2worker_blocking这个方法是阻塞发送,但是有个问题,看了他的实现,发现如果写入失败返回EAGAIN的话,只是等待,没有将这次的写入数据重发,这数据不是就丢掉了吗?


第二个问题

代码里有一处直接
if (read(event->fd, &task, sizeof(task)) > 0)
    {
        /**
         * Big package
         */
        ret = swWorker_excute(factory, &task);
        if (task.info.type == SW_EVENT_PACKAGE_START)
        {
            //no data
            if (ret < 0 && errno == EAGAIN)
            {
                return SW_OK;
            }
            else if (ret > 0)
            {
                goto read_from_pipe;
            }
        }
        return ret;
    }

不考虑read中发生EINTR以及EANGIN事件吗?无法保证一下子读出就是task结构吧


看了后苦恼好几天了,请版主帮忙解答,业务上想用,但是发现这几个问题,不太敢用啊,求解答
加载中
0
matyhtf
matyhtf

1. 你用的swoole版本是比较老的代码吧,新代码中没有搜索到swServer_send2worker_blocking

2. swoole使用的unix socket dgram 每次读取的一定是一个完整的包。所以肯定是task结构

返回顶部
顶部