亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? tgiglob.c

?? 《Web編程專家指南》
?? C
字號:

/*
 *  Task  Gateway  Interface
 *  A. Montefusco
 *  June 10, 1995
 *
 *
 */

#pragma option -zR_SHAREDATA
#pragma option -zS_SHAREGROUP
#pragma option -zT_SHARECLASS

#include <string.h>
#ifdef _DEBUG
#include <stdio.h>
#endif
#define  INCL_DOSSEMAPHORES
#define  INCL_DOSPROCESS
#define  INCL_DOSMEMMGR
#include <os2.h>
#include "debug.h"
#include "tgi.h"
#include "tgiglob.h"

/*
 *  Shared DLL variables
 *  
 *  Each task using the DLL shares these data
 */


int    nClient = 0;

HMTX   hGlobMutex = NULLHANDLE;

extern HMTX  hLocMutex;

int            nMod = 0;
TGI_MODULE     modTab  [MAX_MOD]  = { "", 0, 0   };

int            nInst = 0;
PROC_INSTANCE  instTab [MAX_INST] = { 0, 0, 0, 0 };

static VOID APIENTRY  _UnloadModule (void);
static void          *_AllocTgiData (TGI_DATA *pData);


long   _TgiRunning (void)
{
   if (hGlobMutex == NULLHANDLE) {
      return TGI_NOT_RUN;
   } else {
      return TGI_OK;
   } /* endif */
}


long   _LockData (void)
{
   if (hGlobMutex == NULLHANDLE) 
      return TGI_NOT_RUN;
   else {
      APIRET  krc;

      if (hLocMutex == NULLHANDLE) {
         hLocMutex = hGlobMutex;

         krc = DosOpenMutexSem (NULL, &hLocMutex);
         TRACE(fprintf (stderr, "DosOpenMutexSem: %d\n", krc););

         if (krc)
            return TGI_LOC_OPEN_SEM;
      }
 
      krc = DosRequestMutexSem (hLocMutex, SEM_INDEFINITE_WAIT);
      TRACE(fprintf (stderr, "DosRequestMutexSem: %d\n", krc););

      if (krc)
         return TGI_REQUEST;
   }
   return TGI_OK;
}

long   _UnLockData (void)
{
   if (hGlobMutex == NULLHANDLE) 
      return TGI_NOT_RUN;
   else {

      if (DosReleaseMutexSem (hLocMutex)) return TGI_LOC_RELEASE_SEM;

   }
   return TGI_OK;
}


long   _InitModule (void)
{
   APIRET  krc;

   if (hGlobMutex == NULLHANDLE) {
      int  i;

      krc = DosCreateMutexSem (0, &hGlobMutex, DC_SEM_SHARED, TRUE);
      TRACE(fprintf (stderr, "DosCreateMutexSem: %d\n", krc););

      // to simulate side effect of first missing _LockData in the server task
      hLocMutex = hGlobMutex;

      krc = DosOpenMutexSem (NULL, &hLocMutex);
      TRACE(fprintf (stderr, "DosOpenMutexSem: %d\n", krc););

      if (krc)
         return TGI_LOC_OPEN_SEM;


      // init all globals data here ....
      for (i=0; i<MAX_MOD; ++i) {

         modTab [i].szName[0]     = '\0';
         modTab [i].pNextInstance = NULL;
         modTab [i].pFn           = NULL;

      } /* endfor */

      /*
       *  Deinit module automatically
       */
      DosExitList (EXLST_ADD, (PFNEXITLIST)_UnloadModule);

      return _UnLockData ();
   } else {
      return TGI_ALREADY_INIT;
   } 
}


