stmem.c
上传用户:liugui
上传日期:2007-01-04
资源大小:822k
文件大小:5k
源码类别:

代理服务器

开发平台:

Unix_Linux

  1. /*
  2.  * $Id: stmem.c,v 1.64 1998/12/05 00:54:42 wessels Exp $
  3.  *
  4.  * DEBUG: section 19    Store Memory Primitives
  5.  * AUTHOR: Harvest Derived
  6.  *
  7.  * SQUID Internet Object Cache  http://squid.nlanr.net/Squid/
  8.  * ----------------------------------------------------------
  9.  *
  10.  *  Squid is the result of efforts by numerous individuals from the
  11.  *  Internet community.  Development is led by Duane Wessels of the
  12.  *  National Laboratory for Applied Network Research and funded by the
  13.  *  National Science Foundation.  Squid is Copyrighted (C) 1998 by
  14.  *  Duane Wessels and the University of California San Diego.  Please
  15.  *  see the COPYRIGHT file for full details.  Squid incorporates
  16.  *  software developed and/or copyrighted by other sources.  Please see
  17.  *  the CREDITS file for full details.
  18.  *
  19.  *  This program is free software; you can redistribute it and/or modify
  20.  *  it under the terms of the GNU General Public License as published by
  21.  *  the Free Software Foundation; either version 2 of the License, or
  22.  *  (at your option) any later version.
  23.  *  
  24.  *  This program is distributed in the hope that it will be useful,
  25.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  26.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  27.  *  GNU General Public License for more details.
  28.  *  
  29.  *  You should have received a copy of the GNU General Public License
  30.  *  along with this program; if not, write to the Free Software
  31.  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
  32.  *
  33.  */
  34. #include "squid.h"
  35. void
  36. stmemFree(mem_hdr * mem)
  37. {
  38.     mem_node *p;
  39.     while ((p = mem->head)) {
  40. mem->head = p->next;
  41. memFree(p->data, MEM_STMEM_BUF);
  42. store_mem_size -= SM_PAGE_SIZE;
  43. safe_free(p);
  44.     }
  45.     mem->head = mem->tail = NULL;
  46.     mem->origin_offset = 0;
  47. }
  48. int
  49. stmemFreeDataUpto(mem_hdr * mem, int target_offset)
  50. {
  51.     int current_offset = mem->origin_offset;
  52.     mem_node *lastp;
  53.     mem_node *p = mem->head;
  54.     while (p && ((current_offset + p->len) <= target_offset)) {
  55. if (p == mem->tail) {
  56.     /* keep the last one to avoid change to other part of code */
  57.     mem->head = mem->tail;
  58.     mem->origin_offset = current_offset;
  59.     return current_offset;
  60. } else {
  61.     lastp = p;
  62.     p = p->next;
  63.     current_offset += lastp->len;
  64.     memFree(lastp->data, MEM_STMEM_BUF);
  65.     store_mem_size -= SM_PAGE_SIZE;
  66.     safe_free(lastp);
  67. }
  68.     }
  69.     mem->head = p;
  70.     mem->origin_offset = current_offset;
  71.     if (current_offset < target_offset) {
  72. /* there are still some data left. */
  73. return current_offset;
  74.     }
  75.     assert(current_offset == target_offset);
  76.     return current_offset;
  77. }
  78. /* Append incoming data. */
  79. void
  80. stmemAppend(mem_hdr * mem, const char *data, int len)
  81. {
  82.     mem_node *p;
  83.     int avail_len;
  84.     int len_to_copy;
  85.     debug(19, 6) ("memAppend: len %dn", len);
  86.     /* Does the last block still contain empty space? 
  87.      * If so, fill out the block before dropping into the
  88.      * allocation loop */
  89.     if (mem->head && mem->tail && (mem->tail->len < SM_PAGE_SIZE)) {
  90. avail_len = SM_PAGE_SIZE - (mem->tail->len);
  91. len_to_copy = XMIN(avail_len, len);
  92. xmemcpy((mem->tail->data + mem->tail->len), data, len_to_copy);
  93. /* Adjust the ptr and len according to what was deposited in the page */
  94. data += len_to_copy;
  95. len -= len_to_copy;
  96. mem->tail->len += len_to_copy;
  97.     }
  98.     while (len > 0) {
  99. len_to_copy = XMIN(len, SM_PAGE_SIZE);
  100. p = xcalloc(1, sizeof(mem_node));
  101. p->next = NULL;
  102. p->len = len_to_copy;
  103. p->data = memAllocate(MEM_STMEM_BUF);
  104. store_mem_size += SM_PAGE_SIZE;
  105. xmemcpy(p->data, data, len_to_copy);
  106. if (!mem->head) {
  107.     /* The chain is empty */
  108.     mem->head = mem->tail = p;
  109. } else {
  110.     /* Append it to existing chain */
  111.     mem->tail->next = p;
  112.     mem->tail = p;
  113. }
  114. len -= len_to_copy;
  115. data += len_to_copy;
  116.     }
  117. }
  118. ssize_t
  119. stmemCopy(const mem_hdr * mem, off_t offset, char *buf, size_t size)
  120. {
  121.     mem_node *p = mem->head;
  122.     off_t t_off = mem->origin_offset;
  123.     size_t bytes_to_go = size;
  124.     char *ptr_to_buf = NULL;
  125.     int bytes_from_this_packet = 0;
  126.     int bytes_into_this_packet = 0;
  127.     debug(19, 6) ("memCopy: offset %d: size %dn", (int) offset, size);
  128.     if (p == NULL)
  129. return 0;
  130.     assert(size > 0);
  131.     /* Seek our way into store */
  132.     while ((t_off + p->len) < offset) {
  133. t_off += p->len;
  134. if (!p->next) {
  135.     debug(19, 1) ("memCopy: p->next == NULLn");
  136.     return 0;
  137. }
  138. assert(p->next);
  139. p = p->next;
  140.     }
  141.     /* Start copying begining with this block until
  142.      * we're satiated */
  143.     bytes_into_this_packet = offset - t_off;
  144.     bytes_from_this_packet = XMIN(bytes_to_go, p->len - bytes_into_this_packet);
  145.     xmemcpy(buf, p->data + bytes_into_this_packet, bytes_from_this_packet);
  146.     bytes_to_go -= bytes_from_this_packet;
  147.     ptr_to_buf = buf + bytes_from_this_packet;
  148.     p = p->next;
  149.     while (p && bytes_to_go > 0) {
  150. if (bytes_to_go > p->len) {
  151.     xmemcpy(ptr_to_buf, p->data, p->len);
  152.     ptr_to_buf += p->len;
  153.     bytes_to_go -= p->len;
  154. } else {
  155.     xmemcpy(ptr_to_buf, p->data, bytes_to_go);
  156.     bytes_to_go -= bytes_to_go;
  157. }
  158. p = p->next;
  159.     }
  160.     return size - bytes_to_go;
  161. }