⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 thr0loc.c

📁 这是linux下运行的mysql软件包,可用于linux 下安装 php + mysql + apach 的网络配置
💻 C
字号:
/******************************************************The thread local storage(c) 1995 Innobase OyCreated 10/5/1995 Heikki Tuuri*******************************************************/#include "thr0loc.h"#ifdef UNIV_NONINL#include "thr0loc.ic"#endif#include "sync0sync.h"#include "hash0hash.h"#include "mem0mem.h"#include "srv0srv.h"/*	IMPLEMENTATION OF THREAD LOCAL STORAGE	======================================The threads sometimes need private data which depends on the thread id.This is implemented as a hash table, where the hash value is calculatedfrom the thread id, to prepare for a large number of threads. The hash tableis protected by a mutex. If you need modify the program and put new data tothe thread local storage, just add it to struct thr_local_struct in theheader file. *//* Mutex protecting the local storage hash table */mutex_t	thr_local_mutex;/* The hash table. The module is not yet initialized when it is NULL. */hash_table_t*	thr_local_hash	= NULL;/* The private data for each thread should be put tothe structure below and the accessor functions writtenfor the field. */typedef struct thr_local_struct thr_local_t;struct thr_local_struct{	os_thread_id_t	id;	/* id of the thread which owns this struct */	os_thread_t	handle;	/* operating system handle to the thread */	ulint		slot_no;/* the index of the slot in the thread table				for this thread */	ibool		in_ibuf;/* TRUE if the the thread is doing an ibuf				operation */	hash_node_t	hash;	/* hash chain node */	ulint		magic_n;};#define THR_LOCAL_MAGIC_N	1231234/***********************************************************************Returns the local storage struct for a thread. */staticthr_local_t*thr_local_get(/*==========*/				/* out: local storage */	os_thread_id_t	id)	/* in: thread id of the thread */{	thr_local_t*	local;	try_again:		ut_ad(thr_local_hash);#ifdef UNIV_SYNC_DEBUG	ut_ad(mutex_own(&thr_local_mutex));#endif /* UNIV_SYNC_DEBUG */	/* Look for the local struct in the hash table */	local = NULL;		HASH_SEARCH(hash, thr_local_hash, os_thread_pf(id),				local, os_thread_eq(local->id, id));	if (local == NULL) {		mutex_exit(&thr_local_mutex);				thr_local_create();			mutex_enter(&thr_local_mutex);		goto try_again;	}		ut_ad(local->magic_n == THR_LOCAL_MAGIC_N);					return(local);}/***********************************************************************Gets the slot number in the thread table of a thread. */ulintthr_local_get_slot_no(/*==================*/				/* out: slot number */	os_thread_id_t	id)	/* in: thread id of the thread */{	ulint		slot_no;	thr_local_t*	local;	mutex_enter(&thr_local_mutex);		local = thr_local_get(id);	slot_no = local->slot_no;		mutex_exit(&thr_local_mutex);	return(slot_no);}/***********************************************************************Sets the slot number in the thread table of a thread. */voidthr_local_set_slot_no(/*==================*/	os_thread_id_t	id,	/* in: thread id of the thread */	ulint		slot_no)/* in: slot number */{	thr_local_t*	local;	mutex_enter(&thr_local_mutex);		local = thr_local_get(id);	local->slot_no = slot_no;		mutex_exit(&thr_local_mutex);}/***********************************************************************Returns pointer to the 'in_ibuf' field within the current thread localstorage. */ibool*thr_local_get_in_ibuf_field(void)/*=============================*/			/* out: pointer to the in_ibuf field */{	thr_local_t*	local;	mutex_enter(&thr_local_mutex);		local = thr_local_get(os_thread_get_curr_id());		mutex_exit(&thr_local_mutex);	return(&(local->in_ibuf));}/***********************************************************************Creates a local storage struct for the calling new thread. */voidthr_local_create(void)/*==================*/{	thr_local_t*	local;	if (thr_local_hash == NULL) {		thr_local_init();	}		local = mem_alloc(sizeof(thr_local_t));	local->id = os_thread_get_curr_id();	local->handle = os_thread_get_curr();	local->magic_n = THR_LOCAL_MAGIC_N; 	local->in_ibuf = FALSE;		mutex_enter(&thr_local_mutex);	HASH_INSERT(thr_local_t, hash, thr_local_hash,			os_thread_pf(os_thread_get_curr_id()),			local);					mutex_exit(&thr_local_mutex);}/***********************************************************************Frees the local storage struct for the specified thread. */voidthr_local_free(/*===========*/	os_thread_id_t	id)	/* in: thread id */{	thr_local_t*	local;		mutex_enter(&thr_local_mutex);	/* Look for the local struct in the hash table */	HASH_SEARCH(hash, thr_local_hash, os_thread_pf(id),				local, os_thread_eq(local->id, id));	if (local == NULL) {		mutex_exit(&thr_local_mutex);		return;	}							HASH_DELETE(thr_local_t, hash, thr_local_hash,				os_thread_pf(id), local);	mutex_exit(&thr_local_mutex);					ut_a(local->magic_n == THR_LOCAL_MAGIC_N);		mem_free(local);}/********************************************************************Initializes the thread local storage module. */voidthr_local_init(void)/*================*/{	ut_a(thr_local_hash == NULL);	thr_local_hash = hash_create(OS_THREAD_MAX_N + 100);	mutex_create(&thr_local_mutex);	mutex_set_level(&thr_local_mutex, SYNC_THR_LOCAL);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -