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

📄 smpd_database.c

📁 fortran并行计算包
💻 C
字号:
/* -*- Mode: C; c-basic-offset:4 ; -*- *//* *  (C) 2001 by Argonne National Laboratory. *      See COPYRIGHT in top-level directory. */#include "smpd.h"static void get_uuid(char *str){#ifdef HAVE_WINDOWS_H#if 0    UUID guid;    char *rpcstr;    UuidCreate(&guid);    UuidToString(&guid, &rpcstr);    strcpy(str, rpcstr);    RpcStringFree(&rpcstr);#else    UUID guid;    UuidCreate(&guid);    sprintf(str, "%08lX-%04X-%04x-%02X%02X-%02X%02X%02X%02X%02X%02X",	guid.Data1, guid.Data2, guid.Data3,	guid.Data4[0], guid.Data4[1], guid.Data4[2], guid.Data4[3],	guid.Data4[4], guid.Data4[5], guid.Data4[6], guid.Data4[7]);#endif#elif defined(HAVE_CFUUIDCREATE)    CFUUIDRef       myUUID;    CFStringRef     myUUIDString;    char            strBuffer[100];    myUUID = CFUUIDCreate(kCFAllocatorDefault);    myUUIDString = CFUUIDCreateString(kCFAllocatorDefault, myUUID);/* This is the safest way to obtain a C string from a CFString.*/    CFStringGetCString(myUUIDString, str, SMPD_MAX_DBS_NAME_LEN, kCFStringEncodingASCII);    CFRelease(myUUIDString);#elif defined(HAVE_UUID_GENERATE)    uuid_t guid;    uuid_generate(guid);    uuid_unparse(guid, str);#else    sprintf(str, "%X%X%X%X", rand(), rand(), rand(), rand());#endif}#undef FCNAME#define FCNAME "smpd_dbs_init"int smpd_dbs_init(){    smpd_enter_fn(FCNAME);#ifdef USE_WIN_MUTEX_PROTECT    if (smpd_process.nInitDBSRefCount == 0)    {	smpd_process.hDBSMutex = CreateMutex(NULL, FALSE, NULL);    }#endif    smpd_process.nInitDBSRefCount++;    if (smpd_process.domain_name[0] == '\0')    {	/*get_uuid(smpd_process.domain_name);*/	/* create a database for the domain to be used for global operations like name publishing */	smpd_dbs_create(smpd_process.domain_name);    }    smpd_exit_fn(FCNAME);    return SMPD_DBS_SUCCESS;}#undef FCNAME#define FCNAME "smpd_dbs_finalize"int smpd_dbs_finalize(){    smpd_database_node_t *pNode, *pNext;    smpd_database_element_t *pElement;    smpd_enter_fn(FCNAME);    smpd_process.nInitDBSRefCount--;    if (smpd_process.nInitDBSRefCount == 0)    {#ifdef USE_WIN_MUTEX_PROTECT	WaitForSingleObject(smpd_process.hDBSMutex, INFINITE);#endif	pNode = smpd_process.pDatabase;	while (pNode)	{	    pNext = pNode->pNext;	    while (pNode->pData)	    {		pElement = pNode->pData;		pNode->pData = pNode->pData->pNext;		MPIU_Free(pElement);	    }	    MPIU_Free(pNode);	    pNode = pNext;	}	smpd_process.pDatabase = NULL;	smpd_process.pDatabaseIter = NULL;#ifdef USE_WIN_MUTEX_PROTECT	ReleaseMutex(smpd_process.hDBSMutex);	CloseHandle(smpd_process.hDBSMutex);	smpd_process.hDBSMutex = NULL;#endif    }    smpd_exit_fn(FCNAME);    return SMPD_DBS_SUCCESS;}#undef FCNAME#define FCNAME "smpd_dbs_create"int smpd_dbs_create(char *name){    /*char guid_str[100];*/    smpd_database_node_t *pNode, *pNodeTest;    smpd_enter_fn(FCNAME);#ifdef USE_WIN_MUTEX_PROTECT    /* Lock */    WaitForSingleObject(smpd_process.hDBSMutex, INFINITE);#endif    pNode = smpd_process.pDatabase;    if (pNode)    {	while (pNode->pNext)	    pNode = pNode->pNext;	pNode->pNext = (smpd_database_node_t*)MPIU_Malloc(sizeof(smpd_database_node_t));	pNode = pNode->pNext;    }    else    {	smpd_process.pDatabase = (smpd_database_node_t*)MPIU_Malloc(sizeof(smpd_database_node_t));	pNode = smpd_process.pDatabase;    }    pNode->pNext = NULL;    pNode->pData = NULL;    pNode->pIter = NULL;    do    {	/*	sprintf(pNode->pszName, "%d", smpd_process.nNextAvailableDBSID);	smpd_process.nNextAvailableDBSID++;	*/	get_uuid(pNode->pszName);	if (pNode->pszName[0] == '\0')	{#ifdef USE_WIN_MUTEX_PROTECT	    /* Unlock */	    ReleaseMutex(smpd_process.hDBSMutex);#endif	    smpd_exit_fn(FCNAME);	    return SMPD_DBS_FAIL;	}	pNodeTest = smpd_process.pDatabase;	while (strcmp(pNodeTest->pszName, pNode->pszName) != 0)	    pNodeTest = pNodeTest->pNext;    } while (pNodeTest != pNode);    strcpy(name, pNode->pszName);#ifdef USE_WIN_MUTEX_PROTECT    /* Unlock */    ReleaseMutex(smpd_process.hDBSMutex);#endif    /* put a unique id in the kvs database */    /*    get_uuid(guid_str);    smpd_dbs_put(name, PMI_KVS_ID_KEY, guid_str);    */    smpd_exit_fn(FCNAME);    return SMPD_DBS_SUCCESS;}#undef FCNAME#define FCNAME "smpd_dbs_create_name_in"int smpd_dbs_create_name_in(char *name){    /*char guid_str[100];*/    smpd_database_node_t *pNode;    smpd_enter_fn(FCNAME);    if (strlen(name) < 1 || strlen(name) > SMPD_MAX_DBS_NAME_LEN)    {	smpd_exit_fn(FCNAME);	return SMPD_DBS_FAIL;    }#ifdef USE_WIN_MUTEX_PROTECT    /* Lock */    WaitForSingleObject(smpd_process.hDBSMutex, INFINITE);#endif    /* Check if the name already exists */    pNode = smpd_process.pDatabase;    while (pNode)    {	if (strcmp(pNode->pszName, name) == 0)	{#ifdef USE_WIN_MUTEX_PROTECT	    /* Unlock */	    ReleaseMutex(smpd_process.hDBSMutex);#endif	    /*return SMPD_DBS_FAIL;*/	    /* Empty database? */	    smpd_exit_fn(FCNAME);	    return SMPD_DBS_SUCCESS;	}	pNode = pNode->pNext;    }    pNode = smpd_process.pDatabase;    if (pNode)    {	while (pNode->pNext)	    pNode = pNode->pNext;	pNode->pNext = (smpd_database_node_t*)MPIU_Malloc(sizeof(smpd_database_node_t));	pNode = pNode->pNext;    }    else    {	smpd_process.pDatabase = (smpd_database_node_t*)MPIU_Malloc(sizeof(smpd_database_node_t));	pNode = smpd_process.pDatabase;    }    pNode->pNext = NULL;    pNode->pData = NULL;    pNode->pIter = NULL;    strcpy(pNode->pszName, name);    #ifdef USE_WIN_MUTEX_PROTECT    /* Unlock */    ReleaseMutex(smpd_process.hDBSMutex);#endif    /* put a unique id in the kvs database */    /*    get_uuid(guid_str);    smpd_dbs_put(name, PMI_KVS_ID_KEY, guid_str);    */    smpd_exit_fn(FCNAME);    return SMPD_DBS_SUCCESS;}#undef FCNAME#define FCNAME "smpd_dbs_get"int smpd_dbs_get(const char *name, const char *key, char *value){    smpd_database_node_t *pNode;    smpd_database_element_t *pElement;    smpd_enter_fn(FCNAME);#ifdef USE_WIN_MUTEX_PROTECT    WaitForSingleObject(smpd_process.hDBSMutex, INFINITE);#endif    pNode = smpd_process.pDatabase;    while (pNode)    {	if (strcmp(pNode->pszName, name) == 0)	{	    pElement = pNode->pData;	    while (pElement)	    {		if (strcmp(pElement->pszKey, key) == 0)		{		    strcpy(value, pElement->pszValue);#ifdef USE_WIN_MUTEX_PROTECT		    ReleaseMutex(smpd_process.hDBSMutex);#endif		    smpd_exit_fn(FCNAME);		    return SMPD_DBS_SUCCESS;		}		pElement = pElement->pNext;	    }	}	pNode = pNode->pNext;    }#ifdef USE_WIN_MUTEX_PROTECT    ReleaseMutex(smpd_process.hDBSMutex);#endif    smpd_exit_fn(FCNAME);    return SMPD_DBS_FAIL;}#undef FCNAME#define FCNAME "smpd_dbs_put"int smpd_dbs_put(const char *name, const char *key, const char *value){    smpd_database_node_t *pNode;    smpd_database_element_t *pElement;    smpd_enter_fn(FCNAME);#ifdef USE_WIN_MUTEX_PROTECT    WaitForSingleObject(smpd_process.hDBSMutex, INFINITE);#endif    pNode = smpd_process.pDatabase;    while (pNode)    {	if (strcmp(pNode->pszName, name) == 0)	{	    pElement = pNode->pData;	    while (pElement)	    {		if (strcmp(pElement->pszKey, key) == 0)		{		    strcpy(pElement->pszValue, value);#ifdef USE_WIN_MUTEX_PROTECT		    ReleaseMutex(smpd_process.hDBSMutex);#endif		    smpd_exit_fn(FCNAME);		    return SMPD_DBS_SUCCESS;		}		pElement = pElement->pNext;	    }	    pElement = (smpd_database_element_t*)MPIU_Malloc(sizeof(smpd_database_element_t));	    pElement->pNext = pNode->pData;	    strcpy(pElement->pszKey, key);	    strcpy(pElement->pszValue, value);	    pNode->pData = pElement;#ifdef USE_WIN_MUTEX_PROTECT	    ReleaseMutex(smpd_process.hDBSMutex);#endif	    smpd_exit_fn(FCNAME);	    return SMPD_DBS_SUCCESS;	}	pNode = pNode->pNext;    }#ifdef USE_WIN_MUTEX_PROTECT    ReleaseMutex(smpd_process.hDBSMutex);#endif    smpd_exit_fn(FCNAME);    return SMPD_DBS_FAIL;}#undef FCNAME#define FCNAME "smpd_dbs_delete"int smpd_dbs_delete(const char *name, const char *key){    smpd_database_node_t *pNode;    smpd_database_element_t *pElement, *pElementTrailer;    smpd_enter_fn(FCNAME);#ifdef USE_WIN_MUTEX_PROTECT    WaitForSingleObject(smpd_process.hDBSMutex, INFINITE);#endif    pNode = smpd_process.pDatabase;    while (pNode)    {	if (strcmp(pNode->pszName, name) == 0)	{	    pElementTrailer = pElement = pNode->pData;	    while (pElement)	    {		if (strcmp(pElement->pszKey, key) == 0)		{		    if (pElementTrailer != pElement)			pElementTrailer->pNext = pElement->pNext;		    else			pNode->pData = pElement->pNext;		    MPIU_Free(pElement);#ifdef USE_WIN_MUTEX_PROTECT		    ReleaseMutex(smpd_process.hDBSMutex);#endif		    smpd_exit_fn(FCNAME);		    return SMPD_DBS_SUCCESS;		}		pElementTrailer = pElement;		pElement = pElement->pNext;	    }#ifdef USE_WIN_MUTEX_PROTECT	    ReleaseMutex(smpd_process.hDBSMutex);#endif	    smpd_exit_fn(FCNAME);	    return SMPD_DBS_FAIL;	}	pNode = pNode->pNext;    }#ifdef USE_WIN_MUTEX_PROTECT    ReleaseMutex(smpd_process.hDBSMutex);#endif    smpd_exit_fn(FCNAME);    return SMPD_DBS_FAIL;}#undef FCNAME#define FCNAME "smpd_dbs_destroy"int smpd_dbs_destroy(const char *name){    smpd_database_node_t *pNode, *pNodeTrailer;    smpd_database_element_t *pElement;    smpd_enter_fn(FCNAME);#ifdef USE_WIN_MUTEX_PROTECT    WaitForSingleObject(smpd_process.hDBSMutex, INFINITE);#endif    pNodeTrailer = pNode = smpd_process.pDatabase;    while (pNode)    {	if (strcmp(pNode->pszName, name) == 0)	{	    while (pNode->pData)	    {		pElement = pNode->pData;		pNode->pData = pNode->pData->pNext;		MPIU_Free(pElement);	    }	    if (pNodeTrailer == pNode)		smpd_process.pDatabase = smpd_process.pDatabase->pNext;	    else		pNodeTrailer->pNext = pNode->pNext;	    MPIU_Free(pNode);#ifdef USE_WIN_MUTEX_PROTECT	    ReleaseMutex(smpd_process.hDBSMutex);#endif	    smpd_exit_fn(FCNAME);	    return SMPD_DBS_SUCCESS;	}	pNodeTrailer = pNode;	pNode = pNode->pNext;    }#ifdef USE_WIN_MUTEX_PROTECT    ReleaseMutex(smpd_process.hDBSMutex);#endif    smpd_exit_fn(FCNAME);    return SMPD_DBS_FAIL;}#undef FCNAME#define FCNAME "smpd_dbs_first"int smpd_dbs_first(const char *name, char *key, char *value){    smpd_database_node_t *pNode;    smpd_enter_fn(FCNAME);#ifdef USE_WIN_MUTEX_PROTECT    WaitForSingleObject(smpd_process.hDBSMutex, INFINITE);#endif    if (key != NULL)	key[0] = '\0';    pNode = smpd_process.pDatabase;    while (pNode)    {	if (strcmp(pNode->pszName, name) == 0)	{	    if (key != NULL)	    {		if (pNode->pData)		{		    strcpy(key, pNode->pData->pszKey);		    strcpy(value, pNode->pData->pszValue);		    pNode->pIter = pNode->pData->pNext;		}		else		    key[0] = '\0';	    }	    else	    {		pNode->pIter = pNode->pData;	    }#ifdef USE_WIN_MUTEX_PROTECT	    ReleaseMutex(smpd_process.hDBSMutex);#endif	    smpd_exit_fn(FCNAME);	    return SMPD_DBS_SUCCESS;	}	pNode = pNode->pNext;    }#ifdef USE_WIN_MUTEX_PROTECT    ReleaseMutex(smpd_process.hDBSMutex);#endif    smpd_exit_fn(FCNAME);    return SMPD_DBS_FAIL;}#undef FCNAME#define FCNAME "smpd_dbs_next"int smpd_dbs_next(const char *name, char *key, char *value){    smpd_database_node_t *pNode;    smpd_enter_fn(FCNAME);#ifdef USE_WIN_MUTEX_PROTECT    WaitForSingleObject(smpd_process.hDBSMutex, INFINITE);#endif    key[0] = '\0';    pNode = smpd_process.pDatabase;    while (pNode)    {	if (strcmp(pNode->pszName, name) == 0)	{	    if (pNode->pIter)	    {		strcpy(key, pNode->pIter->pszKey);		strcpy(value, pNode->pIter->pszValue);		pNode->pIter = pNode->pIter->pNext;	    }	    else		key[0] = '\0';#ifdef USE_WIN_MUTEX_PROTECT	    ReleaseMutex(smpd_process.hDBSMutex);#endif	    smpd_exit_fn(FCNAME);	    return SMPD_DBS_SUCCESS;	}	pNode = pNode->pNext;    }#ifdef USE_WIN_MUTEX_PROTECT    ReleaseMutex(smpd_process.hDBSMutex);#endif    smpd_exit_fn(FCNAME);    return SMPD_DBS_FAIL;}#undef FCNAME#define FCNAME "smpd_dbs_firstdb"int smpd_dbs_firstdb(char *name){    smpd_enter_fn(FCNAME);#ifdef USE_WIN_MUTEX_PROTECT    WaitForSingleObject(smpd_process.hDBSMutex, INFINITE);#endif    smpd_process.pDatabaseIter = smpd_process.pDatabase;    if (name != NULL)    {	if (smpd_process.pDatabaseIter)	    strcpy(name, smpd_process.pDatabaseIter->pszName);	else	    name[0] = '\0';    }#ifdef USE_WIN_MUTEX_PROTECT    ReleaseMutex(smpd_process.hDBSMutex);#endif    smpd_exit_fn(FCNAME);    return SMPD_DBS_SUCCESS;}#undef FCNAME#define FCNAME "smpd_dbs_nextdb"int smpd_dbs_nextdb(char *name){    smpd_enter_fn(FCNAME);#ifdef USE_WIN_MUTEX_PROTECT    WaitForSingleObject(smpd_process.hDBSMutex, INFINITE);#endif    if (smpd_process.pDatabaseIter == NULL)	name[0] = '\0';    else    {	smpd_process.pDatabaseIter = smpd_process.pDatabaseIter->pNext;	if (smpd_process.pDatabaseIter)	    strcpy(name, smpd_process.pDatabaseIter->pszName);	else	    name[0] = '\0';    }#ifdef USE_WIN_MUTEX_PROTECT    ReleaseMutex(smpd_process.hDBSMutex);#endif    smpd_exit_fn(FCNAME);    return SMPD_DBS_SUCCESS;}

⌨️ 快捷键说明

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