2014-02-17 31 views
0

我試圖調試使用libevent庫的代碼。在該庫中,有一個函數event_new用於創建event_cb。不知怎的,在我分派事件庫之後,event_cb無法被調用或訪問。這個問題只發生在hpux itanium上。此代碼適用於hpux pa-risc,Redhat,AIX和Solaris。有什麼需要設置的東西嗎?hpux itanium上event_new()函數失敗

這是代碼的一部分

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"); 
    } 
} 

不知道這是否幫助。但就在HP-UX Itanium的一些信息

UNAME -A-HP-UX HPUX-ITA B.11.23ùIA64

如果你需要的任何附加信息或其他聲明,只留下一個評論,我會編輯這個問題。

編輯:我在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並使用poll來代替。