2014-02-17 15 views
0

Я пытаюсь отладить код, использующий библиотеку libevent. В этой библиотеке есть функция event_new, которая должна создать event_cb. Как-то после отправки базы событий event_cb нельзя вызвать или получить доступ. Эта проблема возникает только на hpux itanium. Этот код работает на hpux pa-risc, Redhat, AIX и Solaris. Есть ли какая-то определенная вещь, которая должна быть установлена?Функция event_new() не работает на hpux itanium

Это часть кода

int ttypread (int fd, Header *h, char **buf) 
{ 

    int c,k; 
    struct user_data user_data; 
    struct bufferevent *in_buffer; 
    struct event_config *evconfig; 

    log_debug("inside ttypread"); 

    in_buffer = NULL; 
    user_data.fd = fd; 
    user_data.h = h; 
    user_data.buf = buf; 

    log_debug("from user_data, fd = %d",user_data.fd); //the log_debug is a debugging function for me to check the value sent by the system. I use it to compare between each platform 
    log_debug("from user_data, buf = %s",user_data.buf); 
    log_debug("from user_data, h.len = %d",user_data.h->len); 
    log_debug("from user_data, h.type = %d",user_data.h->type); 

    evconfig = event_config_new(); 
    if (evconfig == NULL) { 
      log_error("event_config_new failed"); 
      return -1; 
    } 

    if (event_config_require_features(evconfig, EV_FEATURE_FDS)!=0) { 
      log_error("event_config_require_features failed"); 
      return -1; 
    } 

    base = event_base_new_with_config(evconfig); 
    if (!base) { 
      log_error("ttypread:event_base_new failed"); 
      return -1; 
    } 

    const char* method;    //these 3 lines are the new line edited 
    method = event_base_get_method(base); 
    log_debug("ttyread is using method = %s",method); 

    ev = event_new(base, fd, EV_READ|EV_PERSIST, ttypread_event_cb, &user_data); 
    c = event_add(ev, NULL); 
    log_debug("ttypread passed event_add with c value is %d",c); 

    in_buffer = bufferevent_socket_new(base, STDIN_FILENO, BEV_OPT_CLOSE_ON_FREE); 
    log_debug("ttypread passed bufferevent_socket_new"); 
    if(in_buffer == NULL){ 
      log_debug("problem with bufferevent_socket_new"); 
    } 
    bufferevent_setcb(in_buffer, in_read_cb, NULL, in_event_cb, NULL); 
    bufferevent_disable(in_buffer, EV_WRITE); 
    bufferevent_enable(in_buffer, EV_READ); 

    k =event_base_dispatch(base); 
    log_debug("event_base have been dispatched"); //when looking at the debugging file, the other plaform will go to ttypread_event_cb function. But for hpux itanium, it stays here. 

    if (k == 0){ 
      log_debug("event_base_dispatch returned 0"); 
    } else if (k == -1){ 
      log_debug("event_base_dispatch returned -1"); 
    } else { 
      log_debug("event_base_dispatch returned 1"); 
    } 
    event_base_free(base); 
    event_free(ev); 

    log_debug("finish ttypread"); 
    log_debug("ttypread_ret will return [%d]",ttypread_ret); 
    return ttypread_ret; 
} 

void ttypread_event_cb(evutil_socket_t fd, short events, void *arg) 
{ 
    int nread; 
    struct timeval t; 
    struct user_data *user_data; 

    user_data = (struct user_data*)arg; 
    nread = 0; 

    log_debug("inside ttypread_event_cb"); 
    if (events & EV_READ) { 
      log_debug("got events & EV_READ"); 
      nread = ttyread(fd, user_data->h, user_data->buf); 
      if (nread == -1) { 
        ttypread_ret = -1; 
        event_del(ev); 
        event_base_loopexit(base, NULL); 
      } else if (nread == 0) { 
        if (access(input_filename, F_OK)!=0) { 
          log_debug("cannot access [%s]",input_filename); 
          tcsetattr(0, TCSANOW, &old); /* Return terminal state */ 
          exit(EXIT_SUCCESS); 
        } 
        t.tv_sec = 0; 
        t.tv_usec = 250000; 
        select(0, 0, 0, 0, &t); 
      } else { 
        ttypread_ret = 1; 
        event_del(ev); 
        event_base_loopexit(base, NULL); 
      } 
    } 
    else if (events & EV_WRITE) { 
    log_debug("got events & EV_WRITE"); 
    } 
} 

Не уверен, если это поможет. Но лишь некоторые данные на HPUX Itanium

uname -a = HP-UX HPUX-ита B.11.23 U ia64

Если вам нужна дополнительная информация или другое заявление о функции, просто оставить комментарий, и я отредактирую вопрос.

EDIT: Я добавил функцию внутри ttypread. Как-то для hpux itanium возвращается возвращающийся devpoll, а другая платформа возвращает опрос. Я не уверен, что это проблема. Но если это так, есть ли способ изменить его?

+0

Что значит «event_cb нельзя вызвать или получить доступ»? – ldx

+0

В моем файле отладки. После запуска event_base _dispatch. Я предполагаю увидеть log_debug («внутри ttypread_event_cb»). Как-то для hpux itanium, он не показывает его. Я добавил log_debug для каждой строки, и он показывает, что строка останавливается после строки event_base _dispatch. –

ответ

0

После проверки результата из event_base_get_method, я узнал, что только на моем hpux-itanium используется метод devpoll. Вот как я его решаю.

char string[8] = "devpoll"; 
    struct user_data user_data; 
    struct bufferevent *in_buffer; 
    struct event_config *evconfig; 
    const char *method; 
    const char *devpoll; 

    devpoll = string; 
    in_buffer = NULL; 
    user_data.fd = fd; 
    user_data.h = h; 
    user_data.buf = buf; 

    evconfig = event_config_new(); 
    if (evconfig == NULL) { 
      log_error("event_config_new failed"); 
      return -1; 
    } 

    if (event_config_require_features(evconfig, EV_FEATURE_FDS)!=0) { 
      log_error("event_config_require_features failed"); 
      return -1; 
    } 

    if (event_config_avoid_method(evconfig,devpoll) != 0) 
    { 
      log_error("Failed to ignore devpoll method"); 
    } 

Заставить libevent игнорировать использование devpoll и использовать опрос вместо этого.

 Смежные вопросы

  • Нет связанных вопросов^_^