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

1.1       root        1: /*
                      2:  * Example of DOSEXIT usage.
                      3:  *
                      4:  * DOSEXIT can be used to terminate a specific thread, or all threads in
                      5:  * a process. In general, even if your application has just one thread
                      6:  * it is very important to use the "all threads" form of DOSEXIT when
                      7:  * your application terminates. This is because you may call some library
                      8:  * package or run under an environment manager which creates threads on
                      9:  * your behalf, which you are not aware of.
                     10:  *
                     11:  * In this example, the main thread is the first to call DOSEXIT, but calls it
                     12:  * so as to only end the one thread. Whichever of the two remaining threads
                     13:  * first notices that the flag has been set will then call DOSEXIT and
                     14:  * terminate the process.  If f_thread is the one to call DOSEXIT then
                     15:  * the process will return an exit code of 1, and if it is g_thread, an
                     16:  * exit code of 2.
                     17:  *
                     18:  * compile as: cl -Gs -AL -G2 -Lp dosexit.c
                     19:  *
                     20:  * Copyright (C) Microsoft Corp. 1986
                     21:  *
                     22:  */
                     23: 
                     24: #include <malloc.h>
                     25: #include <doscalls.h>
                     26: #include <subcalls.h>
                     27: 
                     28: #define STACK_SIZE     1024
                     29: extern void f_thread(void);
                     30: extern void g_thread(void);
                     31: int flag;
                     32: 
                     33: main()
                     34: {
                     35:        char *stkptr;
                     36:        unsigned thread_id;
                     37:        
                     38:        flag = 0;
                     39: 
                     40:        /* create two subthreads */
                     41:        stkptr = (char *)malloc(STACK_SIZE) + STACK_SIZE;
                     42:        DOSCREATETHREAD(f_thread, &thread_id, stkptr);
                     43:        
                     44:        stkptr = (char *)malloc(STACK_SIZE) + STACK_SIZE;
                     45:        DOSCREATETHREAD(g_thread, &thread_id, stkptr);
                     46:        
                     47:        /* let the sub-threads run for a while */
                     48:        DOSSLEEP(500L);
                     49:        
                     50:        /* exit from this thread only */
                     51:        printf("main thread is now exiting\n");
                     52:        flag = 1;
                     53:        DOSEXIT(0,0);
                     54: }
                     55: 
                     56: void f_thread()
                     57: {
                     58:        /* wait for the global flag to be set */
                     59:        while (flag == 0) {
                     60:                VIOWRTTTY("f_thread, still running\r\n", 25, 0);
                     61:                DOSSLEEP(0L);
                     62:        }
                     63:        
                     64:        /* exit this process (all threads) */
                     65:        VIOWRTTTY("f_thread, now exiting all\r\n", 27, 0);
                     66:        DOSEXIT(1,1);
                     67: }
                     68: 
                     69: void g_thread()
                     70: {
                     71:        /* wait for the global flag to be set */
                     72:        while (flag == 0) {
                     73:                VIOWRTTTY("g_thread, still running\r\n", 25, 0);
                     74:                DOSSLEEP(0L);
                     75:        }
                     76:        
                     77:        /* exit this process (all threads) */
                     78:        VIOWRTTTY("g_thread, now exiting all\r\n", 27, 0);
                     79:        DOSEXIT(1,2);
                     80: }

unix.superglobalmegacorp.com

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