www.pudn.com > ccache.rar > testcache.c


/******************************************************************** 
	created:	2008/01/25 
	filename: 	testcache.c 
	author:		Lichuang 
                 
	purpose:     
*********************************************************************/ 
 
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include  
 
#include "ccache.h" 
 
ccache_t* cache; 
 
int createchild();   
void mainloop(); 
void createrandstring(char* string, int len); 
 
int main() 
{ 
    cache = create_cache(100, sizeof(int), 10, 100, "./testmap", 1); 
    if (NULL == cache) 
    { 
        printf("create_cache error!\n"); 
        return -1; 
    } 
 
#if 1     
    createchild(2); 
#else     
    mainloop(); 
#endif 
 
    return 0; 
} 
 
int createchild(int childnum)  
{ 
    int fd, ischild; 
     
    if (0 < childnum) 
    { 
        ischild = 0; 
 
        while (!ischild)  
        { 
            if (0 < childnum) 
            { 
                switch((fd = fork())) 
                { 
                    case -1:    // fork error 
                    {    
                        return -1; 
                    } 
                    break; 
                    case 0:     // child 
                    { 
                        // 子进程退出循环 
                        printf("[%s] [%s] [%d]: 创建子进程 %d 成功!\n" 
                                , __FILE__ 
                                , __FUNCTION__ 
                                , __LINE__ 
                                , getpid()); 
                        ischild = !0; 
 
                        mainloop(); 
                    } 
                    break; 
                    default:    // parent 
                    { 
                        childnum--; 
                    } 
                    break; 
                } 
            } 
            else 
            { 
                int status; 
 
                if (-1 != (fd = wait(&status))) 
                { 
                    //++childnum; 
                } 
                else 
                { 
                    break; 
                } 
            } 
        } 
 
        if (ischild) 
            return 0; 
    } 
    else 
    { 
        return -1; 
    } 
 
    return 0; 
} 
 
int cmp_fun(const void* data1, const void* data2) 
{ 
    return memcmp(data1, data2, sizeof(char) * 20); 
} 
 
void del_fun(const void* key, const void* data) 
{ 
    int *num = (int*)data; 
    char k[101] = {'\0'}; 
    strncpy(k, key, 100); 
 
    printf("delnode <%s, %d>\n", k, *num); 
} 
 
void update_fun(const void* org, void* data) 
{ 
    int *num = (int*)data; 
    *num = *num + *(int*)org; 
} 
 
void visit_fun(const void* key, void* data) 
{ 
    int *num = (int*)data; 
    char k[101] = {'\0'}; 
    strncpy(k, key, 100); 
 
    printf("visit node <%s, %d>\n", k, *num); 
} 
 
void mainloop() 
{ 
    char string[21]; 
    int num, i, ret; 
 
    srand((unsigned)time(NULL)); 
 
    for (i = 0; i < 100; ++i) 
    { 
        printf("pid = %d, i = %d\n", getpid(), i); 
        createrandstring(string, 20); 
        num = rand(); 
 
        if (0 > (ret = insert_data(string, &num, cache, cmp_fun, del_fun))) 
        { 
            printf("[pid = %d] insert <%s, %d> error!\n", getpid(), string, num); 
            //break; 
        } 
        else 
        { 
            printf("[pid = %d] insert <%s, %d> success!\n", getpid(), string, num); 
 
            num = 1; 
            if (0 <= update_or_insert_data(string, &num, cache, cmp_fun, del_fun, update_fun)) 
            { 
                printf("[pid = %d] update_or_insert <%s, %d> success!\n", getpid(), string, num); 
            } 
 
/* 把以下代码注释掉是为了测试delfun, 因为在节点不够用时需要进行节点的淘汰, 否则可以测试update, del操作             
            int num1, ret1; 
            num = rand() + 123; 
            if (ret != (ret1 = update_data(string, &num, cache, fun1))) 
            { 
                printf("[pid = %d] update <%s, %d> error!\n", getpid(), string, num); 
            } 
            else 
            { 
                printf("[pid = %d] update <%s, %d> success!\n", getpid(), string, num); 
            } 
 
            if (ret != (ret1 = delete_data(string, &num1, cache, fun1)) || num != num1) 
            { 
                printf("[pid = %d] delete <%s, %d> error!\n", getpid(), string, num); 
            } 
            else 
            { 
                printf("[pid = %d] delete <%s, %d> success!\n", getpid(), string, num); 
            } 
*/             
        } 
    } 
 
    printf("begin visit cache\n"); 
    visit_cache(cache, visit_fun); 
    printf("end visit cache\n"); 
 
    printf("pid = %d, test done\n", getpid()); 
} 
 
const char CCH[] = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
 
void createrandstring(char* string, int len) 
{ 
    int x, i; 
    for (i = 0; i < len; ++i) 
    { 
        x = rand() % (sizeof(CCH) - 1);   
         
        string[i] = CCH[x]; 
    } 
 
    string[i] = '\0'; 
}