home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1996 February / PCWK0296.iso / po7_win / object10 / ssora.cpp < prev    next >
C/C++ Source or Header  |  1994-12-21  |  3KB  |  129 lines

  1. /* Copyright (c) Oracle Corporation 1994.  All Rights Reserved */
  2.  
  3. /*
  4.     This source code is provided as a debugging aid for developers
  5.     who have purchased Oracle Objects for OLE    .  Please see the
  6.     online help for documentation of these classes.
  7. */
  8.  
  9. /*
  10.     Oracle Objects for OLE     C++ Classes
  11.     
  12.     This file implements a global memory handler
  13.                            
  14.     CREATED    ********   11/22/94
  15.  
  16. */
  17.  
  18. #include <windows.h>
  19. #include <memory.h>
  20.  
  21. #include <ole2.h>
  22. #include <olenls.h>       
  23. #include <dispatch.h>  
  24.  
  25. #ifndef ORACL_ORACLE
  26. #include "oracl.h"
  27. #endif
  28.  
  29. #ifndef ORAOBJI_ORACLE
  30. #include "oraobji.h"
  31. #endif
  32.  
  33. struct orauga
  34. {
  35.   char signature[6];
  36.   HANDLE taskid;
  37.   oglobal globalstate;
  38. };
  39.  
  40. #define MAX_TASKS 255
  41. static orauga *ugaptr[MAX_TASKS] = {0};
  42. static HANDLE tasklist[MAX_TASKS] = {0};
  43.  
  44. static char *tagstr = "OO4W71";
  45.  
  46. // ----- ssoo4walloc -----------------------------------------------
  47.  
  48. orauga *ssoo4walloc()
  49. {
  50.   HANDLE  taskid;
  51.   int     index;
  52.  
  53.   taskid = GetCurrentTask();                      /* get the current task id */
  54.  
  55.   /* see if we've already allocated a UGA for this taskid */
  56.   for (index = 0; index < MAX_TASKS ; index++)
  57.   {
  58.     if (taskid != tasklist[index]) continue;
  59.  
  60.     /* OK...taskid == tasklist[index].  Now, make sure ugaptr[index]
  61.        is a pointer to valid memory, and make sure that our signature
  62.        [tagstr] is at the beginning.   */
  63.     if (IsBadWritePtr(ugaptr[index], sizeof(struct orauga) - 1) ||
  64.         memcmp(ugaptr[index], tagstr, 6) ||
  65.         ugaptr[index]->taskid != taskid)
  66.     {
  67.       /* oops..didn't verify.  Windows must be reusing the task
  68.       handle from before. Clear out this entry, set index ==
  69.       MAX_TASKS, and continue */
  70.  
  71.       tasklist[index] = 0;
  72.       ugaptr[index] = (struct orauga *)0;
  73.       index = MAX_TASKS;
  74.       break;
  75.     }
  76.     else
  77.       break;                                   /* everything's cool...return */
  78.   }
  79.  
  80.   if (index == MAX_TASKS)                   /* if we're not in the list .... */
  81.   {                                         /*  .... allocate and initialize */
  82.  
  83.     for (index = 0; index < MAX_TASKS; index++)       /* find 1st free entry */
  84.       if (!tasklist[index])
  85.         break;
  86.     tasklist[index] = taskid;
  87.     ugaptr[index] = new orauga; 
  88.     
  89.     // clear the new structure
  90.     memset(ugaptr[index], 0, sizeof(orauga));
  91.     
  92.     // tag the structure
  93.     memcpy(ugaptr[index], tagstr, 6);
  94.     
  95.     ugaptr[index]->taskid = taskid;
  96.   }
  97.  
  98.   return(ugaptr[index]);                        /* return pointer to the UGA */
  99. }
  100.  
  101. // ----- ssoo4wfree -----------------------------------------------
  102. void ssoo4wfree()
  103. {
  104.   HANDLE taskid;
  105.   int index;
  106.  
  107.   taskid = GetCurrentTask();
  108.  
  109.   for (index = 0; index < MAX_TASKS; index++)
  110.   {
  111.     if (tasklist[index] == taskid && ugaptr[index])
  112.     {
  113.       delete ugaptr[index];
  114.       tasklist[index] = 0;
  115.       ugaptr[index] = (struct orauga *)0;
  116.       break;
  117.     }
  118.   }
  119. }
  120.  
  121. // ----- ssoo4wGetGlobal -----------------------------------------------
  122. oglobal *ssoo4wGetGlobal(void)
  123. {
  124.     orauga *gp = ssoo4walloc();
  125.     return(&gp->globalstate);
  126. }
  127.  
  128.  
  129.