Пример #1
0
static void inet_sch_task_sock_event_cb(EV_P_ struct ev_io *w, int revents) {
    inet_sch_manage_t mgr;
    inet_sch_task_t task;
    CURLMcode rc;
    int action;

    task = (inet_sch_task_t)w->data;
    assert(task);

    mgr = task->m_mgr;

    action = (revents & EV_READ?CURL_POLL_IN : 0) | ( revents & EV_WRITE?CURL_POLL_OUT : 0);

    rc = curl_multi_socket_action(task->m_mgr->m_multi, w->fd, action, &mgr->m_still_running);
    if (rc != CURLM_OK) {
        CPE_ERROR(
            mgr->m_em, "%s: sock_event_cb: curl_multi_socket_handle fail, %s(%d)!",
            inet_sch_manage_name(task->m_mgr),
            inet_sch_curl_code_msg(rc), rc);
        return;
    }

    inet_sch_process_multi_info(mgr);
    if (mgr->m_still_running <= 0) {
        if (mgr->m_debug >= 2) {
            CPE_INFO(
                mgr->m_em, "%s: sock_event_cb: no task runing, stop timer!",
                inet_sch_manage_name(task->m_mgr));
        }
        ev_timer_stop(mgr->m_loop, &mgr->m_timer_event);
    }
}
Пример #2
0
void inet_sch_process_multi_info(inet_sch_manage_t mgr) {
    CURLMsg *msg;

    while ((msg = curl_multi_info_read(mgr->m_multi, NULL))) {
        struct inet_sch_task * task;
        CURL * easy;
        CURLcode res;
        char * eff_url;

        easy = msg->easy_handle;
        res = msg->data.result;
        curl_easy_getinfo(easy, CURLINFO_PRIVATE, &task);
        curl_easy_getinfo(easy, CURLINFO_EFFECTIVE_URL, &eff_url);

        switch(msg->msg) {
        case CURLMSG_DONE: {
            if (mgr->m_debug) {
                CPE_INFO(mgr->m_em, "%s: DONE: %s => (%d) %s", inet_sch_manage_name(mgr), eff_url, res, ""/*connection->error*/);
            }
            inet_sch_task_complete(task);
            break;
        }
        default:
            CPE_ERROR(mgr->m_em, "%s: UNKNOWN: %s => (%d) %s", inet_sch_manage_name(mgr), eff_url, res, ""/*connection->error*/);
        }
    }
}
Пример #3
0
int inet_sch_task_run(inet_sch_task_t task) {
    CURLMcode rc;

    assert(task);

    if (task->m_state != inet_sch_task_state_init) {
        CPE_ERROR(
            task->m_mgr->m_em, "%s: run task: task run in error state %d!",
            inet_sch_manage_name(task->m_mgr),
            task->m_state);
        return -1;
    }

    rc = curl_multi_add_handle(task->m_mgr->m_multi, task->m_handler);
    if (rc != CURLM_OK) {
        CPE_ERROR(
            task->m_mgr->m_em, "%s: run task: curl_multi_add_handle fail, %s(%d)!",
            inet_sch_manage_name(task->m_mgr),
            inet_sch_curl_code_msg(rc), rc);
        return -1;
    }

    task->m_state = inet_sch_task_state_runing;

    return 0;
}
Пример #4
0
int inet_sch_manage_sock_cb(CURL *e, curl_socket_t s, int what, void *cbp, void * sockpp) {
    static const char * whatstr[]={ "none", "IN", "OUT", "INOUT", "REMOVE"};
    inet_sch_manage_t mgr;
    inet_sch_task_t task;

    mgr = (inet_sch_manage_t)cbp;
    assert(mgr);

    if (mgr->m_debug >= 2) {
        CPE_INFO(
            mgr->m_em, "%s: socket callback: e %p s %i what %s(%d)",
            inet_sch_manage_name(mgr), e, s,
            (what >= 0 && what < sizeof(whatstr) / sizeof(whatstr[0])) ? whatstr[what] : "???", what);
    }

    curl_easy_getinfo(e, CURLINFO_PRIVATE, &task);
    assert(task);

    if (what == CURL_POLL_REMOVE) {
        inet_sch_task_complete(task);
    }
    else {
        inet_sch_task_set_socket(task, s, what);
    }

    return 0;
}
Пример #5
0
inet_sch_task_t inet_sch_task_create(inet_sch_manage_t mgr) {
    inet_sch_task_t task;

    task = mem_alloc(mgr->m_alloc, sizeof(struct inet_sch_task));
    if (task == NULL) return NULL;

    task->m_mgr = mgr;
    task->m_state = inet_sch_task_state_init;
    task->m_evset = 0;
    task->m_error[0] = '\0';

    task->m_handler = curl_easy_init();
    if (task->m_handler == NULL) {
        CPE_ERROR(
            mgr->m_em, "%s: create task: curl_easy_init fail!",
            inet_sch_manage_name(mgr));
        mem_free(mgr->m_alloc, task);
        return NULL;
    }
    curl_easy_setopt(task->m_handler, CURLOPT_PRIVATE, task);
    curl_easy_setopt(task->m_handler, CURLOPT_ERRORBUFFER, task->m_error);

    task->m_ev.data = task;

    return task;
}
Пример #6
0
static void inet_sch_timer_cb(EV_P_ struct ev_timer *w, int revents) {
    CURLMcode rc;
    inet_sch_manage_t mgr = (inet_sch_manage_t)w->data;

    if (mgr->m_debug >= 2) {
        CPE_INFO(
            mgr->m_em, "%s: timer: event=%d",
            inet_sch_manage_name(mgr), revents);
    }

    rc = curl_multi_socket_action(mgr->m_multi, CURL_SOCKET_TIMEOUT, 0, &mgr->m_still_running);
    if (rc != CURLM_OK) {
        CPE_ERROR(
            mgr->m_em, "%s: timer: curl_multi_socket_action fail, %d(%s)",
            inet_sch_manage_name(mgr), rc, inet_sch_curl_code_msg(rc));
    }

    inet_sch_process_multi_info(mgr);
}
Пример #7
0
int inet_sch_manage_timer_update_cb(CURLM *multi, long timeout_ms, inet_sch_manage_t mgr) {
    assert(mgr);

    if (mgr->m_debug >= 2) {
        CPE_INFO(
            mgr->m_em, "%s: timer update: timeout_ms=%ld\n",
            inet_sch_manage_name(mgr), timeout_ms);
    }

    ev_timer_stop(mgr->m_loop, &mgr->m_timer_event);
    if (timeout_ms > 0) {
        double  t = timeout_ms / 1000;
        ev_timer_init(&mgr->m_timer_event, inet_sch_timer_cb, t, 0.);
        ev_timer_start(mgr->m_loop, &mgr->m_timer_event);
    }
    else {
        inet_sch_timer_cb(mgr->m_loop, &mgr->m_timer_event, 0);
    }

    return 0;
}