Annotation of sbbs/src/xpdev/wraptest.c, revision 1.1

1.1     ! root        1: /* wraptest.c */
        !             2: 
        !             3: /* Verification of cross-platform development wrappers */
        !             4: 
        !             5: /* $Id: wraptest.c,v 1.44 2006/04/21 02:47:43 deuce Exp $ */
        !             6: 
        !             7: #include <time.h>      /* ctime */
        !             8: 
        !             9: #include "genwrap.h"
        !            10: #include "conwrap.h"
        !            11: #include "dirwrap.h"
        !            12: #include "filewrap.h"
        !            13: #include "sockwrap.h"
        !            14: #include "threadwrap.h"
        !            15: #include "xpbeep.h"
        !            16: #include "xpendian.h"
        !            17: 
        !            18: #define LOCK_FNAME     "test.fil"
        !            19: #define LOCK_OFFSET    0
        !            20: #define LOCK_LEN       4
        !            21: 
        !            22: static void getkey(void);
        !            23: static void sem_test_thread(void* arg);
        !            24: static void sem_test_thread_block(void* arg);
        !            25: static void sleep_test_thread(void* arg);
        !            26: static void sopen_test_thread(void* arg);
        !            27: static void sopen_child_thread(void* arg);
        !            28: static void lock_test_thread(void* arg);
        !            29: 
        !            30: 
        !            31: typedef struct {
        !            32:        sem_t parent_sem;
        !            33:        sem_t child_sem;
        !            34: } thread_data_t;
        !            35: 
        !            36: int main()
        !            37: {
        !            38:        char    str[128];
        !            39:        char    compiler[128];
        !            40:        char    fpath[MAX_PATH+1];
        !            41:        char*   path = ".";
        !            42:        char*   glob_pattern = "*wrap*";
        !            43:        int             i;
        !            44:        int             ch;
        !            45:        uint    u;
        !            46:        time_t  t;
        !            47:        glob_t  g;
        !            48:        DIR*    dir;
        !            49:        DIRENT* dirent;
        !            50:        thread_data_t thread_data;
        !            51:        int     fd;
        !            52:        int     fd2;
        !            53:        int     canrelock=0;
        !            54:        clock_t ticks;
        !            55: 
        !            56:        /* Show platform details */
        !            57:        DESCRIBE_COMPILER(compiler);
        !            58:        printf("%-15s: %s\n","Platform",PLATFORM_DESC);
        !            59:        printf("%-15s: %s\n","Version",os_version(str));
        !            60:        printf("%-15s: %s\n","Compiler" ,compiler);
        !            61:        printf("%-15s: %d\n","Random Number",xp_random(1000));
        !            62: 
        !            63:        for(i=0;i<3;i++) {
        !            64:                if(_beginthread(
        !            65:                          sopen_child_thread    /* entry point */
        !            66:                         ,0                                     /* stack size (0=auto) */
        !            67:                         ,(void*)i                              /* data */
        !            68:                         )==(unsigned long)-1)
        !            69:                        printf("_beginthread failed\n");
        !            70:                else
        !            71:                        SLEEP(1);
        !            72:        }
        !            73:        printf("Waiting for all sopen_child_threads to close...\n");
        !            74:        SLEEP(5000);    /* wait for all threads to quit */
        !            75: 
        !            76:        /* Exclusive sopen test */
        !            77:        printf("\nsopen() test\n");
        !            78:        if((fd=sopen(LOCK_FNAME,O_RDWR|O_CREAT,SH_DENYRW,S_IREAD|S_IWRITE))==-1) {
        !            79:                perror(LOCK_FNAME);
        !            80:                return(errno);
        !            81:        }
        !            82:        printf("%s is opened with an exclusive (read/write) lock\n",LOCK_FNAME);
        !            83:        getkey();
        !            84:        if(_beginthread(
        !            85:                  sopen_test_thread     /* entry point */
        !            86:                 ,0                             /* stack size (0=auto) */
        !            87:                 ,NULL                          /* data */
        !            88:                 )==(unsigned long)-1)
        !            89:                printf("_beginthread failed\n");
        !            90:        else
        !            91:                SLEEP(1000);
        !            92:        close(fd);
        !            93: 
        !            94:        /* sopen()/lock test */
        !            95:        printf("\nlock() test\n");
        !            96:        if((fd=sopen(LOCK_FNAME,O_RDWR|O_CREAT,SH_DENYNO,S_IREAD|S_IWRITE))==-1) {
        !            97:                perror(LOCK_FNAME);
        !            98:                return(errno);
        !            99:        }
        !           100:        write(fd,"lock testing\n",LOCK_LEN);
        !           101:        if(lock(fd,LOCK_OFFSET,LOCK_LEN)==0)
        !           102:                printf("lock() succeeds\n");
        !           103:        else
        !           104:                printf("!FAILURE: lock() non-functional (or file already locked)\n");
        !           105:        if(lock(fd,LOCK_OFFSET,LOCK_LEN)==0)  {
        !           106:                printf("!FAILURE: Subsequent lock of region was allowed (will skip some tests)\n");
        !           107:                canrelock=1;
        !           108:        }
        !           109:                
        !           110:        if(_beginthread(
        !           111:                  lock_test_thread      /* entry point */
        !           112:                 ,0                             /* stack size (0=auto) */
        !           113:                 ,NULL                          /* data */
        !           114:                 )==(unsigned long)-1)
        !           115:                printf("_beginthread failed\n");
        !           116:        else
        !           117:                SLEEP(1000);
        !           118:        if(canrelock)
        !           119:                printf("?? Skipping some tests due to inability to detect own locks\n");
        !           120:        else  {
        !           121:                if(lock(fd,LOCK_OFFSET,LOCK_LEN))
        !           122:                        printf("Locks in first thread survive open()/close() in other thread\n");
        !           123:                else
        !           124:                        printf("!FAILURE: lock() in first thread lost by open()/close() in other thread\n");
        !           125:                if(lock(fd,LOCK_OFFSET+LOCK_LEN+1,LOCK_LEN))
        !           126:                        printf("!FAILURE: file locking\n");
        !           127:                else
        !           128:                        printf("Record locking\n");
        !           129:        }
        !           130:        if((fd2=sopen(LOCK_FNAME,O_RDWR,SH_DENYRW))==-1) {
        !           131:                printf("Cannot reopen SH_DENYRW while lock is held\n");
        !           132:                close(fd2);
        !           133:        }
        !           134:        else  {
        !           135:                printf("!FAILURE: can reopen SH_DENYRW while lock is held\n");
        !           136:        }
        !           137:        if(unlock(fd,LOCK_OFFSET,LOCK_LEN))
        !           138:                printf("!FAILURE: unlock() non-functional\n");
        !           139:        if(lock(fd,LOCK_OFFSET+LOCK_LEN+1,LOCK_LEN))
        !           140:                printf("Cannot re-lock after non-overlapping unlock()\n");
        !           141:        else
        !           142:                printf("!FAILURE: can re-lock after non-overlappping unlock()\n");
        !           143:        if(lock(fd,LOCK_OFFSET,LOCK_LEN))
        !           144:                printf("!FAILURE: cannot re-lock unlocked area\n");
        !           145:        close(fd);
        !           146: 
        !           147:        /* getch test */
        !           148:        printf("\ngetch() test (ESC to continue)\n");
        !           149:        do {
        !           150:                ch=getch();
        !           151:                printf("getch() returned %d\n",ch);
        !           152:        } while(ch!=ESC);
        !           153: 
        !           154:        /* kbhit test */
        !           155:        printf("\nkbhit() test (any key to continue)\n");
        !           156:        while(!kbhit()) {
        !           157:                printf(".");
        !           158:                fflush(stdout);
        !           159:                SLEEP(500);
        !           160:        }
        !           161:        getch();        /* remove character from keyboard buffer */
        !           162: 
        !           163:        /* BEEP test */
        !           164:        printf("\nBEEP() test\n");
        !           165:        getkey();
        !           166:        for(i=750;i>250;i-=5)
        !           167:                BEEP(i,15);
        !           168:        for(;i<1000;i+=5)
        !           169:                BEEP(i,15);
        !           170: 
        !           171:        /* SLEEP test */
        !           172:        printf("\nSLEEP(5 second) test\n");
        !           173:        getkey();
        !           174:        t=time(NULL);
        !           175:        printf("sleeping... ");
        !           176:        fflush(stdout);
        !           177:        ticks=msclock();
        !           178:        SLEEP(5000);
        !           179:        printf("slept %ld seconds (%ld according to msclock)\n",time(NULL)-t,(msclock()-ticks)/MSCLOCKS_PER_SEC);
        !           180: 
        !           181:        /* Thread SLEEP test */
        !           182:        printf("\nThread SLEEP(5 second) test\n");
        !           183:        getkey();
        !           184:        i=0;
        !           185:        if(_beginthread(
        !           186:                  sleep_test_thread     /* entry point */
        !           187:                 ,0                                     /* stack size (0=auto) */
        !           188:                 ,&i                            /* data */
        !           189:                 )==(unsigned long)-1)
        !           190:                printf("_beginthread failed\n");
        !           191:        else {
        !           192:                SLEEP(1);                       /* yield to child thread */
        !           193:                while(i==0) {
        !           194:                        printf(".");
        !           195:                        fflush(stdout);
        !           196:                        SLEEP(1000);
        !           197:                }
        !           198:        }
        !           199: 
        !           200:        /* glob test */
        !           201:        printf("\nglob(%s) test\n",glob_pattern);
        !           202:        getkey();
        !           203:        i=glob(glob_pattern,GLOB_MARK,NULL,&g);
        !           204:        if(i==0) {
        !           205:                for(u=0;u<g.gl_pathc;u++)
        !           206:                        printf("%s\n",g.gl_pathv[u]);
        !           207:                globfree(&g);
        !           208:        } else
        !           209:                printf("glob(%s) returned %d\n",glob_pattern,i);
        !           210: 
        !           211:        /* opendir (and other directory functions) test */
        !           212:        printf("\nopendir(%s) test\n",path);
        !           213:        getkey();
        !           214:        printf("\nDirectory of %s\n\n",FULLPATH(fpath,path,sizeof(fpath)));
        !           215:        dir=opendir(path);
        !           216:        while(dir!=NULL && (dirent=readdir(dir))!=NULL) {
        !           217:                t=fdate(dirent->d_name);
        !           218:                printf("%.24s %10lu  %06o  %s%c\n"
        !           219:                        ,ctime(&t)
        !           220:                        ,flength(dirent->d_name)
        !           221:                        ,getfattr(dirent->d_name)
        !           222:                        ,dirent->d_name
        !           223:                        ,isdir(dirent->d_name) ? '/':0
        !           224:                        );
        !           225:        }
        !           226:        if(dir!=NULL)
        !           227:                closedir(dir);
        !           228:        printf("\nFree disk space: %lu kbytes\n",getfreediskspace(path,1024));
        !           229: 
        !           230:        /* Thread (and inter-process communication) test */
        !           231:        printf("\nSemaphore test\n");
        !           232:        getkey();
        !           233:        if(sem_init(&thread_data.parent_sem
        !           234:                ,0 /* shared between processes */
        !           235:                ,0 /* initial count */
        !           236:                )) {
        !           237:                printf("sem_init failed\n");
        !           238:        }
        !           239:        if(sem_init(&thread_data.child_sem
        !           240:                ,0      /* shared between processes */
        !           241:                ,0      /* initial count */
        !           242:                )) {
        !           243:                printf("sem_init failed\n");
        !           244:        }
        !           245:        if(_beginthread(
        !           246:                  sem_test_thread       /* entry point */
        !           247:                 ,0                                     /* stack size (0=auto) */
        !           248:                 ,&thread_data          /* data */
        !           249:                 )==(unsigned long)-1)
        !           250:                printf("_beginthread failed\n");
        !           251:        else {
        !           252:                sem_wait(&thread_data.child_sem);       /* wait for thread to begin */
        !           253:                for(i=0;i<10;i++) {
        !           254:                        printf("<parent>");
        !           255:                        sem_post(&thread_data.parent_sem);
        !           256:                        sem_wait(&thread_data.child_sem);
        !           257:                }
        !           258:                sem_wait(&thread_data.child_sem);       /* wait for thread to end */
        !           259:        }
        !           260:        sem_destroy(&thread_data.parent_sem);
        !           261:        sem_destroy(&thread_data.child_sem);
        !           262: 
        !           263:        printf("\nSemaphore blocking test\n");
        !           264:        getkey();
        !           265:        sem_init(&thread_data.parent_sem
        !           266:                ,0 /* shared between processes */
        !           267:                ,0 /* initial count */
        !           268:                );
        !           269:        sem_init(&thread_data.child_sem
        !           270:                ,0      /* shared between processes */
        !           271:                ,0      /* initial count */
        !           272:                );
        !           273:        if(_beginthread(
        !           274:                  sem_test_thread_block /* entry point */
        !           275:                 ,0                                     /* stack size (0=auto) */
        !           276:                 ,&thread_data          /* data */
        !           277:                 )==(unsigned long)-1)
        !           278:                printf("_beginthread failed\n");
        !           279:        else {
        !           280:                sem_wait(&thread_data.child_sem);       /* wait for thread to begin */
        !           281:                for(i=0;i<10;i++) {
        !           282:                        printf("<parent>");
        !           283:                        SLEEP(5000);
        !           284:                        sem_post(&thread_data.parent_sem);
        !           285:                        sem_wait(&thread_data.child_sem);
        !           286:                }
        !           287:                sem_wait(&thread_data.child_sem);       /* wait for thread to end */
        !           288:        }
        !           289:        printf("\nsem_trywait_block test...");
        !           290:        t=time(NULL);
        !           291:        sem_trywait_block(&thread_data.parent_sem,5000);
        !           292:        printf("\ntimed-out after %ld seconds (should be 5 seconds)\n",time(NULL)-t);
        !           293:        sem_destroy(&thread_data.parent_sem);
        !           294:        sem_destroy(&thread_data.child_sem);
        !           295:        printf("\nendian check...");
        !           296:        memcpy(&i,"\x01\x02\x03\x04",4);
        !           297:        if(LE_LONG(i)==67305985) {
        !           298:                printf("OK!\n");
        !           299:        }
        !           300:        else {
        !           301:                printf("FAILED!\n");
        !           302:        }
        !           303:        return 0;
        !           304: }
        !           305: 
        !           306: static void getkey(void)
        !           307: {
        !           308:        printf("Hit any key to continue...");
        !           309:        fflush(stdout);
        !           310:        getch();
        !           311:        printf("\r%30s\r","");
        !           312:        fflush(stdout);
        !           313: }
        !           314: 
        !           315: static void sleep_test_thread(void* arg)
        !           316: {
        !           317:        time_t t=time(NULL);
        !           318:        printf("child sleeping");
        !           319:        fflush(stdout);
        !           320:        SLEEP(5000);
        !           321:        printf("\nchild awake after %ld seconds\n",time(NULL)-t);
        !           322: 
        !           323:        *(int*)arg=1;   /* signal parent: we're done */
        !           324: }
        !           325: 
        !           326: static void sem_test_thread(void* arg)
        !           327: {
        !           328:        ulong i;
        !           329:        thread_data_t* data = (thread_data_t*)arg;
        !           330: 
        !           331:        printf("sem_test_thread entry\n");
        !           332:        sem_post(&data->child_sem);             /* signal parent: we've started */
        !           333: 
        !           334:        for(i=0;i<10;i++) {
        !           335:                sem_wait(&data->parent_sem);
        !           336:                printf(" <child>\n");
        !           337:                sem_post(&data->child_sem);
        !           338:        }
        !           339: 
        !           340:        printf("sem_test_thread exit\n");
        !           341:        sem_post(&data->child_sem);             /* signal parent: we're done */
        !           342: }
        !           343: 
        !           344: static void sem_test_thread_block(void* arg)
        !           345: {
        !           346:        ulong i;
        !           347:        thread_data_t* data = (thread_data_t*)arg;
        !           348: 
        !           349:        printf("sem_test_thread_block entry\n");
        !           350:        sem_post(&data->child_sem);             /* signal parent: we've started */
        !           351: 
        !           352:        for(i=0;i<10;i++) {
        !           353:                if(sem_trywait_block(&data->parent_sem,500))  {
        !           354:                        printf(" sem_trywait_block() timed out");
        !           355:                        sem_wait(&data->parent_sem);
        !           356:                }
        !           357:                else  {
        !           358:                        printf(" FAILURE: Didn't block");
        !           359:                }
        !           360:                printf(" <child>\n");
        !           361:                sem_post(&data->child_sem);
        !           362:        }
        !           363: 
        !           364:        printf("sem_test_thread_block exit\n");
        !           365:        sem_post(&data->child_sem);             /* signal parent: we're done */
        !           366: }
        !           367: 
        !           368: static void lock_test_thread(void* arg)
        !           369: {
        !           370:        int     fd;
        !           371: 
        !           372:        fd=sopen(LOCK_FNAME,O_RDWR,SH_DENYNO);
        !           373:        if(lock(fd,LOCK_OFFSET,LOCK_LEN)==0)
        !           374:                printf("!FAILURE: Lock not effective between threads\n");
        !           375:        else
        !           376:                printf("Locks effective between threads\n");
        !           377:        close(fd);
        !           378:        fd=sopen(LOCK_FNAME,O_RDWR,SH_DENYNO);
        !           379:        if(lock(fd,LOCK_OFFSET,LOCK_LEN))
        !           380:                printf("Locks survive file open()/close() in other thread\n");
        !           381:        else
        !           382:                printf("!FAILURE: Locks do not survive file open()/close() in other thread\n");
        !           383:        close(fd);
        !           384: }
        !           385: 
        !           386: static void sopen_test_thread(void* arg)
        !           387: {
        !           388:        int fd;
        !           389: 
        !           390:        if((fd=sopen(LOCK_FNAME,O_RDWR,SH_DENYWR))!=-1)
        !           391:                printf("!FAILURE: allowed to reopen with SH_DENYWR\n");
        !           392:        else if((fd=sopen(LOCK_FNAME,O_RDWR,SH_DENYRW))!=-1)
        !           393:                printf("!FAILURE: allowed to reopen with SH_DENYRW\n");
        !           394:        else
        !           395:                printf("reopen disallowed\n");
        !           396: 
        !           397:        if(fd!=-1)
        !           398:                close(fd);
        !           399: }
        !           400: 
        !           401: static void sopen_child_thread(void* arg)
        !           402: {
        !           403:        int fd;
        !           404: 
        !           405:        printf("sopen_child_thread: %d begin\n",(int)arg);
        !           406:        if((fd=sopen(LOCK_FNAME,O_RDWR,SH_DENYRW))!=-1) {
        !           407:                if(arg)
        !           408:                        printf("!FAILURE: was able to reopen in child thread\n");
        !           409:                else {
        !           410:                        SLEEP(5000);
        !           411:                }
        !           412:                close(fd);
        !           413:        } else if(arg==0)
        !           414:                perror(LOCK_FNAME);
        !           415:        printf("sopen_child_thread: %d end\n",(int)arg);
        !           416: }
        !           417: 
        !           418: /* End of wraptest.c */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.