|
|
1.1 root 1: /* This routine is the viosubsystem replacement routine for */
2: /* VioWrtTTy. It does nothing but increment counters in shared */
3: /* memory that have been allocated in REGISTER. Access to the shared */
4: /* memory is interleaved with ACCESS, which prints the contents of the */
5: /* counters. */
6: /* */
7: /* Created by Microsoft Corp. 1988 */
8:
9: #define INCL_DOSSEMAPHORES
10: #define INCL_DOSMEMMGR
11:
12: #include <os2def.h>
13: #include <bsedos.h>
14: #include <stdio.h>
15: #include "share.h" /* Common declarations between processes */
16:
17: int _acrtused=0; /* _acrtused must be declared in one of the modules */
18: /* of the dll. The C compiler generates this symbol */
19: /* as an extern to ensure that the runtime library */
20: /* startup module crt0 will be pulled in by the */
21: /* linker. Declaring _acrtused will keep this */
22: /* unwanted code out. */
23:
24: /* The VIO router places the VioWrtTTy parameters on the stack, along */
25: /* with the registered routine's (VioWrtTTy) address and index, the */
26: /* entry point in the VIO router, the caller's DS and the dynamic */
27: /* link entry point. The replacement router places the contents of */
28: /* registers BP and DI on the stack, and then copies the parameters */
29: /* on the stack again. Declaring the replacement routine as pascal */
30: /* allows proper access to the parameters. */
31:
32:
33: int APIENTRY REPLACE(Charstr,length, handle)
34: PCH Charstr; /* These three are the parameters for */
35: USHORT length; /* VioWrtTTy */
36: SHANDLE handle;
37:
38: { SEL Selector; /* Shared memory selector */
39: struct ShareRec far *SmemPtr; /* Shared memory layout, described
40: in Share.h */
41: int rc; /* Return code */
42:
43: DosGetShrSeg(SHRSEGNAME, &Selector);
44:
45: /* Get a far pointer from a 16 bit selector */
46: SmemPtr = (struct ShareRec far *)MAKEP(Selector,0);
47:
48: DosSemRequest((HSEM)&(SmemPtr->mutexsem), WAITFOREVER);
49: SmemPtr->count++;
50:
51: /* Increment the total length, using the length parameter */
52: SmemPtr->totalength += length;
53:
54: /* Updated is set in ACCESS, and cleared here, creating the
55: interleaving */
56: DosSemClear((HSEM)&(SmemPtr->updated));
57: DosSemClear((HSEM)&(SmemPtr->mutexsem));
58:
59: /* Must use DosFreeSeg in order to decrement the reference
60: counter to the shared memory segment. The segment will
61: not be deallocated until the reference count is 0, this
62: will not happen because DosGetShrSeg increments the reference
63: counter, and there is one DosGetShrSeg call in REGISTER. */
64: DosFreeSeg(Selector);
65:
66: /* Returning -1 causes the VIO router to invoke the replaced
67: routine, i.e. VioWrtTTy */
68: return(-1);
69: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.