static VOID APIENTRY _UnloadModule (void)
{
   if (hGlobMutex != NULLHANDLE) {
      int   i;

      _LockData ();

      // unlock all waiting instances 
   
      for (i=0; i<MAX_MOD; ++i) 
         if (modTab[i].szName[i] != '\0') {

            PROC_INSTANCE  *pInst = modTab [i].pNextInstance;
      
            while (pInst != NULL) {
      
               APIRET  krc;
               ULONG   ulPostCt;
               HEV     hInst = pInst->hInstAva;
      
               krc = DosOpenEventSem (NULL, &hInst);
               TRACE(fprintf (stderr, "DosOpenEventSem: %d\n", krc););
      
               krc = DosPostEventSem (hInst);
               TRACE(fprintf (stderr, "DosPostEventSem: %d\n", krc););
      
               krc = DosCloseEventSem (hInst);
               TRACE(fprintf (stderr, "DosCloseEventSem: %d\n", krc););
      
               pInst = pInst->pNext;
            } 
         }
      DosEnterCritSec ();
      DosReleaseMutexSem (hGlobMutex);
      DosCloseMutexSem (hGlobMutex);
      hGlobMutex = NULLHANDLE;
      DosExitCritSec ();

   } /* endif */
}




/*
 *  Module table management
 *
 */


TGI_MODULE  * _GetFreeMod (void)
{
   int   i;

   for (i=0; i<MAX_MOD; ++i) 
      if (modTab [i].szName[0] == '\0') {
         modTab [i].pNextInstance = NULL; 
         modTab [i].pFn           = NULL; 
         nMod++;
         return &(modTab [i]);
      }

   return NULL;
}

/*
 *   Instance list is scanned and all instaces are freed
 */

long  _DeleteMod (TGI_MODULE *pMod)
{
   int   i;

   for (i=0; i<MAX_MOD; ++i) 
      if (pMod == &(modTab [i])) {

         PROC_INSTANCE  *pInst = modTab [i].pNextInstance;
   
         while (pInst != NULL) {

            PROC_INSTANCE *pTmp = pInst->pNext;

            _DeleteInst (pInst) ;

            pInst = pTmp;
         } 

         modTab[i].szName[i] = '\0';
         modTab [i].pNextInstance = NULL; 
         modTab [i].pFn           = NULL; 
         nMod--;
         return TGI_OK;
      }

   return TGI_MOD_NOT_FOUND;
}


/*
 *  search in module table for pszName
 */

long  _SearchModule (char *pszName, TGI_MODULE **ppMod)
{
   int   i;

   for (i=0; i<MAX_MOD; ++i) 
      if (!strcmp(modTab[i].szName, pszName)) {
         if (ppMod) *ppMod = &(modTab [i]);
         return TGI_OK;
      }
   if (ppMod) *ppMod = NULL;
   return TGI_MOD_NOT_FOUND;
}


/*
 *  Instance table management
 *
 */


PROC_INSTANCE  * _GetFreeInst (void)
{
   int   i;

   for (i=0; i<MAX_INST; ++i)
      if (instTab [i].hInstAva == 0) {
         memset (&(instTab [i]), 0, sizeof(instTab [i]));
         nInst++;
         return &(instTab [i]);
      }

   return NULL;
}


long  _DeleteInst (PROC_INSTANCE *pInst)
{
   int   i;

   for (i=0; i<MAX_INST; ++i)
      if (pInst == &(instTab [i])) {
         memset (&(instTab [i]), 0, sizeof(instTab [i]));
         nInst--;
         return TGI_OK;
      }

   return TGI_INST_NOT_FOUND;
}


/*
 *   Used by server to unlock a instance
 *
 */

