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

📄 pth_data.c

📁 Linux下的中文输入法
💻 C
字号:
/***  GNU Pth - The GNU Portable Threads**  Copyright (c) 1999-2004 Ralf S. Engelschall <rse@engelschall.com>****  This file is part of GNU Pth, a non-preemptive thread scheduling**  library which can be found at http://www.gnu.org/software/pth/.****  This library is free software; you can redistribute it and/or**  modify it under the terms of the GNU Lesser General Public**  License as published by the Free Software Foundation; either**  version 2.1 of the License, or (at your option) any later version.****  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**  Lesser General Public License for more details.****  You should have received a copy of the GNU Lesser General Public**  License along with this library; if not, write to the Free Software**  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307**  USA, or contact Ralf S. Engelschall <rse@engelschall.com>.****  pth_data.c: Pth per-thread specific data*/                             /* ``Breakthrough ideas                                  are not from teams.''                                       --- Hans von Ohain */#include "pth_p.h"struct pth_keytab_st {    int used;    void (*destructor)(void *);};static struct pth_keytab_st pth_keytab[PTH_KEY_MAX];int pth_key_create(pth_key_t *key, void (*func)(void *)){    if (key == NULL)        return pth_error(FALSE, EINVAL);    for ((*key) = 0; (*key) < PTH_KEY_MAX; (*key)++) {        if (pth_keytab[(*key)].used == FALSE) {            pth_keytab[(*key)].used = TRUE;            pth_keytab[(*key)].destructor = func;            return TRUE;        }    }    return pth_error(FALSE, EAGAIN);}int pth_key_delete(pth_key_t key){    if (key < 0 || key >= PTH_KEY_MAX)        return pth_error(FALSE, EINVAL);    if (!pth_keytab[key].used)        return pth_error(FALSE, ENOENT);    pth_keytab[key].used = FALSE;    return TRUE;}int pth_key_setdata(pth_key_t key, const void *value){    if (key < 0 || key >= PTH_KEY_MAX)        return pth_error(FALSE, EINVAL);    if (!pth_keytab[key].used)        return pth_error(FALSE, ENOENT);    if (pth_current->data_value == NULL) {        pth_current->data_value = (const void **)calloc(1, sizeof(void *)*PTH_KEY_MAX);        if (pth_current->data_value == NULL)            return pth_error(FALSE, ENOMEM);    }    if (pth_current->data_value[key] == NULL) {        if (value != NULL)            pth_current->data_count++;    }    else {        if (value == NULL)            pth_current->data_count--;    }    pth_current->data_value[key] = value;    return TRUE;}void *pth_key_getdata(pth_key_t key){    if (key < 0 || key >= PTH_KEY_MAX)        return pth_error((void *)NULL, EINVAL);    if (!pth_keytab[key].used)        return pth_error((void *)NULL, ENOENT);    if (pth_current->data_value == NULL)        return (void *)NULL;    return (void *)pth_current->data_value[key];}intern void pth_key_destroydata(pth_t t){    void *data;    int key;    int itr;    void (*destructor)(void *);    if (t == NULL)        return;    if (t->data_value == NULL)        return;    /* POSIX thread iteration scheme */    for (itr = 0; itr < PTH_DESTRUCTOR_ITERATIONS; itr++) {        for (key = 0; key < PTH_KEY_MAX; key++) {            if (t->data_count > 0) {                destructor = NULL;                data = NULL;                if (pth_keytab[key].used) {                    if (t->data_value[key] != NULL) {                        data = (void *)t->data_value[key];                        t->data_value[key] = NULL;                        t->data_count--;                        destructor = pth_keytab[key].destructor;                    }                }                if (destructor != NULL)                    destructor(data);            }            if (t->data_count == 0)                break;        }        if (t->data_count == 0)            break;    }    free(t->data_value);    t->data_value = NULL;    return;}

⌨️ 快捷键说明

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