|
|
1.1 root 1: #include <stdio.h>
2: #include <stdlib.h>
3: #include <stdarg.h>
4: #include <windows.h>
5: #include <string.h>
6: #include <winbase.h>
7: #include "tlsdll.h"
8:
9: #define NUMTHREADS 3 /* The number of threads to start */
10:
11: /*-----------------------------------------------------------------*/
12:
13: void ErrorOut(char errstring[30])
14: /*
15: Purpose: Print out an meainful error code by means of
16: GetLastError and printf
17:
18: Inputs: errstring - the action that failed, passed by the
19: calling proc.
20:
21: Returns: none
22:
23: Calls: GetLastError
24: */
25:
26: {
27: DWORD Error;
28:
29: Error= GetLastError();
30: printf("Error on %s = %d\n", errstring, Error);
31: }
32:
33: /*-----------------------------------------------------------------*/
34:
35: void Another_Thread()
36: /*
37: Purpose: Make a call into a DLL and then terminate, allowing
38: DLL init. and termination to be called.
39:
40: Inputs: none
41:
42: Returns: none
43:
44: Calls: TlsInit: Dummy proc. to allow DLL initialization.
45: */
46:
47: {
48: Sleep(300); /* Sleep while other threads start */
49: TlsInit(); /* Call dummy init. procedure */
50: ExitThread(0); /* Exit, calling DLL termination */
51: }
52:
53: /*-----------------------------------------------------------------*/
54:
55: void main(void)
56: /*
57: Purpose: Make a call into a DLL and then terminate, allowing
58: DLL init. and termination to be called.
59:
60: Inputs: none
61:
62: Returns: none
63:
64: Calls: CreateThread: to create threads for DLL init.
65: ErrorOut: To output any errors
66: WaitForMultipleObjects: To wait on thread(s) termination
67: */
68:
69: {
70: DWORD threadid;
71: HANDLE hThreads[3];
72: int count;
73:
74: /* start NUMTHREADS threads */
75: for (count = 0 ; count < NUMTHREADS ; count++)
76: {
77: hThreads[count]= CreateThread(NULL,
78: 0,
79: (LPTHREAD_START_ROUTINE)Another_Thread,
80: NULL,
81: 0,
82: &threadid);
83: if( hThreads[count] == 0)
84: ErrorOut("CreateThread");
85: else
86: printf("\nStarting thread# %d\n\n", count +1);
87: }
88:
89: /* now wait for threads to terminate */
90: printf("\n\n***** Waiting for %d Threads to Exit*****\n\n", NUMTHREADS);
91: WaitForMultipleObjects( NUMTHREADS,
92: hThreads,
93: FALSE,
94: 0xFFFFFFFF);
95: Sleep(1000);
96: printf("\n\n***** All %d Threads Terminated *****\n\n", NUMTHREADS);
97:
98: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.