long    _UnlockModuleInstance (char *pszName, TGI_DATA *pData)
{
   long  rc;
   TGI_MODULE *pMod;

   _LockData ();
   TRACE(fprintf (stderr, "_UnlockModuleInstance: accessing to global data\n"););

   if ((rc = _SearchModule (pszName, &pMod)) == TGI_OK) {

      /*
       * module found 
       * search a free instance down to the list
       */

      PROC_INSTANCE  *pInst   = pMod->pNextInstance  ;
      void           *pShrMem = _AllocTgiData (pData) ;

      if (pShrMem != NULL) {

         rc = TGI_MODULE_BUSY;
   
         while (pInst != NULL) {
   
            APIRET  krc;
            ULONG   ulPostCt;
            HEV     hInst = pInst->hInstAva;
   
            krc = DosOpenEventSem (NULL, &hInst);
            TRACE(fprintf (stderr, "DosOpenEventSem: %d\n", krc););
   
            krc = DosQueryEventSem (hInst, &ulPostCt);
            TRACE(fprintf (stderr, "DosQueryEventSem: %d\n", krc););
   
            if ((krc == 0) && (ulPostCt == 0)) {
               HMBX            hMbx;
               unsigned int    msgLen;

               // create a mailbox for callback data
               sprintf (pInst->szMbxName, "%p", pInst);
               MbxCreate (pInst->szMbxName, Local, &hMbx);
   
               // initialize pointer to shared memory object
               // that contains callback data
               pInst->pTgiData = (TGI_DATA *) pShrMem;

               // create instance termination semaphore
               pInst->hInstEnded = NULLHANDLE;
               DosCreateEventSem (NULL, &(pInst->hInstEnded), 
                                  DC_SEM_SHARED, FALSE);
   
               // unlock client thread 
               _UnLockData ();
   
               krc = DosPostEventSem (hInst);
               TRACE(fprintf (stderr, "DosPostEventSem: %d\n", krc););
   
               //  extract data from the queue
               // and send them to client
               for (;;) {
                  char  buf [MAX_BIF_LEN];

                  msgLen = sizeof(buf);

                  if ( (MbxGetMsg (hMbx, buf, &msgLen) == MLBX_OK)
                        && (msgLen != 0)
                        && (pData->pSrvFn != NULL) ) {

                     pData->pSrvFn (buf, msgLen, pData->pSrvCbData);

                  } else

                     break;
               } 
               MbxClose (hMbx);

               _LockData ();

               // wait for the external routine termination
               if (!krc) 
                  DosWaitEventSem (pInst->hInstEnded, SEM_INDEFINITE_WAIT);
               
               DosCloseEventSem (pInst->hInstEnded);
   
               pInst = NULL;
               rc = TGI_OK;
   
            } else {
   
               pInst = pInst->pNext;
   
            } /* endif */
   
            krc = DosCloseEventSem (hInst);
            TRACE(fprintf (stderr, "DosCloseEventSem: %d\n", krc););
         } 

         DosFreeMem (pShrMem);

      } else {
         rc = TGI_NO_MEM;
      } /* endif */
   } 
   _UnLockData ();

   return rc;
}

/*
 *  Used by server to built a shared memory block initialized with
 *  request's data
 */

void   *_AllocTgiData (TGI_DATA *pData)
{
   int   len = sizeof (TGI_DATA)                +
               strlen (pData->pszPathInfo ) + 1 +
               strlen (pData->pszQueryInfo) + 1 +
               strlen (pData->pszFormData ) + 1 +
               strlen (pData->pszRedirFile) + 1 ;
   void *pMem;

   APIRET  krc = DosAllocSharedMem (&pMem, NULL, len, PAG_COMMIT   |
                                                      OBJ_GETTABLE |
                                                      PAG_READ     |
                                                      PAG_WRITE
                                   );
   TRACE(fprintf (stderr, "DosAllocSharedMem: %d\n", krc););

   if (!krc) {
      TGI_DATA  *pNew = (TGI_DATA *) pMem;

      pNew->pszPathInfo  = (char *)pMem + sizeof(TGI_DATA);
      pNew->pszQueryInfo = pNew->pszPathInfo + strlen (pData->pszPathInfo)  + 1;
      pNew->pszFormData  = pNew->pszQueryInfo+ strlen (pData->pszQueryInfo) + 1;
      pNew->pszRedirFile = pNew->pszFormData + strlen (pData->pszFormData)  + 1;
                                                       
      strcpy (pNew->pszPathInfo , pData->pszPathInfo );
      strcpy (pNew->pszQueryInfo, pData->pszQueryInfo);
      strcpy (pNew->pszFormData , pData->pszFormData );
      strcpy (pNew->pszRedirFile, pData->pszRedirFile);

      return pMem;

   } else {
      return NULL;
   } /* endif */
}



/*
 *  Error message table
 *
 */

typedef struct {
   long   errCode;
   char  *pszMsg;
} TGI_ERROR;

