📄 dce_list.c
字号:
/***************************************Ho Chi Minh City University of Technology Computer Science Department Distributed Computing Environment (DCE)Written by Nguyen Van Noi -59406114File dce_list.c on Tue Dec 15 15:49:05 1998****************************************/#include <stdlib.h>#include "dce_list.h"#include "dce_def.h"PLISTNewItem (void *pVoid){ PLIST p = (PLIST) malloc (sizeof (List_t)); if (!p) return NULL; p->pData = pVoid; p->pLink = NULL; return p;}PLISTNewList (){ return NewItem (NULL);}intCountList (PLIST plist){ PLIST p = plist->pLink; int count = 0; while (p) { p = p->pLink; count++; } return count;}voidInsertList (PLIST plist, void *pVoid){ PLIST p = NewItem (pVoid); p->pLink = plist->pLink; plist->pLink = p;}voidDeleteItem (PLIST plist, void *pKey, int (*EQUAL) (void *, void *), void (*FREE) (void *)){ PLIST p1 = plist, p2 = plist->pLink; while (p2) { if (EQUAL (p2->pData, pKey)) { p1->pLink = p2->pLink; if (FREE) FREE (p2->pData); else free (p2->pData); free (p2); p2 = p1->pLink; continue; } p1 = p2; p2 = p2->pLink; }}void **ItemLookup (PLIST plist, void *pKey, int (*EQUAL) (void *, void *)){ PLIST p = plist->pLink; int count = 0; void **result; while (p) { if (EQUAL (p->pData, pKey)) count++; p = p->pLink; } if (!count) return NULL; result = (void **) calloc (count + 1, sizeof (void *)); p = plist->pLink; count = 0; while (p) { if (EQUAL (p->pData, pKey)) result[count++] = p->pData; p = p->pLink; } result[count] = NULL; return result;}voidFreeList (PLIST plist, void (*FREE) (void *)){ PLIST p1 = plist; while (p1) { plist = p1->pLink; if (FREE) FREE (p1->pData); else free (p1->pData); free (p1); p1 = plist; }}intAddItem (PLIST plist, void *pKey, int (*EQUAL) (void *, void *)){ PLIST p = plist->pLink; while (p) { if (EQUAL (p->pData, pKey)) return 0; p = p->pLink; } InsertList (plist, pKey); return 1;}voidTravelList (PLIST plist, void (*TRAVEL) (void *)){ PLIST p = plist->pLink; while (p) { TRAVEL (p->pData); p = p->pLink; }}/************************************/intcmplong (void *p1, void *p2){ long *pi1 = (long *) p1; long *pi2 = (long *) p2; return (*pi1 == *pi2);}intFindUid (PLIST plist, long uid){ void **pr = ItemLookup (plist, (void *) &uid, cmplong); if (!pr) return 0; free (pr); return 1;}voidAddUid (PLIST plist, long uid){ long *p; if (FindUid (plist, uid)) return; p = (long *) malloc (sizeof (long)); if (!p) return; *p = uid; InsertList (plist, (void *) p);}voidDelUid (PLIST plist, long uid){ DeleteItem (plist, (void *) &uid, cmplong, NULL);}/************************************/PSERVICEINFONewService (int param, char *s){ static int _num; PSERVICEINFO p = (PSERVICEINFO) malloc (sizeof (SERVICEINFO)); if (!p) return NULL; p->num = _num++; p->param = param; strcpy (p->sername, s); return p;}intcmpsrv (void *p1, void *p2){ PSERVICEINFO p = (PSERVICEINFO) p1; if (strcmp (p->sername, (char *) p2) == 0) return 1; return 0;}PSERVICEINFOFindService (PLIST plist, char *s){ PSERVICEINFO p; void **pr = ItemLookup (plist, (void *) s, cmpsrv); if (!pr) return NULL; p = (PSERVICEINFO) pr[0]; free (pr); return p;}voidAddService (PLIST plist, int param, char *s){ PSERVICEINFO p; if (FindService (plist, s)) return; p = NewService (param, s); if (!p) return; InsertList (plist, (void *) p);}intcmpsrvnum (void *p1, void *p2){ int *pi = (int *) p2; PSERVICEINFO p = (PSERVICEINFO) p1; return (p->num == *pi);}PSERVICEINFOFindServicenum (PLIST plist, int num){ PSERVICEINFO p; void **pr = ItemLookup (plist, (void *) &num, cmpsrvnum); if (!pr) return NULL; p = (PSERVICEINFO) pr[0]; free (pr); return p;}/************************************/PUSERSERVICENewUserService (int pid, u_long serveraddr, uid_t uid, int sernum, u_long clientaddr, time_t time){ PUSERSERVICE p = (PUSERSERVICE) malloc (sizeof (USERSERVICE)); if (!p) return NULL; p->pid = pid; p->serveraddr = serveraddr; p->uid = uid; p->sernum = sernum; p->clientaddr = clientaddr; p->tEnd = 0; p->tStart = time; p->time = 2 * TIMEOUT_IAMALIVE + 1; p->status = 1; return p;}int _pid;intcmpuserservice (void *p1, void *p2){ PUSERSERVICE p = (PUSERSERVICE) p1; u_long *pu = (u_long *) p2; return ((p->pid == _pid) && (p->serveraddr == *pu));}PUSERSERVICEFindUserService (PLIST plist, int pid, u_long serveraddr){ PUSERSERVICE p; void **pr; _pid = pid; if (!(pr = ItemLookup (plist, (void *) &serveraddr, cmpuserservice))) return NULL; p = (PUSERSERVICE) pr[0]; free (pr); return p;}voiddcetimeuserservice (void *pt){ PUSERSERVICE p = (PUSERSERVICE) pt; if (p->time > 0) p->time -= TIMEOUT_IAMALIVE; else p->status = 0;}voidDecTimeUserService (PLIST plist){ TravelList (plist, dcetimeuserservice);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -