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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? arch-specific.cpp

?? newos is new operation system
?? CPP
字號(hào):
///-*-C++-*-////////////////////////////////////////////////////////////////////// Hoard: A Fast, Scalable, and Memory-Efficient Allocator//        for Shared-Memory Multiprocessors// Contact author: Emery Berger, http://www.cs.utexas.edu/users/emery//// Copyright (c) 1998-2000, The University of Texas at Austin.//// This library is free software; you can redistribute it and/or modify// it under the terms of the GNU Library General Public License as// published by the Free Software Foundation, http://www.fsf.org.//// This library is distributed in the hope that it will be useful, but// WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU// Library General Public License for more details.//////////////////////////////////////////////////////////////////////////////////#include <assert.h>#include "arch-specific.h"// How many iterations we spin waiting for a lock.enum { SPIN_LIMIT = 100 };// The values of a user-level lock.enum { UNLOCKED = 0, LOCKED = 1 };extern "C" {#ifdef NEWOS#include <stdio.h>#include <sys/syscalls.h>#include <sys/atomic.h>int hoardGetThreadID (void){  return _kern_get_current_thread_id();}void hoardLockInit (hoardLockType &lock){ 	lock.ben = 0;	lock.sem = _kern_sem_create(1, "a hoard lock");}void hoardLock (hoardLockType &lock){  if((atomic_add(&(lock.ben), 1)) >= 1) _kern_sem_acquire(lock.sem, 1);}void hoardUnlock (hoardLockType &lock){  if((atomic_add(&(lock.ben), -1)) > 1) _kern_sem_release(lock.sem, 1);}int hoardGetPageSize (void){  return 4096;}int hoardGetNumProcessors (void){  // XXX return the real number of procs here  return 1;}static region_id heap_region = -1;static addr_t brk;int __heap_init(){	// XXX do something better here	if(heap_region < 0) {		heap_region = _kern_vm_create_anonymous_region("heap", (void **)&brk,			REGION_ADDR_ANY_ADDRESS, 4*1024*1024, REGION_WIRING_LAZY, LOCK_RW);	}	return 0;}class heap_init_hack_t{public:	heap_init_hack_t(void) {		__heap_init();	}} heap_init_hack;void * hoardSbrk (long size){	void *ret = (void *)brk;	brk += size;	return ret;}void hoardUnsbrk (void * ptr, long size){  // NOT CURRENTLY IMPLEMENTED!}void hoardYield (void){}#elif defined(WIN32)unsigned long hoardInterlockedExchange (unsigned long * oldval,					unsigned long newval){  return InterlockedExchange (reinterpret_cast<long *>(oldval), newval);}void hoardCreateThread (hoardThreadType& t,			void *(*function) (void *),			void * arg){  t = CreateThread (0, 0, (LPTHREAD_START_ROUTINE) function, (LPVOID) arg, 0, 0);}void hoardJoinThread (hoardThreadType& t){  WaitForSingleObject (t, INFINITE);}void hoardSetConcurrency (int){}int hoardGetThreadID (void) {  // Threads from Windows 2000 are 4 apart,  // so we shift them over to get an appropriate thread id.  int tid = GetCurrentThreadId() >> 2;  return tid;}void hoardLockInit (hoardLockType& mutex) {  InterlockedExchange (&mutex, 0);}void hoardLock (hoardLockType& mutex) {  // A yielding lock (with an initial spin).  int i;  while (1) {    i = 0;    while (i < SPIN_LIMIT) {		if (mutex != LOCKED)	     if (InterlockedExchange (&mutex, LOCKED) == UNLOCKED) {			// We got the lock.			return;      }      i++;    }    // Yield to other threads.    Sleep (0);  }}void hoardYield (void) {  Sleep (0);}void hoardUnlock (hoardLockType& mutex) {  InterlockedExchange (&mutex, UNLOCKED);}void * hoardSbrk (long size){  void * ptr = HeapAlloc (GetProcessHeap(), 0, size);  return (void *) ptr;}void hoardUnsbrk (void * ptr, long size){	HeapFree (GetProcessHeap(), 0, ptr);}int hoardGetPageSize (void){  SYSTEM_INFO infoReturn[1];  GetSystemInfo (infoReturn);  return (int) (infoReturn -> dwPageSize);}int hoardGetNumProcessors (void){  static int numProcessors = 0;  if (numProcessors == 0) {    SYSTEM_INFO infoReturn[1];    GetSystemInfo (infoReturn);    numProcessors = (int) (infoReturn -> dwNumberOfProcessors);  }  return numProcessors;}#elif defined(__BEOS__)#include <OS.h>#include <unistd.h>void hoardCreateThread (hoardThreadType &t,			void *( *function)( void *),			void *arg){  t = spawn_thread((int32 (*)(void*))function, "some thread",		   B_NORMAL_PRIORITY, arg);  if (t >= B_OK) resume_thread(t);  else debugger("spawn_thread() failed!");}void hoardJoinThread (hoardThreadType &t){  status_t dummy;  wait_for_thread(t, &dummy);}void hoardSetConcurrency (int){}int hoardGetThreadID (void){  return find_thread(0);}void hoardLockInit (hoardLockType &lock){  lock.ben = 0;  lock.sem = create_sem(0, "a hoard lock");}void hoardLock (hoardLockType &lock){  if((atomic_add(&(lock.ben), 1)) >= 1) acquire_sem(lock.sem);}void hoardUnlock (hoardLockType &lock){  if((atomic_add(&(lock.ben), -1)) > 1) release_sem(lock.sem);}int hoardGetPageSize (void){  return B_PAGE_SIZE;}int hoardGetNumProcessors (void){  system_info si;  status_t result = get_system_info(&si);  assert (result == B_OK);  return si.cpu_count;}void * hoardSbrk (long size){  return sbrk(size + hoardHeap::ALIGNMENT - 1);}void hoardUnsbrk (void * ptr, long size){  // NOT CURRENTLY IMPLEMENTED!}void hoardYield (void){}unsigned long hoardInterlockedExchange (unsigned long * oldval,					unsigned long newval){  // This *should* be made atomic.  It's never used in the BeOS  // version, so this is included strictly for completeness.  unsigned long o = *oldval;  *oldval = newval;  return o;}#else // UNIX#if USE_SPROC#include <sys/types.h>#include <sys/wait.h>#include <unistd.h>#include <ulocks.h>#endifvoid hoardCreateThread (hoardThreadType& t,			void *(*function) (void *),			void * arg){#if USE_SPROC  typedef void (*sprocFunction) (void *);  t = sproc ((sprocFunction) function, PR_SADDR, arg);#else  pthread_attr_t attr;  pthread_attr_init (&attr);#if defined(_AIX)  // Bound (kernel-level) threads.  pthread_attr_setscope (&attr, PTHREAD_SCOPE_SYSTEM);#endif  pthread_create (&t, &attr, function, arg);#endif}void hoardJoinThread (hoardThreadType& t){#if USE_SPROC  waitpid (t, 0, 0);#else  pthread_join (t, NULL);#endif}#if defined(__linux)// This extern declaration is required for Linux.extern "C" void pthread_setconcurrency (int n);#endifvoid hoardSetConcurrency (int n){#if USE_SPROC  usconfig (CONF_INITUSERS, n);#elif defined(__SVR4) // Solaris  thr_setconcurrency (n);#else  pthread_setconcurrency (n);#endif}#if defined(__SVR4) // Solaris// Solaris's two-level threads model gives us an edge here;// we can hash on the LWP's id. This helps us in two ways:// (1) there are likely to be far fewer LWP's than threads,// (2) if there's a one-to-one correspondence between LWP's//     and the number of processors (usually the case), then//     the number of heaps used will be the same as the number//     of processors (the optimal case).// Here we rely on an undocumented call in libthread.so, which// turns out to be MUCH cheaper than the documented _lwp_self(). Go figure.extern "C" unsigned int lwp_self(void);#endifint hoardGetThreadID (void) {#if USE_SPROC  // This hairiness has the same effect as calling getpid(),  // but it's MUCH faster since it avoids making a system call  // and just accesses the sproc-local data directly.  int pid = (int) PRDA->sys_prda.prda_sys.t_pid;  return pid;#else#if defined(__linux)  // Consecutive thread id's in Linux are 1024 apart;  // dividing off the 1024 gives us an appropriate thread id.  return (int) pthread_self() >> 10; // (>> 10 = / 1024)#endif#if defined(__AIX)  // Consecutive thread id's in AIX are 257 apart;  // dividing off the 257 gives us an appropriate thread id.  return (int) pthread_self() / 257;#endif#if defined(__SVR4)  return (int) lwp_self();#endif  return (int) pthread_self();#endif}// If we are using either Intel or SPARC,// we use our own lock implementation// (spin then yield). This is much cheaper than// the ordinary mutex, at least on Linux and Solaris.#if USER_LOCKS && (defined(i386) || defined(sparc) || defined(__sgi) || defined(ppc))#include <sched.h>#if defined(__sgi)#include <mutex.h>#endif// Atomically://   retval = *oldval;//   *oldval = newval;//   return retval;#if defined(sparc) && !defined(__GNUC__)extern "C" unsigned long InterlockedExchange (unsigned long * oldval,					      unsigned long newval);#elseunsigned long InterlockedExchange (unsigned long * oldval,						 unsigned long newval){#if defined(sparc)  asm volatile ("swap [%1],%0"		:"=r" (newval)		:"r" (oldval), "0" (newval)		: "memory");#endif#if defined(i386)  asm volatile ("xchgl %0, %1"		: "=r" (newval)		: "m" (*oldval), "0" (newval)		: "memory");#endif#if defined(__sgi)  newval = test_and_set (oldval, newval);#endif#if defined(ppc)  int ret;  asm volatile ("sync;"		"0:    lwarx %0,0,%1 ;"		"      xor. %0,%3,%0;"		"      bne 1f;"		"      stwcx. %2,0,%1;"		"      bne- 0b;"		"1:    sync"	: "=&r"(ret)	: "r"(oldval), "r"(newval), "r"(*oldval)	: "cr0", "memory");#endif  return newval;}#endifunsigned long hoardInterlockedExchange (unsigned long * oldval,					unsigned long newval){  return InterlockedExchange (oldval, newval);}void hoardLockInit (hoardLockType& mutex) {  InterlockedExchange (&mutex, UNLOCKED);}#include <stdio.h>void hoardLock (hoardLockType& mutex) {  // A yielding lock (with an initial spin).  int i;  while (1) {    i = 0;    while (i < SPIN_LIMIT) {      if (InterlockedExchange (&mutex, LOCKED) == UNLOCKED) {	// We got the lock.	return;      }      i++;    }    // The lock is still being held by someone else.    // Give up our quantum.    sched_yield ();  }}void hoardUnlock (hoardLockType& mutex) {  InterlockedExchange (&mutex, UNLOCKED);}#else// use non-user-level locks.#endif // USER_LOCKSvoid hoardYield (void){  sched_yield ();}#if 1 // !(defined(__sgi))#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd.h>#include <sys/mman.h>#endifvoid * hoardSbrk (long size) {  // Use mmap for everything but SGI.  // Apparently sproc's and mmap's don't cooperate.#if 0 // defined(__sgi)  // Protect calls to sbrk() with a lock.#if USER_LOCKS  static hoardLockType sbrkLock = 0;#else  static hoardLockType sbrkLock = PTHREAD_MUTEX_INITIALIZER;#endif  hoardLock (sbrkLock);  // The "sizeof(double)" should equal hoardHeap::ALIGNMENT.  // This is a workaround (compiler error in g++).  void * moreMemory = sbrk (size + sizeof(double) - 1);  hoardUnlock (sbrkLock);  return moreMemory;#else#if defined(linux)#if USER_LOCKS  static hoardLockType sbrkLock = 0;#else  static hoardLockType sbrkLock = PTHREAD_MUTEX_INITIALIZER;#endif#endif  // Use mmap to get memory from the backing store.  static int fd = ::open ("/dev/zero", O_RDWR);#if defined(linux)  hoardLock (sbrkLock);  // Map starting at this address to maximize the amount of memory  // available to Hoard. Thanks to Jim Nance for this tip.  char * ptr = (char *) mmap ((void *) 0x10000000, size, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE, fd, 0);#else  char * ptr = (char *) mmap (NULL, size, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE, fd, 0);#endif  char * retPtr;  if (ptr == (char *) MAP_FAILED) {    retPtr = NULL;  } else {    retPtr = ptr;  }#if defined(linux)  hoardUnlock (sbrkLock);#endif  return retPtr;#endif}void hoardUnsbrk (void * ptr, long size){#if defined(linux)#if USER_LOCKS  static hoardLockType sbrkLock = 0;#else  static hoardLockType sbrkLock = PTHREAD_MUTEX_INITIALIZER;#endif#endif#if defined(linux)  hoardLock (sbrkLock);#endif  int result = munmap ((char *) ptr, size);  assert (result == 0);#if defined(linux)  hoardUnlock (sbrkLock);#endif}int hoardGetPageSize (void){  return (int) sysconf(_SC_PAGESIZE);}#if defined(linux)#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <string.h>#endif#if defined(__sgi)#include <sys/types.h>#include <sys/sysmp.h>#include <sys/sysinfo.h>#endifint hoardGetNumProcessors (void){#if !(defined(linux))#if defined(__sgi)  static int np = (int) sysmp(MP_NAPROCS);  return np;#else  static int np = (int) sysconf(_SC_NPROCESSORS_ONLN);  return np;#endif#else  static int numProcessors = 0;  if (numProcessors == 0) {    // Ugly workaround.  Linux's sysconf indirectly calls malloc() (at    // least on multiprocessors).  So we just read the info from the    // proc file ourselves and count the occurrences of the word    // "processor".    // We only parse the first 32K of the CPU file.  By my estimates,    // that should be more than enough for at least 64 processors.    enum { MAX_PROCFILE_SIZE = 32768 };    char line[MAX_PROCFILE_SIZE];    int fd = open ("/proc/cpuinfo", O_RDONLY);    assert (fd);    read(fd, line, MAX_PROCFILE_SIZE);    char * str = line;    while (str) {      str = strstr(str, "processor");      if (str) {	numProcessors++;	str++;      }    }    close (fd);    assert (numProcessors > 0);  }  return numProcessors;#endif}#endif // UNIX}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久久国产午夜精品| 激情六月婷婷综合| 亚洲欧美一区二区不卡| 欧美国产日韩亚洲一区| 久久亚洲欧美国产精品乐播| xnxx国产精品| 久久综合色婷婷| 精品久久久久久久久久久久久久久| 91精品久久久久久久久99蜜臂| 欧美精品日韩一本| 91精品中文字幕一区二区三区| 6080yy午夜一二三区久久| 欧美裸体一区二区三区| 欧美福利视频导航| 日韩一区二区三区四区| 久久婷婷久久一区二区三区| 国产亚洲成aⅴ人片在线观看| 国产精品情趣视频| 亚洲日本成人在线观看| 亚洲电影一区二区三区| 美女脱光内衣内裤视频久久影院| 精品亚洲aⅴ乱码一区二区三区| 国产一区三区三区| 成人午夜在线播放| 色综合视频在线观看| 欧美日韩视频在线观看一区二区三区| 91精品黄色片免费大全| 久久青草欧美一区二区三区| 国产精品久久久久国产精品日日 | 国产精品美女久久久久久久久 | 日韩欧美色电影| 欧美一二三四在线| 久久综合一区二区| 成人免费在线视频观看| 亚洲主播在线观看| 久久91精品国产91久久小草| 成人高清视频免费观看| 欧美午夜影院一区| 精品国产免费一区二区三区香蕉| 国产精品久久久久影院色老大 | 亚洲人吸女人奶水| 日韩电影在线一区| 国产成人丝袜美腿| 91免费版pro下载短视频| 91麻豆精品国产91久久久久| 国产亚洲午夜高清国产拍精品| 亚洲精品日日夜夜| 免费观看在线综合| 波多野结衣中文字幕一区二区三区| 欧美中文字幕一区二区三区| 欧美成人乱码一区二区三区| 国产精品欧美一区二区三区| 亚洲亚洲人成综合网络| 国产精品自拍毛片| 欧美系列日韩一区| 欧美激情自拍偷拍| 日韩av一级电影| 99久久99久久精品国产片果冻| 欧美疯狂性受xxxxx喷水图片| 国产精品乱码妇女bbbb| 五月天一区二区三区| 成人黄色综合网站| 91精品国产综合久久久久久久久久| 国产精品视频看| 久久精品国产第一区二区三区| 91在线码无精品| 久久嫩草精品久久久精品| 性久久久久久久久久久久| a4yy欧美一区二区三区| 精品少妇一区二区三区免费观看| 亚洲一线二线三线视频| 福利视频网站一区二区三区| 欧美一区欧美二区| 尤物在线观看一区| eeuss鲁片一区二区三区在线看| 日韩你懂的电影在线观看| 夜色激情一区二区| 成人激情免费电影网址| 精品成人一区二区三区四区| 日欧美一区二区| 一本大道久久a久久综合婷婷| 久久久久国产成人精品亚洲午夜| 青青草成人在线观看| 欧美日韩一区在线观看| 亚洲女女做受ⅹxx高潮| 成人18视频日本| 久久精品免费在线观看| 免费在线观看精品| 欧美三区在线视频| 一区二区三区**美女毛片| 99在线精品一区二区三区| 欧美精彩视频一区二区三区| 国产米奇在线777精品观看| 欧美sm美女调教| 免费看欧美女人艹b| 91精品国产麻豆| 日韩中文欧美在线| 欧美裸体bbwbbwbbw| 亚洲国产三级在线| 在线免费观看日本欧美| 亚洲精品网站在线观看| 91精品办公室少妇高潮对白| 亚洲欧美视频在线观看视频| 91在线高清观看| 亚洲丝袜自拍清纯另类| 色婷婷精品大在线视频| 亚洲精品乱码久久久久久黑人| 91色九色蝌蚪| 亚洲九九爱视频| 日本国产一区二区| 亚洲尤物在线视频观看| 欧美午夜电影在线播放| 图片区小说区国产精品视频| 91麻豆精品国产综合久久久久久 | 麻豆国产精品一区二区三区 | 一区二区三区国产精华| 色婷婷精品久久二区二区蜜臀av| 一区二区三区四区亚洲| 欧美三级视频在线| 日本aⅴ精品一区二区三区 | 国产清纯美女被跳蛋高潮一区二区久久w | 精品一区二区日韩| 日韩欧美综合在线| 国产麻豆视频精品| 中文字幕亚洲区| 91福利视频在线| 午夜欧美在线一二页| 日韩三级伦理片妻子的秘密按摩| 激情久久久久久久久久久久久久久久| 精品国产电影一区二区| 成人av资源在线| 亚洲综合色视频| 欧美精品在线一区二区三区| 久久精品国产色蜜蜜麻豆| 国产日韩av一区| 色诱视频网站一区| 日韩av电影免费观看高清完整版在线观看| 欧美一二三区在线| 波多野结衣精品在线| 亚洲精品乱码久久久久久 | 亚洲欧美激情一区二区| 欧美日韩国产大片| 久久国产生活片100| 国产精品久久久久aaaa| 在线电影欧美成精品| 国产乱淫av一区二区三区| 国产精品国产三级国产a| 欧美日韩小视频| 国产a久久麻豆| 亚洲成人综合在线| 国产女主播在线一区二区| 欧美在线你懂得| 国内外成人在线| 亚洲一区精品在线| 久久久激情视频| 这里只有精品99re| av一区二区三区四区| 久久成人免费网站| 亚洲乱码中文字幕| 久久综合色播五月| 欧美亚洲愉拍一区二区| 国产精品一二三四| 日韩精品亚洲一区| 中文字幕一区二区不卡| 日韩精品一区二区三区蜜臀| 色悠悠亚洲一区二区| 国产激情精品久久久第一区二区| 亚洲一区二区不卡免费| 国产欧美视频在线观看| 欧美一卡2卡3卡4卡| 色婷婷综合久色| 国产麻豆精品久久一二三| 天堂在线一区二区| 亚洲人成亚洲人成在线观看图片 | 日本va欧美va瓶| 亚洲黄一区二区三区| 国产精品视频一区二区三区不卡| 日韩精品一区二区三区老鸭窝 | 日韩免费高清av| 欧美日韩久久不卡| 91亚洲精品一区二区乱码| 国产成人免费网站| 美女网站色91| 图片区小说区区亚洲影院| 亚洲精选视频在线| 国产精品成人午夜| 国产欧美日韩另类视频免费观看 | 亚洲日本韩国一区| 中文字幕av不卡| 久久青草欧美一区二区三区| 日韩一区二区三区电影| 欧美日韩在线电影| 日本久久精品电影| 91香蕉视频在线| 成人午夜免费电影| 国产成人在线免费观看| 国产一区高清在线| 麻豆精品一区二区三区| 免费成人在线观看视频| 免费精品视频最新在线|