TGI_ERROR ErrTab [] = {

  { TGI_OK              , "No error              " },
  { TGI_EXIT            , "Exiting               " },
  { TGI_UNLOCK          , "Unlock client         " },
  { TGI_NOT_RUN         , "TGI not running       " },
  { TGI_LOC_OPEN_SEM    , "TGI_LOC_OPEN_SEM      " },
  { TGI_REQUEST         , "TGI_REQUEST           " },
  { TGI_ALREADY_INIT    , "TGI_ALREADY_INIT      " },
  { TGI_LOC_RELEASE_SEM , "TGI_LOC_RELEASE_SEM   " },
  { TGI_TOO_MANY_MOD    , "TGI_TOO_MANY_MOD      " },
  { TGI_BAD_PARAM       , "TGI_BAD_PARAM         " },
  { TGI_UNLOCK_OK       , "TGI_UNLOCK_OK         " },
  { TGI_MOD_NOT_FOUND   , "TGI_MOD_NOT_FOUND     " },
  { TGI_BAD_INSTANCE    , "TGI_BAD_INSTANCE      " },
  { TGI_SEM_CREATE      , "TGI_SEM_CREATE        " },
  { TGI_UNLOCK_ERROR    , "TGI_UNLOCK_ERROR      " },
  { TGI_MOD_ALREADY_REG , "Module already registe" },
  { TGI_INST_NOT_FOUND  , "TGI_INST_NOT_FOUND    " },
  { TGI_MODULE_BUSY     , "No free instance found" },
  { TGI_NOT_INIT        , "TGI not initialized   " },
  { TGI_NO_MEM          , "Insufficient memory   " },
  { TGI_MLBX_OPEN       , "Callback mailbox open " }
};


