00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 #include "libts.h"
00031 #include "api/ts/InkAPIPrivateIOCore.h"
00032 #if defined(solaris) && !defined(__GNUC__)
00033 #include "P_EventSystem.h" 
00034 #include "P_Net.h"         
00035 #else
00036 #include "I_EventSystem.h"
00037 #include "I_Net.h"
00038 #endif
00039 #include "I_Cache.h"
00040 #include "I_HostDB.h"
00041 
00042 
00043 #if TS_USE_FAST_SDK
00044 #define sdk_assert(EX) (void)(EX)
00045 #else
00046 #define sdk_assert(EX)                                          \
00047   ( (void)((EX) ? (void)0 : _TSReleaseAssert(#EX, __FILE__, __LINE__)) )
00048 #endif
00049 
00050 
00051 TSReturnCode
00052 sdk_sanity_check_mutex(TSMutex mutex)
00053 {
00054   if (mutex == NULL)
00055     return TS_ERROR;
00056 
00057   ProxyMutex *mutexp = (ProxyMutex *) mutex;
00058 
00059   if (mutexp->m_refcount < 0)
00060     return TS_ERROR;
00061   if (mutexp->nthread_holding < 0)
00062     return TS_ERROR;
00063 
00064   return TS_SUCCESS;
00065 }
00066 
00067 
00068 TSReturnCode
00069 sdk_sanity_check_hostlookup_structure(TSHostLookupResult data)
00070 {
00071   if (data == NULL)
00072     return TS_ERROR;
00073 
00074   return TS_SUCCESS;
00075 }
00076 
00077 TSReturnCode
00078 sdk_sanity_check_iocore_structure(void *data)
00079 {
00080   if (data == NULL)
00081     return TS_ERROR;
00082 
00083   return TS_SUCCESS;
00084 }
00085 
00086 
00087 TSReturnCode sdk_sanity_check_continuation(TSCont cont);
00088 TSReturnCode sdk_sanity_check_null_ptr(void *ptr);
00089 
00090 
00091 
00092 
00093 
00094 
00095 
00096 struct INKThreadInternal:public EThread
00097 {
00098   INKThreadInternal()
00099     : EThread(DEDICATED, -1)
00100   {  }
00101 
00102   TSThreadFunc func;
00103   void *data;
00104 };
00105 
00106 static void *
00107 ink_thread_trampoline(void *data)
00108 {
00109   INKThreadInternal *thread;
00110   void *retval;
00111 
00112   thread = (INKThreadInternal *) data;
00113   thread->set_specific();
00114   retval = thread->func(thread->data);
00115   delete thread;
00116 
00117   return retval;
00118 }
00119 
00120 
00121 
00122 
00123 TSThread
00124 TSThreadCreate(TSThreadFunc func, void *data)
00125 {
00126   INKThreadInternal *thread;
00127 
00128   thread = new INKThreadInternal;
00129 
00130   ink_assert(thread->event_types == 0);
00131 
00132   thread->func = func;
00133   thread->data = data;
00134 
00135   if (!(ink_thread_create(ink_thread_trampoline, (void *)thread, 1))) {
00136     return (TSThread)NULL;
00137   }
00138 
00139   return (TSThread)thread;
00140 }
00141 
00142 TSThread
00143 TSThreadInit()
00144 {
00145   INKThreadInternal *thread;
00146 
00147   thread = new INKThreadInternal;
00148 
00149 #ifdef DEBUG
00150   if (thread == NULL)
00151     return (TSThread)NULL;
00152 #endif
00153 
00154   thread->set_specific();
00155 
00156   return reinterpret_cast<TSThread>(thread);
00157 }
00158 
00159 void
00160 TSThreadDestroy(TSThread thread)
00161 {
00162   sdk_assert(sdk_sanity_check_iocore_structure(thread) == TS_SUCCESS);
00163 
00164   INKThreadInternal *ithread = (INKThreadInternal *)thread;
00165   delete ithread;
00166 }
00167 
00168 TSThread
00169 TSThreadSelf(void)
00170 {
00171   TSThread ithread = (TSThread)this_ethread();
00172   return ithread;
00173 }
00174 
00175 
00176 
00177 
00178 
00179 
00180 
00181 TSMutex
00182 TSMutexCreate()
00183 {
00184   ProxyMutex *mutexp = new_ProxyMutex();
00185 
00186   
00187   sdk_assert(sdk_sanity_check_mutex((TSMutex)mutexp) == TS_SUCCESS);
00188 
00189   return (TSMutex)mutexp;
00190 }
00191 
00192 
00193 
00194 
00195 
00196 TSMutex
00197 TSMutexCreateInternal()
00198 {
00199   ProxyMutex *new_mutex = new_ProxyMutex();
00200 
00201   
00202   sdk_assert(sdk_sanity_check_mutex((TSMutex)new_mutex) == TS_SUCCESS);
00203 
00204   new_mutex->refcount_inc();
00205   return reinterpret_cast<TSMutex>(new_mutex);
00206 }
00207 
00208 int
00209 TSMutexCheck(TSMutex mutex)
00210 {
00211   ProxyMutex *mutexp = (ProxyMutex *)mutex;
00212 
00213   if (mutexp->m_refcount < 0)
00214     return -1;
00215   if (mutexp->nthread_holding < 0)
00216     return -1;
00217   return 1;
00218 }
00219 
00220 void
00221 TSMutexLock(TSMutex mutexp)
00222 {
00223   sdk_assert(sdk_sanity_check_mutex(mutexp) == TS_SUCCESS);
00224   MUTEX_TAKE_LOCK((ProxyMutex *)mutexp, this_ethread());
00225 }
00226 
00227 
00228 TSReturnCode
00229 TSMutexLockTry(TSMutex mutexp)
00230 {
00231   sdk_assert(sdk_sanity_check_mutex(mutexp) == TS_SUCCESS);
00232   return (MUTEX_TAKE_TRY_LOCK((ProxyMutex *)mutexp, this_ethread()) ? TS_SUCCESS : TS_ERROR);
00233 }
00234 
00235 void
00236 TSMutexUnlock(TSMutex mutexp)
00237 {
00238   sdk_assert(sdk_sanity_check_mutex(mutexp) == TS_SUCCESS);
00239   MUTEX_UNTAKE_LOCK((ProxyMutex *)mutexp, this_ethread());
00240 }
00241 
00242 
00243 
00244 void
00245 TSVIOReenable(TSVIO viop)
00246 {
00247   sdk_assert(sdk_sanity_check_iocore_structure(viop) == TS_SUCCESS);
00248 
00249   VIO *vio = (VIO *)viop;
00250   vio->reenable();
00251 }
00252 
00253 TSIOBuffer
00254 TSVIOBufferGet(TSVIO viop)
00255 {
00256   sdk_assert(sdk_sanity_check_iocore_structure(viop) == TS_SUCCESS);
00257 
00258   VIO *vio = (VIO *)viop;
00259   return reinterpret_cast<TSIOBuffer>(vio->get_writer());
00260 }
00261 
00262 TSIOBufferReader
00263 TSVIOReaderGet(TSVIO viop)
00264 {
00265   sdk_assert(sdk_sanity_check_iocore_structure(viop) == TS_SUCCESS);
00266 
00267   VIO *vio = (VIO *)viop;
00268   return reinterpret_cast<TSIOBufferReader>(vio->get_reader());
00269 }
00270 
00271 int64_t
00272 TSVIONBytesGet(TSVIO viop)
00273 {
00274   sdk_assert(sdk_sanity_check_iocore_structure(viop) == TS_SUCCESS);
00275 
00276   VIO *vio = (VIO *)viop;
00277   return vio->nbytes;
00278 }
00279 
00280 void
00281 TSVIONBytesSet(TSVIO viop, int64_t nbytes)
00282 {
00283   sdk_assert(sdk_sanity_check_iocore_structure(viop) == TS_SUCCESS);
00284   sdk_assert(nbytes >= 0);
00285 
00286   VIO *vio = (VIO *)viop;
00287   vio->nbytes = nbytes;
00288 }
00289 
00290 int64_t
00291 TSVIONDoneGet(TSVIO viop)
00292 {
00293   sdk_assert(sdk_sanity_check_iocore_structure(viop) == TS_SUCCESS);
00294 
00295   VIO *vio = (VIO *)viop;
00296   return vio->ndone;
00297 }
00298 
00299 void
00300 TSVIONDoneSet(TSVIO viop, int64_t ndone)
00301 {
00302   sdk_assert(sdk_sanity_check_iocore_structure(viop) == TS_SUCCESS);
00303   sdk_assert(ndone >= 0);
00304 
00305   VIO *vio = (VIO *)viop;
00306   vio->ndone = ndone;
00307 }
00308 
00309 int64_t
00310 TSVIONTodoGet(TSVIO viop)
00311 {
00312   sdk_assert(sdk_sanity_check_iocore_structure(viop) == TS_SUCCESS);
00313 
00314   VIO *vio = (VIO *)viop;
00315   return vio->ntodo();
00316 }
00317 
00318 TSCont
00319 TSVIOContGet(TSVIO viop)
00320 {
00321   sdk_assert(sdk_sanity_check_iocore_structure(viop) == TS_SUCCESS);
00322 
00323   VIO *vio = (VIO *)viop;
00324   return (TSCont) vio->_cont;
00325 }
00326 
00327 TSVConn
00328 TSVIOVConnGet(TSVIO viop)
00329 {
00330   sdk_assert(sdk_sanity_check_iocore_structure(viop) == TS_SUCCESS);
00331 
00332   VIO *vio = (VIO *)viop;
00333   return (TSVConn)vio->vc_server;
00334 }
00335 
00336 TSMutex
00337 TSVIOMutexGet(TSVIO viop)
00338 {
00339   sdk_assert(sdk_sanity_check_iocore_structure(viop) == TS_SUCCESS);
00340 
00341   VIO *vio = (VIO *)viop;
00342   return (TSMutex)((ProxyMutex *)vio->mutex);
00343 }
00344 
00345 
00346 
00347 ink_hrtime
00348 INKBasedTimeGet()
00349 {
00350   return ink_get_based_hrtime();
00351 }
00352 
00353 
00354 
00355 TSAction
00356 INKUDPBind(TSCont contp, unsigned int ip, int port)
00357 {  
00358   sdk_assert(sdk_sanity_check_continuation(contp) == TS_SUCCESS);
00359     
00360   FORCE_PLUGIN_MUTEX(contp);
00361 
00362   struct sockaddr_in addr;
00363   ats_ip4_set(&addr, ip, htons(port));
00364   
00365   return reinterpret_cast<TSAction>(udpNet.UDPBind((Continuation *)contp, ats_ip_sa_cast(&addr), INK_ETHERNET_MTU_SIZE, INK_ETHERNET_MTU_SIZE));
00366 }
00367 
00368 TSAction
00369 INKUDPSendTo(TSCont contp, INKUDPConn udp, unsigned int ip, int port, char *data, int64_t len)
00370 {
00371   sdk_assert(sdk_sanity_check_continuation(contp) == TS_SUCCESS);
00372 
00373   FORCE_PLUGIN_MUTEX(contp);
00374   UDPPacket *packet = new_UDPPacket();
00375   UDPConnection *conn = (UDPConnection *)udp;
00376 
00377   ats_ip4_set(&packet->to, ip, htons(port));
00378 
00379   IOBufferBlock *blockp = new_IOBufferBlock();
00380   blockp->alloc(BUFFER_SIZE_INDEX_32K);
00381 
00382   if (len > index_to_buffer_size(BUFFER_SIZE_INDEX_32K)) {
00383     len = index_to_buffer_size(BUFFER_SIZE_INDEX_32K) - 1;
00384   }
00385 
00386   memcpy(blockp->start(), data, len);
00387   blockp->fill(len);
00388 
00389   packet->append_block((IOBufferBlock *)blockp);
00390   
00391 
00392 
00393 
00394   
00395   return reinterpret_cast<TSAction>(conn->send((Continuation *)contp, packet));
00396 }
00397 
00398 
00399 TSAction
00400 INKUDPRecvFrom(TSCont contp, INKUDPConn udp)
00401 {
00402   sdk_assert(sdk_sanity_check_continuation(contp) == TS_SUCCESS);
00403 
00404   FORCE_PLUGIN_MUTEX(contp);
00405   UDPConnection *conn = (UDPConnection *)udp;
00406   return reinterpret_cast<TSAction>(conn->recv((Continuation *)contp));
00407 }
00408 
00409 int
00410 INKUDPConnFdGet(INKUDPConn udp)
00411 {
00412   UDPConnection *conn = (UDPConnection *)udp;
00413   return conn->getFd();
00414 }
00415 
00416 
00417 INKUDPPacket
00418 INKUDPPacketCreate()
00419 {
00420   UDPPacket *packet = new_UDPPacket();
00421   return ((INKUDPPacket)packet);
00422 }
00423 
00424 TSIOBufferBlock
00425 INKUDPPacketBufferBlockGet(INKUDPPacket packet)
00426 {
00427   sdk_assert(sdk_sanity_check_null_ptr((void*)packet) == TS_SUCCESS);
00428 
00429   UDPPacket *p = (UDPPacket *)packet;
00430   return ((TSIOBufferBlock)p->getIOBlockChain());
00431 }
00432 
00433 unsigned int
00434 INKUDPPacketFromAddressGet(INKUDPPacket packet)
00435 {
00436   sdk_assert(sdk_sanity_check_null_ptr((void*)packet) == TS_SUCCESS);
00437 
00438   UDPPacket *p = (UDPPacket *)packet;
00439   return ats_ip4_addr_cast(&p->from);
00440 }
00441 
00442 int
00443 INKUDPPacketFromPortGet(INKUDPPacket packet)
00444 {
00445   sdk_assert(sdk_sanity_check_null_ptr((void*)packet) == TS_SUCCESS);
00446 
00447   UDPPacket *p = (UDPPacket *)packet;
00448   return ats_ip_port_host_order(&p->from);
00449 }
00450 
00451 INKUDPConn
00452 INKUDPPacketConnGet(INKUDPPacket packet)
00453 {
00454   sdk_assert(sdk_sanity_check_null_ptr((void*)packet) == TS_SUCCESS);
00455 
00456   UDPPacket *p = (UDPPacket *)packet;
00457   return ((INKUDPConn)p->getConnection());
00458 }
00459 
00460 void
00461 INKUDPPacketDestroy(INKUDPPacket packet)
00462 {
00463   sdk_assert(sdk_sanity_check_null_ptr((void*)packet) == TS_SUCCESS);
00464 
00465   UDPPacket *p = (UDPPacket *)packet;
00466   p->free();
00467 }
00468 
00469 
00470 
00471 INKUDPPacket
00472 INKUDPPacketGet(INKUDPacketQueue queuep)
00473 {
00474   if (queuep != NULL) {
00475     UDPPacket *packet;
00476     Queue<UDPPacket> *qp = (Queue<UDPPacket> *)queuep;
00477 
00478     packet = qp->pop();
00479     return (packet);
00480   } 
00481 
00482   return NULL;
00483 }
00484 
00485 
00486 
00487 
00488 TSIOBuffer
00489 TSIOBufferCreate()
00490 {
00491   MIOBuffer *b = new_empty_MIOBuffer();
00492 
00493   
00494   sdk_assert(sdk_sanity_check_iocore_structure(b) == TS_SUCCESS);
00495   return reinterpret_cast<TSIOBuffer>(b);
00496 }
00497 
00498 TSIOBuffer
00499 TSIOBufferSizedCreate(TSIOBufferSizeIndex index)
00500 {
00501   sdk_assert((index >= TS_IOBUFFER_SIZE_INDEX_128) && (index <= TS_IOBUFFER_SIZE_INDEX_32K));
00502 
00503   MIOBuffer *b = new_MIOBuffer(index);
00504 
00505   
00506   sdk_assert(sdk_sanity_check_iocore_structure(b) == TS_SUCCESS);
00507   return reinterpret_cast<TSIOBuffer>(b);
00508 }
00509 
00510 void
00511 TSIOBufferDestroy(TSIOBuffer bufp)
00512 {
00513   sdk_assert(sdk_sanity_check_iocore_structure(bufp) == TS_SUCCESS);
00514   free_MIOBuffer((MIOBuffer *)bufp);
00515 }
00516 
00517 TSIOBufferBlock
00518 TSIOBufferStart(TSIOBuffer bufp)
00519 {
00520   sdk_assert(sdk_sanity_check_iocore_structure(bufp) == TS_SUCCESS);
00521 
00522   MIOBuffer *b = (MIOBuffer *)bufp;
00523   IOBufferBlock *blk = b->get_current_block();
00524 
00525   if (!blk || (blk->write_avail() == 0))
00526     b->add_block();
00527   blk = b->get_current_block();
00528 
00529   
00530   sdk_assert(sdk_sanity_check_null_ptr((void*)blk) == TS_SUCCESS);
00531 
00532   return (TSIOBufferBlock)blk;
00533 }
00534 
00535 int64_t
00536 TSIOBufferCopy(TSIOBuffer bufp, TSIOBufferReader readerp, int64_t length, int64_t offset)
00537 {
00538   sdk_assert(sdk_sanity_check_iocore_structure(bufp) == TS_SUCCESS);
00539   sdk_assert(sdk_sanity_check_iocore_structure(readerp) == TS_SUCCESS);
00540   sdk_assert((length >= 0) && (offset >= 0));
00541 
00542   MIOBuffer *b = (MIOBuffer *)bufp;
00543   IOBufferReader *r = (IOBufferReader *)readerp;
00544 
00545   return b->write(r, length, offset);
00546 }
00547 
00548 int64_t
00549 TSIOBufferWrite(TSIOBuffer bufp, const void *buf, int64_t length)
00550 {
00551   sdk_assert(sdk_sanity_check_iocore_structure(bufp) == TS_SUCCESS);
00552   sdk_assert(sdk_sanity_check_null_ptr((void*)buf) == TS_SUCCESS);
00553   sdk_assert(length >= 0);
00554 
00555   MIOBuffer *b = (MIOBuffer *)bufp;
00556   return b->write(buf, length);
00557 }
00558 
00559 
00560 void
00561 TSIOBufferReaderCopy(TSIOBufferReader readerp, const void *buf, int64_t length)
00562 {
00563   IOBufferReader *r = (IOBufferReader *)readerp;
00564   r->memcpy(buf, length);
00565 }
00566 
00567 void
00568 TSIOBufferProduce(TSIOBuffer bufp, int64_t nbytes)
00569 {
00570   sdk_assert(sdk_sanity_check_iocore_structure(bufp) == TS_SUCCESS);
00571   sdk_assert(nbytes >= 0);
00572 
00573   MIOBuffer *b = (MIOBuffer *)bufp;
00574   b->fill(nbytes);
00575 }
00576 
00577 
00578 void
00579 TSIOBufferBlockDestroy(TSIOBufferBlock blockp)
00580 {
00581   sdk_assert(sdk_sanity_check_iocore_structure(blockp) == TS_SUCCESS);
00582 
00583   IOBufferBlock *blk = (IOBufferBlock *)blockp;
00584   blk->free();
00585 }
00586 
00587 TSIOBufferBlock
00588 TSIOBufferBlockNext(TSIOBufferBlock blockp)
00589 {
00590   sdk_assert(sdk_sanity_check_iocore_structure(blockp) == TS_SUCCESS);
00591 
00592   IOBufferBlock *blk = (IOBufferBlock *)blockp;
00593   return (TSIOBufferBlock)((IOBufferBlock *)blk->next);
00594 }
00595 
00596 
00597 int64_t
00598 TSIOBufferBlockDataSizeGet(TSIOBufferBlock blockp)
00599 {
00600   sdk_assert(sdk_sanity_check_iocore_structure(blockp) == TS_SUCCESS);
00601 
00602   IOBufferBlock *blk = (IOBufferBlock *)blockp;
00603   return (blk->read_avail());
00604 }
00605 
00606 const char *
00607 TSIOBufferBlockReadStart(TSIOBufferBlock blockp, TSIOBufferReader readerp, int64_t *avail)
00608 {
00609   sdk_assert(sdk_sanity_check_iocore_structure(blockp) == TS_SUCCESS);
00610   sdk_assert(sdk_sanity_check_iocore_structure(readerp) == TS_SUCCESS);
00611 
00612   IOBufferBlock *blk = (IOBufferBlock *)blockp;
00613   IOBufferReader *reader = (IOBufferReader *)readerp;
00614   char *p;
00615 
00616   p = blk->start();
00617   if (avail)
00618     *avail = blk->read_avail();
00619 
00620   if (blk == reader->block) {
00621     p += reader->start_offset;
00622     if (avail) {
00623       *avail -= reader->start_offset;
00624       if (*avail < 0) {
00625         *avail = 0;
00626       }
00627     }
00628   }
00629 
00630   return (const char *)p;
00631 }
00632 
00633 int64_t
00634 TSIOBufferBlockReadAvail(TSIOBufferBlock blockp, TSIOBufferReader readerp)
00635 {
00636   sdk_assert(sdk_sanity_check_iocore_structure(blockp) == TS_SUCCESS);
00637   sdk_assert(sdk_sanity_check_iocore_structure(readerp) == TS_SUCCESS);
00638 
00639   IOBufferBlock *blk = (IOBufferBlock *)blockp;
00640   IOBufferReader *reader = (IOBufferReader *)readerp;
00641   int64_t avail;
00642 
00643   avail = blk->read_avail();
00644 
00645   if (blk == reader->block) {
00646     avail -= reader->start_offset;
00647     if (avail < 0) {
00648       avail = 0;
00649     }
00650   }
00651 
00652   return avail;
00653 }
00654 
00655 char *
00656 TSIOBufferBlockWriteStart(TSIOBufferBlock blockp, int64_t *avail)
00657 {
00658   sdk_assert(sdk_sanity_check_iocore_structure(blockp) == TS_SUCCESS);
00659 
00660   IOBufferBlock *blk = (IOBufferBlock *)blockp;
00661 
00662   if (avail)
00663     *avail = blk->write_avail();
00664   return blk->end();
00665 }
00666 
00667 int64_t
00668 TSIOBufferBlockWriteAvail(TSIOBufferBlock blockp)
00669 {
00670   sdk_assert(sdk_sanity_check_iocore_structure(blockp) == TS_SUCCESS);
00671 
00672   IOBufferBlock *blk = (IOBufferBlock *)blockp;
00673   return blk->write_avail();
00674 }
00675 
00676 int64_t
00677 TSIOBufferWaterMarkGet(TSIOBuffer bufp)
00678 {
00679   sdk_assert(sdk_sanity_check_iocore_structure(bufp) == TS_SUCCESS);
00680 
00681   MIOBuffer *b = (MIOBuffer *)bufp;
00682   return b->water_mark;
00683 }
00684 
00685 void
00686 TSIOBufferWaterMarkSet(TSIOBuffer bufp, int64_t water_mark)
00687 {
00688   sdk_assert(sdk_sanity_check_iocore_structure(bufp) == TS_SUCCESS);
00689   sdk_assert(water_mark >= 0);
00690 
00691   MIOBuffer *b = (MIOBuffer *)bufp;
00692   b->water_mark = water_mark;
00693 }
00694 
00695 TSIOBufferReader
00696 TSIOBufferReaderAlloc(TSIOBuffer bufp)
00697 {
00698   sdk_assert(sdk_sanity_check_iocore_structure(bufp) == TS_SUCCESS);
00699 
00700   MIOBuffer *b = (MIOBuffer *)bufp;
00701   TSIOBufferReader readerp = (TSIOBufferReader)b->alloc_reader();
00702 
00703   
00704   sdk_assert(sdk_sanity_check_null_ptr((void*)readerp) == TS_SUCCESS);
00705   return readerp;
00706 }
00707 
00708 TSIOBufferReader
00709 TSIOBufferReaderClone(TSIOBufferReader readerp)
00710 {
00711   sdk_assert(sdk_sanity_check_iocore_structure(readerp) == TS_SUCCESS);
00712 
00713   IOBufferReader *r = (IOBufferReader *)readerp;
00714   return (TSIOBufferReader)r->clone();
00715 }
00716 
00717 void
00718 TSIOBufferReaderFree(TSIOBufferReader readerp)
00719 {
00720   sdk_assert(sdk_sanity_check_iocore_structure(readerp) == TS_SUCCESS);
00721 
00722   IOBufferReader *r = (IOBufferReader *)readerp;
00723   r->mbuf->dealloc_reader(r);
00724 }
00725 
00726 TSIOBufferBlock
00727 TSIOBufferReaderStart(TSIOBufferReader readerp)
00728 {
00729   sdk_assert(sdk_sanity_check_iocore_structure(readerp) == TS_SUCCESS);
00730 
00731   IOBufferReader *r = (IOBufferReader *)readerp;
00732 
00733   if (r->block != NULL)
00734     r->skip_empty_blocks();
00735   return reinterpret_cast<TSIOBufferBlock>(r->get_current_block());
00736 }
00737 
00738 void
00739 TSIOBufferReaderConsume(TSIOBufferReader readerp, int64_t nbytes)
00740 {
00741   sdk_assert(sdk_sanity_check_iocore_structure(readerp) == TS_SUCCESS);
00742   sdk_assert(nbytes >= 0);
00743 
00744   IOBufferReader *r = (IOBufferReader *)readerp;
00745   r->consume(nbytes);
00746 }
00747 
00748 int64_t
00749 TSIOBufferReaderAvail(TSIOBufferReader readerp)
00750 {
00751   sdk_assert(sdk_sanity_check_iocore_structure(readerp) == TS_SUCCESS);
00752 
00753   IOBufferReader *r = (IOBufferReader *)readerp;
00754   return r->read_avail();
00755 }