亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? sarray.c

?? gcc的組件
?? C
字號:
/* Sparse Arrays for Objective C dispatch tables   Copyright (C) 1993, 1995, 1996, 2002, 2004 Free Software Foundation, Inc.This file is part of GCC.GCC is free software; you can redistribute it and/or modifyit under the terms of the GNU General Public License as published bythe Free Software Foundation; either version 2, or (at your option)any later version.GCC is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See theGNU General Public License for more details.You should have received a copy of the GNU General Public Licensealong with GCC; see the file COPYING.  If not, write tothe Free Software Foundation, 51 Franklin Street, Fifth Floor,Boston, MA 02110-1301, USA.  *//* As a special exception, if you link this library with files   compiled with GCC to produce an executable, this does not cause   the resulting executable to be covered by the GNU General Public License.   This exception does not however invalidate any other reasons why   the executable file might be covered by the GNU General Public License.  */#include "objc/sarray.h"#include "objc/runtime.h"#include <stdio.h>#include "assert.h"int nbuckets = 0;					/* !T:MUTEX */int nindices = 0;					/* !T:MUTEX */int narrays = 0;					/* !T:MUTEX */int idxsize = 0;					/* !T:MUTEX */static void *first_free_data = NULL;			/* !T:MUTEX */#ifdef OBJC_SPARSE2const char *__objc_sparse2_id = "2 level sparse indices";#endif#ifdef OBJC_SPARSE3const char *__objc_sparse3_id = "3 level sparse indices";#endif/* This function removes any structures left over from free operations   that were not safe in a multi-threaded environment. */voidsarray_remove_garbage (void){  void **vp;  void *np;    objc_mutex_lock (__objc_runtime_mutex);  vp = first_free_data;  first_free_data = NULL;  while (vp) {    np = *vp;    objc_free (vp);    vp = np;  }    objc_mutex_unlock (__objc_runtime_mutex);}/* Free a block of dynamically allocated memory.  If we are in multi-threaded   mode, it is ok to free it.  If not, we add it to the garbage heap to be   freed later. */static voidsarray_free_garbage (void *vp){  objc_mutex_lock (__objc_runtime_mutex);    if (__objc_runtime_threads_alive == 1) {    objc_free (vp);    if (first_free_data)      sarray_remove_garbage ();  }  else {    *(void **)vp = first_free_data;    first_free_data = vp;  }        objc_mutex_unlock (__objc_runtime_mutex);}/* sarray_at_put : copies data in such a way as to be thread reader safe. */voidsarray_at_put (struct sarray *array, sidx index, void *element){#ifdef OBJC_SPARSE3  struct sindex **the_index;  struct sindex *new_index;#endif  struct sbucket **the_bucket;  struct sbucket *new_bucket;#ifdef OBJC_SPARSE3  size_t ioffset;#endif  size_t boffset;  size_t eoffset;#ifdef PRECOMPUTE_SELECTORS  union sofftype xx;   xx.idx = index;#ifdef OBJC_SPARSE3  ioffset = xx.off.ioffset;#endif  boffset = xx.off.boffset;  eoffset = xx.off.eoffset;#else /* not PRECOMPUTE_SELECTORS */#ifdef OBJC_SPARSE3  ioffset = index/INDEX_CAPACITY;  boffset = (index/BUCKET_SIZE)%INDEX_SIZE;  eoffset = index%BUCKET_SIZE;#else  boffset = index/BUCKET_SIZE;  eoffset = index%BUCKET_SIZE;#endif#endif /* not PRECOMPUTE_SELECTORS */  assert (soffset_decode (index) < array->capacity); /* Range check */#ifdef OBJC_SPARSE3  the_index = &(array->indices[ioffset]);  the_bucket = &((*the_index)->buckets[boffset]);#else  the_bucket = &(array->buckets[boffset]);#endif    if ((*the_bucket)->elems[eoffset] == element)    return;		/* great! we just avoided a lazy copy */#ifdef OBJC_SPARSE3  /* First, perform lazy copy/allocation of index if needed */  if ((*the_index) == array->empty_index) {    /* The index was previously empty, allocate a new */    new_index = (struct sindex *) objc_malloc (sizeof (struct sindex));    memcpy (new_index, array->empty_index, sizeof (struct sindex));    new_index->version.version = array->version.version;    *the_index = new_index;                     /* Prepared for install. */    the_bucket = &((*the_index)->buckets[boffset]);        nindices += 1;  } else if ((*the_index)->version.version != array->version.version) {    /* This index must be lazy copied */    struct sindex *old_index = *the_index;    new_index = (struct sindex *) objc_malloc (sizeof (struct sindex));    memcpy (new_index, old_index, sizeof (struct sindex));    new_index->version.version = array->version.version;    *the_index = new_index;                     /* Prepared for install. */    the_bucket = &((*the_index)->buckets[boffset]);        nindices += 1;  }#endif /* OBJC_SPARSE3 */  /* next, perform lazy allocation/copy of the bucket if needed */  if ((*the_bucket) == array->empty_bucket) {    /* The bucket was previously empty (or something like that), */    /* allocate a new.  This is the effect of `lazy' allocation */      new_bucket = (struct sbucket *) objc_malloc (sizeof (struct sbucket));    memcpy ((void *) new_bucket, (const void *) array->empty_bucket, 	    sizeof (struct sbucket));    new_bucket->version.version = array->version.version;    *the_bucket = new_bucket;                   /* Prepared for install. */        nbuckets += 1;  } else if ((*the_bucket)->version.version != array->version.version) {    /* Perform lazy copy. */    struct sbucket *old_bucket = *the_bucket;    new_bucket = (struct sbucket *) objc_malloc (sizeof (struct sbucket));    memcpy (new_bucket, old_bucket, sizeof (struct sbucket));    new_bucket->version.version = array->version.version;    *the_bucket = new_bucket;                   /* Prepared for install. */        nbuckets += 1;  }  (*the_bucket)->elems[eoffset] = element;}voidsarray_at_put_safe (struct sarray *array, sidx index, void *element){  if (soffset_decode (index) >= array->capacity)    sarray_realloc (array, soffset_decode (index) + 1);  sarray_at_put (array, index, element);}struct sarray *sarray_new (int size, void *default_element){  struct sarray *arr;#ifdef OBJC_SPARSE3  size_t num_indices = ((size - 1)/(INDEX_CAPACITY)) + 1;  struct sindex **new_indices;#else /* OBJC_SPARSE2 */  size_t num_indices = ((size - 1)/BUCKET_SIZE) + 1;  struct sbucket **new_buckets;#endif  size_t counter;  assert (size > 0);  /* Allocate core array */  arr = (struct sarray *) objc_malloc (sizeof (struct sarray));  arr->version.version = 0;    /* Initialize members */#ifdef OBJC_SPARSE3  arr->capacity = num_indices*INDEX_CAPACITY;  new_indices = (struct sindex **)     objc_malloc (sizeof (struct sindex *) * num_indices);  arr->empty_index = (struct sindex *) objc_malloc (sizeof (struct sindex));  arr->empty_index->version.version = 0;    narrays  += 1;  idxsize  += num_indices;  nindices += 1;#else /* OBJC_SPARSE2 */  arr->capacity = num_indices*BUCKET_SIZE;  new_buckets = (struct sbucket **)     objc_malloc (sizeof (struct sbucket *) * num_indices);    narrays  += 1;  idxsize  += num_indices;#endif  arr->empty_bucket = (struct sbucket *) objc_malloc (sizeof (struct sbucket));  arr->empty_bucket->version.version = 0;    nbuckets += 1;  arr->ref_count = 1;  arr->is_copy_of = (struct sarray *) 0;    for (counter = 0; counter < BUCKET_SIZE; counter++)    arr->empty_bucket->elems[counter] = default_element;#ifdef OBJC_SPARSE3  for (counter = 0; counter < INDEX_SIZE; counter++)    arr->empty_index->buckets[counter] = arr->empty_bucket;  for (counter = 0; counter < num_indices; counter++)    new_indices[counter] = arr->empty_index;#else /* OBJC_SPARSE2 */  for (counter = 0; counter < num_indices; counter++)    new_buckets[counter] = arr->empty_bucket;#endif  #ifdef OBJC_SPARSE3  arr->indices = new_indices;#else /* OBJC_SPARSE2 */  arr->buckets = new_buckets;#endif    return arr;}/* Reallocate the sparse array to hold `newsize' entries   Note: We really allocate and then free.  We have to do this to ensure that   any concurrent readers notice the update. */void sarray_realloc (struct sarray *array, int newsize){#ifdef OBJC_SPARSE3  size_t old_max_index = (array->capacity - 1)/INDEX_CAPACITY;  size_t new_max_index = ((newsize - 1)/INDEX_CAPACITY);  size_t rounded_size = (new_max_index + 1) * INDEX_CAPACITY;  struct sindex **new_indices;  struct sindex **old_indices;  #else /* OBJC_SPARSE2 */  size_t old_max_index = (array->capacity - 1)/BUCKET_SIZE;  size_t new_max_index = ((newsize - 1)/BUCKET_SIZE);  size_t rounded_size = (new_max_index + 1) * BUCKET_SIZE;  struct sbucket **new_buckets;  struct sbucket **old_buckets;  #endif  size_t counter;  assert (newsize > 0);  /* The size is the same, just ignore the request */  if (rounded_size <= array->capacity)    return;  assert (array->ref_count == 1);	/* stop if lazy copied... */  /* We are asked to extend the array -- allocate new bucket table, */  /* and insert empty_bucket in newly allocated places. */  if (rounded_size > array->capacity)     {#ifdef OBJC_SPARSE3      new_max_index += 4;      rounded_size = (new_max_index + 1) * INDEX_CAPACITY;      #else /* OBJC_SPARSE2 */      new_max_index += 4;      rounded_size = (new_max_index + 1) * BUCKET_SIZE;#endif            /* update capacity */      array->capacity = rounded_size;#ifdef OBJC_SPARSE3      /* alloc to force re-read by any concurrent readers. */      old_indices = array->indices;      new_indices = (struct sindex **)	objc_malloc ((new_max_index + 1) * sizeof (struct sindex *));#else /* OBJC_SPARSE2 */      old_buckets = array->buckets;      new_buckets = (struct sbucket **)	objc_malloc ((new_max_index + 1) * sizeof (struct sbucket *));#endif      /* copy buckets below old_max_index (they are still valid) */      for (counter = 0; counter <= old_max_index; counter++ ) {#ifdef OBJC_SPARSE3	new_indices[counter] = old_indices[counter];#else /* OBJC_SPARSE2 */	new_buckets[counter] = old_buckets[counter];#endif      }#ifdef OBJC_SPARSE3      /* reset entries above old_max_index to empty_bucket */      for (counter = old_max_index + 1; counter <= new_max_index; counter++)	new_indices[counter] = array->empty_index;#else /* OBJC_SPARSE2 */      /* reset entries above old_max_index to empty_bucket */      for (counter = old_max_index + 1; counter <= new_max_index; counter++)	new_buckets[counter] = array->empty_bucket;#endif      #ifdef OBJC_SPARSE3      /* install the new indices */      array->indices = new_indices;#else /* OBJC_SPARSE2 */      array->buckets = new_buckets;#endif#ifdef OBJC_SPARSE3      /* free the old indices */      sarray_free_garbage (old_indices);#else /* OBJC_SPARSE2 */      sarray_free_garbage (old_buckets);#endif            idxsize += (new_max_index-old_max_index);      return;    }}/* Free a sparse array allocated with sarray_new */void sarray_free (struct sarray *array) {#ifdef OBJC_SPARSE3  size_t old_max_index = (array->capacity - 1)/INDEX_CAPACITY;  struct sindex **old_indices;#else  size_t old_max_index = (array->capacity - 1)/BUCKET_SIZE;  struct sbucket **old_buckets;#endif  size_t counter = 0;  assert (array->ref_count != 0);	/* Freed multiple times!!! */  if (--(array->ref_count) != 0)	/* There exists copies of me */    return;#ifdef OBJC_SPARSE3  old_indices = array->indices;#else  old_buckets = array->buckets;#endif  /* Free all entries that do not point to empty_bucket */  for (counter = 0; counter <= old_max_index; counter++ ) {#ifdef OBJC_SPARSE3    struct sindex *idx = old_indices[counter];    if ((idx != array->empty_index) &&       (idx->version.version == array->version.version)) {      int c2;       for (c2 = 0; c2 < INDEX_SIZE; c2++) {	struct sbucket *bkt = idx->buckets[c2];	if ((bkt != array->empty_bucket) &&	   (bkt->version.version == array->version.version))	  {	    sarray_free_garbage (bkt);	    nbuckets -= 1;	  }      }      sarray_free_garbage (idx);      nindices -= 1;    }#else /* OBJC_SPARSE2 */    struct sbucket *bkt = array->buckets[counter];    if ((bkt != array->empty_bucket) &&	(bkt->version.version == array->version.version))      {	sarray_free_garbage (bkt);	nbuckets -= 1;      }#endif  }	#ifdef OBJC_SPARSE3    /* free empty_index */  if (array->empty_index->version.version == array->version.version) {    sarray_free_garbage (array->empty_index);    nindices -= 1;  }#endif  /* free empty_bucket */  if (array->empty_bucket->version.version == array->version.version) {    sarray_free_garbage (array->empty_bucket);    nbuckets -= 1;  }  idxsize -= (old_max_index + 1);  narrays -= 1;#ifdef OBJC_SPARSE3  /* free bucket table */  sarray_free_garbage (array->indices);#else  /* free bucket table */  sarray_free_garbage (array->buckets);#endif    /* If this is a copy of another array, we free it (which might just   * decrement its reference count so it will be freed when no longer in use).   */  if (array->is_copy_of)    sarray_free (array->is_copy_of);  /* free array */  sarray_free_garbage (array);}/* This is a lazy copy.  Only the core of the structure is actually *//* copied.   */struct sarray *sarray_lazy_copy (struct sarray *oarr){  struct sarray *arr;#ifdef OBJC_SPARSE3  size_t num_indices = ((oarr->capacity - 1)/INDEX_CAPACITY) + 1;  struct sindex **new_indices;#else /* OBJC_SPARSE2 */  size_t num_indices = ((oarr->capacity - 1)/BUCKET_SIZE) + 1;  struct sbucket **new_buckets;#endif  /* Allocate core array */  arr = (struct sarray *) objc_malloc (sizeof (struct sarray)); /* !!! */  arr->version.version = oarr->version.version + 1;#ifdef OBJC_SPARSE3  arr->empty_index = oarr->empty_index;#endif  arr->empty_bucket = oarr->empty_bucket;  arr->ref_count = 1;  oarr->ref_count += 1;  arr->is_copy_of = oarr;  arr->capacity = oarr->capacity;  #ifdef OBJC_SPARSE3  /* Copy bucket table */  new_indices = (struct sindex **)     objc_malloc (sizeof (struct sindex *) * num_indices);  memcpy (new_indices, oarr->indices, sizeof (struct sindex *) * num_indices);  arr->indices = new_indices;#else   /* Copy bucket table */  new_buckets = (struct sbucket **)     objc_malloc (sizeof (struct sbucket *) * num_indices);  memcpy (new_buckets, oarr->buckets, sizeof (struct sbucket *) * num_indices);  arr->buckets = new_buckets;#endif  idxsize += num_indices;  narrays += 1;    return arr;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲欧美日韩电影| 色综合天天狠狠| 色呦呦国产精品| 在线电影一区二区三区| 国产日产精品1区| 日本网站在线观看一区二区三区| 国产一区在线不卡| 欧美色爱综合网| 国产精品国产三级国产aⅴ中文 | 精品视频999| 国产精品免费av| 精品在线视频一区| 欧美一级电影网站| 亚洲少妇屁股交4| 国产盗摄一区二区| 精品久久久久99| 日韩中文字幕亚洲一区二区va在线 | 亚洲精品成a人| 麻豆成人91精品二区三区| 在线观看日产精品| 亚洲婷婷综合久久一本伊一区| 激情欧美日韩一区二区| 欧美一区二区日韩一区二区| 亚洲狠狠爱一区二区三区| 91女神在线视频| 亚洲欧洲在线观看av| 成人涩涩免费视频| 中文天堂在线一区| 懂色中文一区二区在线播放| 精品女同一区二区| 久久国产日韩欧美精品| 精品三级在线看| 久久电影网站中文字幕 | 91久久精品网| 亚洲综合视频网| 欧美性大战久久| 亚洲第一搞黄网站| 91精品婷婷国产综合久久竹菊| 午夜精品久久久久久| 69p69国产精品| 激情久久五月天| 久久久久国色av免费看影院| 精品一区二区三区在线视频| 久久天天做天天爱综合色| 国产精品亚洲第一区在线暖暖韩国 | 日韩av一区二区三区四区| 在线不卡中文字幕播放| 麻豆精品一区二区综合av| www国产精品av| 成人国产精品免费观看| 亚洲精品乱码久久久久久黑人| 欧美私模裸体表演在线观看| 日韩成人午夜精品| 2欧美一区二区三区在线观看视频 337p粉嫩大胆噜噜噜噜噜91av | 国产美女在线精品| 国产日韩精品一区二区三区| 粉嫩aⅴ一区二区三区四区五区 | 久久国产福利国产秒拍| 欧美极品xxx| 欧洲精品中文字幕| 蜜桃久久精品一区二区| 国产精品你懂的| 欧美日韩免费观看一区三区| 精品在线视频一区| 亚洲男人天堂一区| 日韩欧美国产电影| 成人精品一区二区三区四区| 亚洲曰韩产成在线| 久久久精品免费网站| 色综合久久久久久久久| 免费成人性网站| 国产精品福利电影一区二区三区四区 | 国产精品88av| 午夜精品久久久久久久久久| 久久久久久久久岛国免费| 欧美三级韩国三级日本一级| 国产91丝袜在线18| 免费成人深夜小野草| 国产精品高潮呻吟| 337p日本欧洲亚洲大胆色噜噜| 色婷婷一区二区三区四区| 美女精品自拍一二三四| 亚洲欧美二区三区| 国产欧美日本一区视频| 在线观看中文字幕不卡| 国产一区二区三区四区五区入口| 亚洲综合图片区| 中文字幕va一区二区三区| 欧美一二三四区在线| 色哟哟精品一区| 成人a级免费电影| 久久99最新地址| 五月天视频一区| 亚洲激情欧美激情| 国产精品美女久久久久久久久| 欧美一级高清片在线观看| 在线看国产日韩| 91啦中文在线观看| av不卡免费在线观看| 九色|91porny| 美女在线视频一区| 青青草97国产精品免费观看无弹窗版 | 欧洲亚洲国产日韩| 色综合天天综合狠狠| 成人午夜电影久久影院| 狠狠色狠狠色综合| 精品一区二区三区的国产在线播放| 亚洲二区在线视频| 亚洲国产精品一区二区www在线| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ原创 | 久久你懂得1024| 久久一区二区视频| 日韩免费电影一区| 日韩欧美一区二区三区在线| 91精品欧美综合在线观看最新| 欧美色国产精品| 欧美日韩亚洲综合| 欧美日韩高清一区二区不卡 | 欧美成人福利视频| 日韩欧美一区二区视频| 欧美大片国产精品| 久久久无码精品亚洲日韩按摩| 日韩视频永久免费| 日韩免费福利电影在线观看| 精品国产百合女同互慰| 久久久一区二区三区捆绑**| 欧美精品一区二区在线播放| 国产日韩欧美综合一区| 日本一区二区三区视频视频| 综合中文字幕亚洲| 一区2区3区在线看| 琪琪一区二区三区| 国产成人精品一区二区三区网站观看| 国产传媒一区在线| 欧美中文字幕一二三区视频| 欧美日韩视频在线一区二区| 精品国产a毛片| 亚洲欧洲av一区二区三区久久| 亚洲人成电影网站色mp4| 亚洲一区二区三区四区中文字幕| 日本韩国精品一区二区在线观看| 色播五月激情综合网| 91精品国产综合久久精品app| 欧美成人一区二区三区| 国产精品国产三级国产普通话三级| 亚洲一区国产视频| 国内成人精品2018免费看| 99久久久国产精品免费蜜臀| 欧美蜜桃一区二区三区 | 欧美一区在线视频| 欧美高清在线精品一区| 亚洲一区二区三区在线看| 国精产品一区一区三区mba视频| 成人99免费视频| 91精品国产综合久久精品图片| 国产日韩欧美在线一区| 亚洲一区二区影院| 国产精品一区二区久激情瑜伽| 欧洲精品一区二区| 国产亚洲精品资源在线26u| 亚洲人被黑人高潮完整版| 久久99久久99小草精品免视看| 91在线云播放| 精品理论电影在线观看 | 17c精品麻豆一区二区免费| 日本视频一区二区三区| 91小视频免费观看| 久久夜色精品一区| 日韩专区欧美专区| 日本高清视频一区二区| 国产欧美日韩在线看| 日本视频一区二区| 日本久久精品电影| 国产精品视频九色porn| 免费成人美女在线观看| 欧美视频一区二区三区四区 | 国产亚洲va综合人人澡精品| 午夜精品在线看| 日本道在线观看一区二区| 欧美国产日产图区| 国内精品第一页| 日韩精品一区二区三区蜜臀| 亚洲午夜一区二区| 99久久综合精品| 中国色在线观看另类| 国产一区二区视频在线播放| 日韩视频在线永久播放| 日韩国产欧美一区二区三区| 欧美日免费三级在线| 亚洲精品欧美二区三区中文字幕| jlzzjlzz亚洲日本少妇| 国产人伦精品一区二区| 国产酒店精品激情| 久久人人97超碰com| 国产揄拍国内精品对白| 精品成a人在线观看| 精品一二线国产| www国产精品av| 国产白丝精品91爽爽久久 | 成人午夜电影久久影院|