Changeset 35006 for platform

Show
Ignore:
Timestamp:
08/24/09 10:03:21 (5 years ago)
Author:
kazuho
Message:

update picoev

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • platform/mysql/mycached/trunk/picoev.h

    r35002 r35006  
    5757#define PICOEV_RND_UP(v, d) (((v) + (d) - 1) / (d) * (d)) 
    5858 
     59#define PICOEV_CACHE_LINE_SIZE 32 /* in bytes, ok if greater than the actual */ 
    5960#define PICOEV_SIMD_BITS 128 
    6061#define PICOEV_TIMEOUT_VEC_SIZE 128 
     
    9192      time_t base_time; 
    9293      int resolution; 
     94      void* _free_addr; 
    9395    } timeout; 
    9496    time_t now; 
     
    98100    /* read only */ 
    99101    picoev_fd* fds; 
     102    void* _fds_free_addr; 
    100103    int max_fd; 
    101104    int num_loops; 
     
    106109  extern picoev_globals picoev; 
    107110   
     111  /* internal, aligned allocator */ 
     112  PICOEV_INLINE 
     113  void* picoev_memalign(size_t sz, void** orig_addr) { 
     114    sz = sz + PICOEV_CACHE_LINE_SIZE - 1; 
     115    if ((*orig_addr = malloc(sz)) == NULL) { 
     116      return NULL; 
     117    } 
     118    return 
     119      (void*)PICOEV_RND_UP((unsigned long)*orig_addr, PICOEV_CACHE_LINE_SIZE); 
     120  } 
     121   
    108122  /* initializes picoev */ 
    109123  PICOEV_INLINE 
     
    111125    assert(! PICOEV_IS_INITED); 
    112126    assert(max_fd > 0); 
    113     if ((picoev.fds = (picoev_fd*)valloc(sizeof(picoev_fd) * max_fd)) == NULL) { 
     127    if ((picoev.fds = (picoev_fd*)picoev_memalign(sizeof(picoev_fd) * max_fd, 
     128                                                  &picoev._fds_free_addr)) 
     129        == NULL) { 
    114130      return -1; 
    115131    } 
     
    128144  void picoev_deinit(void) { 
    129145    assert(PICOEV_IS_INITED); 
    130     free(picoev.fds); 
     146    free(picoev._fds_free_addr); 
    131147    picoev.fds = NULL; 
     148    picoev._fds_free_addr = NULL; 
    132149    picoev.max_fd = 0; 
    133150    picoev.num_loops = 0; 
     
    250267    loop->loop_id = ++picoev.num_loops; 
    251268    assert(PICOEV_TOO_MANY_LOOPS); 
    252     /* TODO uses valloc to align memory, for future optimisation using SIMD */ 
    253     if ((loop->timeout.vec 
    254          = (short*)valloc((picoev.timeout_vec_size 
    255                           + picoev.timeout_vec_of_vec_size) 
    256                          * sizeof(short) * PICOEV_TIMEOUT_VEC_SIZE)) 
     269    if ((loop->timeout.vec_of_vec 
     270         = (short*)picoev_memalign((picoev.timeout_vec_of_vec_size 
     271                                    + picoev.timeout_vec_size) 
     272                                   * sizeof(short) * PICOEV_TIMEOUT_VEC_SIZE, 
     273                                   &loop->timeout._free_addr)) 
    257274        == NULL) { 
    258275      --picoev.num_loops; 
    259276      return -1; 
    260277    } 
    261     loop->timeout.vec_of_vec 
    262       = loop->timeout.vec + picoev.timeout_vec_size * PICOEV_TIMEOUT_VEC_SIZE; 
     278    loop->timeout.vec = loop->timeout.vec_of_vec 
     279      + picoev.timeout_vec_of_vec_size * PICOEV_TIMEOUT_VEC_SIZE; 
    263280    loop->timeout.base_idx = 0; 
    264281    loop->timeout.base_time = time(NULL); 
     
    272289  PICOEV_INLINE 
    273290  void picoev_deinit_loop_internal(picoev_loop* loop) { 
    274     free(loop->timeout.vec); 
     291    free(loop->timeout._free_addr); 
    275292  } 
    276293