Changeset 4905:3b98d0dc037b in roaraudio for libroar/buffer.c


Ignore:
Timestamp:
05/05/11 11:30:38 (13 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:

added clean error handling

File:
1 edited

Legend:

Unmodified
Added
Removed
  • libroar/buffer.c

    r4903 r4905  
    5757}; 
    5858 
     59#define _ckbuf(m)  if ( buf == NULL || (m) ) { roar_err_set(ROAR_ERROR_FAULT); return -1; } 
     60 
    5961int roar_buffer_new_data (struct roar_buffer ** buf, size_t len, void ** data) { 
    6062 void * bufdata; 
     63 int err; 
    6164 
    6265 if ((bufdata = roar_mm_malloc(len)) == NULL) { 
     
    6568 
    6669 if ( roar_buffer_new_no_ma(buf, len, bufdata) == -1 ) { 
     70  err = roar_error; 
    6771  roar_mm_free(bufdata); 
     72  roar_err_set(err); 
    6873  return -1; 
    6974 } 
    7075 
    7176 if ( roar_buffer_set_flag(*buf, ROAR_BUFFER_FLAG_NOFREE, ROAR_BUFFER_RESET) == -1 ) { 
     77  err = roar_error; 
    7278  roar_buffer_free(*buf); 
    7379  roar_mm_free(bufdata); 
     80  roar_err_set(err); 
    7481  return -1; 
    7582 } 
     
    8693 ROAR_DBG("buffer_new(buf=%p, len=%i) = ?", buf, len); 
    8794 
    88  if ( buf == NULL || data == NULL ) 
    89   return -1; 
     95 _ckbuf(data == NULL) 
    9096 
    9197 if ((new = roar_mm_malloc(sizeof(struct roar_buffer))) == NULL) { 
     
    115121 
    116122int roar_buffer_ref      (struct roar_buffer *  buf) { 
    117  if ( buf == NULL ) 
    118   return -1; 
     123 _ckbuf(0) 
    119124 
    120125 buf->refc++; 
     
    126131 struct roar_buffer * next; 
    127132 
    128  if ( buf == NULL ) 
    129   return -1; 
     133 _ckbuf(0) 
    130134 
    131135 if ( buf->refc == 0 ) { 
     
    159163  if ( next != NULL ) 
    160164   *next = NULL; 
     165  roar_err_set(ROAR_ERROR_FAULT); 
    161166  return -1; 
    162167 } 
     
    179184 unsigned int deep = 0; 
    180185 
    181  if ( buf == NULL ) 
    182   return -1; 
     186 _ckbuf(0) 
    183187 
    184188 ROAR_DBG("buffer_add(buf=%p, next=%p) = ?", buf, next); 
    185189 
    186  if ( buf->flags & ROAR_BUFFER_FLAG_RING ) 
    187   return -1; 
     190 if ( buf->flags & ROAR_BUFFER_FLAG_RING ) { 
     191  roar_err_set(ROAR_ERROR_INVAL); 
     192  return -1; 
     193 } 
    188194 
    189195 if ( buf == next ) { 
    190196  ROAR_ERR("buffer_add(*): both pointer are of the same destination, This is a error in the application"); 
     197  roar_err_set(ROAR_ERROR_INVAL); 
    191198  return -1; 
    192199 } 
     
    200207  if ( buf == next ) { 
    201208   ROAR_ERR("buffer_add(*): Can not add buffer: loop detected at deep %u. This is a error in the application", deep); 
     209   // why don't we return here? 
    202210  } 
    203211 } 
     
    211219 
    212220int roar_buffer_clear_next (struct roar_buffer *  buf) { 
    213  if ( buf == NULL ) 
    214   return -1; 
     221 _ckbuf(0) 
    215222 
    216223 buf->next = NULL; 
     
    220227 
    221228int roar_buffer_get_next (struct roar_buffer *  buf, struct roar_buffer ** next) { 
    222  if ( buf == NULL ) 
    223   return -1; 
     229 _ckbuf(0) 
    224230 
    225231 *next = buf->next; 
     
    231237 struct roar_buffer * n; 
    232238 
    233  if ( buf == NULL || len == 0 ) 
    234   return -1; 
     239 _ckbuf(0) 
     240 
     241 if ( len == 0 ) { 
     242  roar_err_set(ROAR_ERROR_RANGE); 
     243  return -1; 
     244 } 
    235245 
    236246 // just to be sure: 
     
    256266 
    257267int roar_buffer_get_data (struct roar_buffer *  buf, void   ** data) { 
    258  if ( buf == NULL ) 
    259   return -1; 
     268 _ckbuf(0) 
    260269 
    261270 *data = buf->user_data; 
     
    265274 
    266275int roar_buffer_set_offset (struct roar_buffer *  buf, size_t off) { 
    267  if ( buf == NULL ) 
    268   return -1; 
     276 _ckbuf(0) 
     277 
     278 if ( off > buf->user_len ) { 
     279  roar_err_set(ROAR_ERROR_RANGE); 
     280  return -1; 
     281 } 
    269282 
    270283 buf->user_len  -= off; 
     
    279292 void * cd; 
    280293 
    281  if ( len == NULL || buf == NULL || data == NULL ) { 
    282   ROAR_DBG("roar_buffer_shift_out(buf=%p, data=%p, len={%lu}) = -1 // Invalid input", buf, data, (unsigned long)*len); 
    283   return -1; 
    284  } 
     294 _ckbuf(len == NULL || data == NULL); 
    285295 
    286296 if ( *buf == NULL ) { 
    287297  ROAR_DBG("roar_buffer_shift_out(buf=%p, data=%p, len={%lu}) = -1 // Invalid pointer to buffer ring", buf, data, (unsigned long)len); 
     298  roar_err_set(ROAR_ERROR_FAULT); 
    288299  return -1; 
    289300 } 
     
    338349 
    339350int roar_buffer_set_meta (struct roar_buffer * buf, void *  meta) { 
    340  if ( buf == NULL ) 
    341   return -1; 
     351 _ckbuf(0) 
    342352 
    343353 buf->meta.vp = meta; 
     
    347357 
    348358int roar_buffer_get_meta (struct roar_buffer * buf, void ** meta) { 
    349  if ( buf == NULL || meta == NULL ) 
    350   return -1; 
     359 _ckbuf(meta == NULL) 
    351360 
    352361 *meta = buf->meta.vp; 
     
    356365 
    357366int roar_buffer_set_meta_i32(struct roar_buffer *  buf, int32_t    meta) { 
    358  if ( buf == NULL ) 
    359   return -1; 
     367 _ckbuf(0) 
    360368 
    361369 buf->meta.i32 = meta; 
     
    365373 
    366374int roar_buffer_get_meta_i32(struct roar_buffer *  buf, int32_t *  meta) { 
    367  if ( buf == NULL || meta == NULL ) 
    368   return -1; 
     375 _ckbuf(meta == NULL) 
    369376 
    370377 *meta = buf->meta.i32; 
     
    374381 
    375382int roar_buffer_set_type    (struct roar_buffer *  buf, int        type) { 
    376  if ( buf == NULL ) 
    377   return -1; 
     383 _ckbuf(0) 
    378384 
    379385 switch (type) { 
     
    383389   break; 
    384390  default: 
     391    roar_err_set(ROAR_ERROR_NOTSUP); 
    385392    return -1; 
    386393 } 
     
    392399 
    393400int roar_buffer_get_type    (struct roar_buffer *  buf, int     *  type) { 
    394  if ( buf == NULL || type == NULL ) 
    395   return -1; 
     401 _ckbuf(type == NULL) 
    396402 
    397403 *type = buf->type; 
     
    404410 void   * newbuf; 
    405411 
    406  if ( buf == NULL ) 
    407   return -1; 
     412 _ckbuf(0) 
    408413 
    409414 // handle specal case where user length is zero: 
     
    415420 if ( len > buf->user_len ) { 
    416421  // we can only enlage a buffer if it's one of our own memory segments 
    417   if ( buf->flags & ROAR_BUFFER_FLAG_NOFREE ) 
     422  if ( buf->flags & ROAR_BUFFER_FLAG_NOFREE )  { 
     423   roar_err_set(ROAR_ERROR_NOTSUP); 
    418424   return -1; 
     425  } 
    419426 
    420427  totlen = buf->len - buf->user_len + len; 
     
    433440 
    434441int roar_buffer_get_len  (struct roar_buffer *  buf, size_t *  len) { 
    435  if ( buf == NULL ) 
    436   return -1; 
     442 _ckbuf(0) 
    437443 
    438444 *len = buf->user_len; 
     
    442448 
    443449int roar_buffer_set_flag (struct roar_buffer *  buf, int flag, int reset) { 
    444  if ( buf == NULL ) 
    445   return -1; 
     450 _ckbuf(0) 
    446451 
    447452 buf->flags |= flag; 
     
    454459 
    455460int roar_buffer_get_flag (struct roar_buffer *  buf, int flag) { 
    456  if ( buf == NULL ) 
    457   return -1; 
     461 _ckbuf(0) 
    458462 
    459463 return buf->flags & flag; 
     
    464468 struct roar_buffer *  new; 
    465469 void * od, * nd; 
     470 int err; 
     471 
     472 _ckbuf(copy == NULL) 
    466473 
    467474 *copy = NULL; 
    468475 
    469  while (cur) { 
     476 while (cur != NULL) { 
    470477  if ( roar_buffer_new(&new, cur->user_len) == -1 ) { 
     478   err = roar_error; 
    471479   roar_buffer_free(*copy); 
     480   roar_err_set(err); 
    472481   return -1; 
    473482  } 
     
    484493  cur = cur->next; 
    485494 } 
     495 
    486496 return 0; 
    487497} 
    488498 
    489499int roar_buffer_ring_stats (struct roar_buffer *  buf, struct roar_buffer_stats * stats) { 
    490  if ( buf == NULL ) 
    491   return -1; 
     500 _ckbuf(0) 
    492501 
    493502 stats->parts        = 0; 
     
    495504 stats->memory_usage = 0; 
    496505 
    497  while (buf) { 
     506 while (buf != NULL ) { 
    498507  stats->parts++; 
    499508  stats->bytes        += buf->user_len; 
     
    511520 size_t tmp; 
    512521 
     522 _ckbuf(len == NULL) 
     523 
    513524 if ( buf == NULL || len == NULL ) 
    514525  return -1; 
    515526 
    516  if ( data == NULL && *len != 0 ) 
    517   return -1; 
    518  
    519  if ( !(buf->flags & ROAR_BUFFER_FLAG_RING) ) 
    520   return -1; 
     527 if ( data == NULL && *len != 0 ) { 
     528  roar_err_set(ROAR_ERROR_FAULT); 
     529  return -1; 
     530 } 
     531 
     532 if ( !(buf->flags & ROAR_BUFFER_FLAG_RING) ) { 
     533  roar_err_set(ROAR_ERROR_TYPEMM); 
     534  return -1; 
     535 } 
    521536 
    522537 if ( *len == 0 ) 
     
    524539 
    525540 // we may handle this later: 
    526  if ( *len > buf->user_len ) 
    527   return -1; 
     541 if ( *len > buf->user_len ) { 
     542  roar_err_set(ROAR_ERROR_NOTSUP); 
     543  return -1; 
     544 } 
    528545 
    529546 if ( (buf->flags & ROAR_BUFFER_FLAG_FREE_RUNNING) ) { 
     
    593610   return 0; 
    594611  } 
    595  
    596   return -1; 
    597  } 
    598  
     612 } 
     613 
     614 roar_err_set(ROAR_ERROR_UNKNOWN); 
    599615 return -1; 
    600616} 
     
    608624 ROAR_DBG("roar_buffer_ring_write(buf=%p, data=%p, len=%p) = ?", buf, data, len); 
    609625 
    610  if ( buf == NULL || len == NULL ) 
    611   return -1; 
    612  
    613  if ( data == NULL && *len != 0 ) 
    614   return -1; 
    615  
    616  if ( !(buf->flags & ROAR_BUFFER_FLAG_RING) ) 
    617   return -1; 
     626 _ckbuf(len == NULL) 
     627 
     628 if ( data == NULL && *len != 0 ) { 
     629  roar_err_set(ROAR_ERROR_FAULT); 
     630  return -1; 
     631 } 
     632 
     633 if ( !(buf->flags & ROAR_BUFFER_FLAG_RING) ) { 
     634  roar_err_set(ROAR_ERROR_TYPEMM); 
     635  return -1; 
     636 } 
    618637 
    619638 if ( *len == 0 ) 
     
    621640 
    622641 // we may handle this later: 
    623  if ( *len > buf->user_len ) 
    624   return -1; 
     642 if ( *len > buf->user_len ) { 
     643  roar_err_set(ROAR_ERROR_NOTSUP); 
     644  return -1; 
     645 } 
    625646 
    626647 if ( (buf->flags & ROAR_BUFFER_FLAG_FREE_RUNNING) ) { 
     
    702723   return 0; 
    703724  } 
    704  
    705   return -1; 
    706  } 
    707  
     725 } 
     726 
     727 roar_err_set(ROAR_ERROR_UNKNOWN); 
    708728 return -1; 
    709729} 
     
    713733 size_t have; 
    714734 
    715  if ( buf == NULL ) 
    716   return -1; 
    717  
    718  if ( !(buf->flags & ROAR_BUFFER_FLAG_RING) ) 
    719   return -1; 
     735 _ckbuf(0) 
     736 
     737 if ( !(buf->flags & ROAR_BUFFER_FLAG_RING) ) { 
     738  roar_err_set(ROAR_ERROR_TYPEMM); 
     739  return -1; 
     740 } 
    720741 
    721742 ring = &(buf->meta.ring); 
     
    759780 
    760781int roar_buffer_ring_reset(struct roar_buffer *  buf) { 
    761  if ( buf == NULL ) 
    762   return -1; 
    763  
    764  if ( !(buf->flags & ROAR_BUFFER_FLAG_RING) ) 
    765   return -1; 
     782 _ckbuf(0) 
     783 
     784 if ( !(buf->flags & ROAR_BUFFER_FLAG_RING) ) { 
     785  roar_err_set(ROAR_ERROR_TYPEMM); 
     786  return -1; 
     787 } 
    766788 
    767789 buf->meta.ring.read_pos = buf->meta.ring.write_pos = 0; 
Note: See TracChangeset for help on using the changeset viewer.