Annotation of os2sdk/demos/examples/argument/argument.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * argument.c
                      3:  *
                      4:  * This program demonstrated a method of passing parameters to a thread.
                      5:  * Since Intel stacks grow down (High to low memory), and the PUSH instruction
                      6:  * decrements the pointer BEFORE writing to the stack, we do the same in C.
                      7:  *
                      8:  * The decrement before writing is important since the line:
                      9:  *
                     10:  *     threadStack += STACK_SIZE
                     11:  *
                     12:  * will place the pointer one element BEYOND the end of the stack.
                     13:  *
                     14:  * Also note that the stack is defined as a WORD array.  This is so the
                     15:  * decrement operator will adjust the stack by 2 with each push.
                     16:  *
                     17:  * One last caveat: what the thread expects upon the stack depends upon
                     18:  * how each argument is declared and the model that the program is being
                     19:  * compiled in.  KNOW YOUR C STACK STRUCTURE!
                     20:  *
                     21:  * Many of the C runtime library routines, including printf, are not
                     22:  * re-entrant. DOSENTERCRITSEC & DOSEXITCRITSEC guarantee serial access
                     23:  * to the screen.
                     24:  *
                     25:  */
                     26: #include <doscalls.h>
                     27: #include <stdio.h>
                     28: 
                     29: #define STACK_SIZE 256    /* stack size in WORDS (see malloc) */
                     30: 
                     31: main(ac, av)
                     32: char *av[];
                     33: int ac;
                     34: {
                     35:     void far thread();         /* address where thread gets control */
                     36:     int far *threadStack;      /* far pointer to thread stack (word)*/
                     37:     unsigned threadID;         /* thread ID */
                     38:     unsigned rc;               /* return code */
                     39: 
                     40:     /* allocate stack space for thread */
                     41:     /* since this is written in C, DOSALLOCSEG cannot be used here */
                     42: 
                     43:     if ((threadStack = (int *)malloc(sizeof(int) * STACK_SIZE)) == NULL) {
                     44:        printf("thread stack malloc failed\n");
                     45:        DOSEXIT(1, 1);  /* terminate all threads and return error */
                     46:     }
                     47:     threadStack += STACK_SIZE;         /* since stack grows down */
                     48: 
                     49:     *--threadStack = 0xFFFF;           /* Arg #5 = FFFF */
                     50:     *--threadStack = 0xEEEE;           /* Arg #4 ...    */
                     51:     *--threadStack = 0xDDDD;           /* Arg #3        */
                     52:     *--threadStack = 0xCCCC;
                     53:     *--threadStack = 0xBBBB;
                     54: 
                     55:     if (rc = DOSCREATETHREAD(thread, (unsigned far *)&threadID,
                     56:        (char far *)threadStack)) {
                     57:        printf("create of thread failed, error: %d\n", rc);
                     58:        DOSEXIT(1, 1);
                     59:     }
                     60:     DOSENTERCRITSEC();
                     61:     printf("Thread ID = %d\n", threadID);
                     62:     DOSEXITCRITSEC();
                     63: 
                     64:     DOSEXIT(0, 0);             /* Terminate, Let the other thread run */
                     65: }
                     66: 
                     67: 
                     68: /*
                     69:  * Thread process expects 5 arguments on the stack (normal C calling
                     70:  * convention).
                     71:  */
                     72: void far
                     73: thread(a1,a2,a3,a4,a5)
                     74: int a1,a2,a3,a4,a5;
                     75: {
                     76:     DOSENTERCRITSEC();
                     77:     printf("Argument 1 = %x\n", a1);
                     78:     DOSEXITCRITSEC();
                     79: 
                     80:     DOSENTERCRITSEC();
                     81:     printf("Argument 2 = %x\n", a2);
                     82:     DOSEXITCRITSEC();
                     83: 
                     84:     DOSENTERCRITSEC();
                     85:     printf("Argument 3 = %x\n", a3);
                     86:     DOSEXITCRITSEC();
                     87: 
                     88:     DOSENTERCRITSEC();
                     89:     printf("Argument 4 = %x\n", a4);
                     90:     DOSEXITCRITSEC();
                     91: 
                     92:     DOSENTERCRITSEC();
                     93:     printf("Argument 5 = %x\n", a5);
                     94:     DOSEXITCRITSEC();
                     95: 
                     96:     DOSEXIT(0,0);
                     97: }

unix.superglobalmegacorp.com

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