char  *TgiStrError ( long tgiErr )
{
   int   i;

   for (i=0; i<(sizeof(ErrTab)/sizeof(ErrTab[0])); ++i)
      if (ErrTab [i].errCode == tgiErr)
         return ErrTab [i].pszMsg;
      
   return "Unknow error code";
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美性受xxxx黑人xyx性爽| 国产成人av一区二区| 国产精品成人一区二区三区夜夜夜| 日韩欧美中文字幕制服| 欧美三级视频在线| 欧美视频一二三区| 在线精品视频免费观看| 欧美撒尿777hd撒尿| 欧美在线免费播放| 制服.丝袜.亚洲.另类.中文| 欧美日本视频在线| 日韩精品中文字幕在线不卡尤物| 欧美一区二区网站| 精品国产一区二区精华| 久久精品在这里| 国产精品色哟哟网站| 亚洲视频一区二区免费在线观看 | 亚洲午夜电影在线| 亚洲精品免费视频| 日韩精品午夜视频| 国内精品国产成人国产三级粉色 | 中文字幕亚洲不卡| 亚洲日本成人在线观看| 一区二区三区精品久久久| 亚洲超碰精品一区二区| 精品综合免费视频观看| 成人听书哪个软件好| jvid福利写真一区二区三区| 日本丶国产丶欧美色综合| 宅男噜噜噜66一区二区66| 日韩精品一区二区三区中文不卡 | 99视频超级精品| 欧美午夜精品电影| 久久久美女毛片| 一区二区在线看| 精品在线你懂的| 91黄色免费看| 国产亚洲自拍一区| 亚洲国产精品精华液网站| 国内精品免费在线观看| 欧美天堂亚洲电影院在线播放| 日韩欧美国产三级| 亚洲人成网站色在线观看| 美女视频免费一区| 色94色欧美sute亚洲线路一ni | 精品一区免费av| 91丨九色丨蝌蚪富婆spa| 日韩欧美在线1卡| 亚洲伦在线观看| 国产乱码精品一品二品| 欧美色视频一区| 中文字幕日韩精品一区| 精品亚洲aⅴ乱码一区二区三区| 色哟哟在线观看一区二区三区| 2020日本不卡一区二区视频| 舔着乳尖日韩一区| 91在线观看免费视频| 国产午夜精品久久久久久免费视| 视频一区视频二区中文| 色哟哟欧美精品| 国产精品久久久久影院亚瑟| 久久精品国产亚洲一区二区三区| 91猫先生在线| 中文字幕日韩一区二区| 国产美女一区二区三区| 日韩一区二区三区免费观看| 亚洲高清视频中文字幕| 91视频www| 国产精品国产三级国产有无不卡| 韩国av一区二区三区在线观看| 欧美高清dvd| 亚洲va中文字幕| 欧美亚洲动漫精品| 一区二区免费在线播放| 99re这里只有精品6| 国产精品嫩草影院av蜜臀| 岛国av在线一区| 中文字幕一区二区三区蜜月| 91在线看国产| 一区二区久久久久| 欧美色爱综合网| 丝袜亚洲另类丝袜在线| 日本成人在线视频网站| 在线播放国产精品二区一二区四区| 亚洲女厕所小便bbb| 在线亚洲一区二区| 亚洲国产欧美在线| 日韩一区二区三区电影在线观看| 美女一区二区在线观看| 日韩免费成人网| 国产精品99久久久久久有的能看| 国产日韩精品久久久| 99久久精品免费看国产免费软件| 自拍偷自拍亚洲精品播放| 欧美主播一区二区三区美女| 免费在线欧美视频| 精品日本一线二线三线不卡| 国产美女视频一区| 国产精品二三区| 欧美日韩一区高清| 九九久久精品视频| 国产精品久久久久一区| 欧美色图第一页| 精品一二线国产| 自拍偷拍亚洲综合| 在线不卡免费av| 成人国产免费视频| 水蜜桃久久夜色精品一区的特点| 亚洲精品一区二区三区在线观看| 不卡视频一二三四| 亚洲一区二区精品3399| 久久新电视剧免费观看| 日本精品视频一区二区三区| 美女网站视频久久| 亚洲蜜桃精久久久久久久| 91麻豆精品国产自产在线观看一区 | 亚洲国产毛片aaaaa无费看 | 成人午夜精品在线| 午夜视黄欧洲亚洲| 欧美精彩视频一区二区三区| 欧美探花视频资源| 国产精品1区2区3区| 亚洲v中文字幕| 日韩一区日韩二区| 欧美成人伊人久久综合网| av在线播放一区二区三区| 久久丁香综合五月国产三级网站| 一色桃子久久精品亚洲| 欧美精品一区二区精品网| 欧美日韩国产高清一区| 91小视频在线| 国产成人免费xxxxxxxx| 老汉av免费一区二区三区 | 日韩精品一区二区三区四区视频 | 麻豆中文一区二区| 亚洲一级二级在线| 自拍偷拍国产精品| 国产视频视频一区| 欧美不卡123| 日韩午夜激情免费电影| 在线观看av不卡| 91一区二区在线| 国产成人综合亚洲网站| 麻豆成人在线观看| 免费在线观看视频一区| 日韩中文字幕av电影| 亚洲柠檬福利资源导航| 自拍视频在线观看一区二区| 国产精品久久久久久久久快鸭 | 国产福利精品一区二区| 国内不卡的二区三区中文字幕| 蜜臀久久99精品久久久画质超高清| 香蕉影视欧美成人| 国内精品久久久久影院一蜜桃| 日韩有码一区二区三区| 七七婷婷婷婷精品国产| 人人狠狠综合久久亚洲| 琪琪久久久久日韩精品| 日本亚洲欧美天堂免费| 理论电影国产精品| 国产乱码字幕精品高清av | 日韩欧美亚洲国产精品字幕久久久 | 欧美片在线播放| 91美女片黄在线观看91美女| 成人开心网精品视频| 91亚洲精品久久久蜜桃网站 | 精品奇米国产一区二区三区| 欧美日韩精品系列| 日韩视频一区二区三区在线播放 | 日韩免费一区二区| 日韩亚洲欧美在线| 日韩精品一区二区三区四区| 国产亚洲精品资源在线26u| 久久影院午夜片一区| 国产午夜精品美女毛片视频| 色噜噜狠狠成人中文综合| 欧美日韩午夜在线| 7777精品伊人久久久大香线蕉完整版 | 91官网在线免费观看| 91麻豆swag| 欧美在线观看你懂的| 精品国产91亚洲一区二区三区婷婷| 精品国产一区二区亚洲人成毛片| 久久视频一区二区| 中文字幕在线观看不卡| 一区二区三区四区视频精品免费| 日本一道高清亚洲日美韩| 免费黄网站欧美| 成人深夜视频在线观看| 色综合久久久久综合体桃花网| 欧美三级在线视频| 91精品国产全国免费观看| 久久久精品黄色| 亚洲免费观看视频| 日本午夜精品视频在线观看| www..com久久爱| 欧美日韩午夜在线视频| 亚洲精品在线免费观看视频| 久久久99久久精品欧美| 日韩精品电影在线观看|