Changeset 125 for trunk/src/kernel32


Ignore:
Timestamp:
Jun 19, 1999, 7:58:50 PM (26 years ago)
Author:
sandervl
Message:

More TIB changes

Location:
trunk/src/kernel32
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/kernel32/makefile

    r114 r125  
    1 # $Id: makefile,v 1.6 1999-06-17 21:52:01 phaller Exp $
     1# $Id: makefile,v 1.7 1999-06-19 17:58:32 sandervl Exp $
    22
    33#
     
    125125thread.OBJ: \
    126126    .\thread.cpp \
     127    $(PDWIN32_INCLUDE)\wprocess.h \
    127128    thread.h
    128129
     
    172173    $(PDWIN32_INCLUDE)\winimage.h \
    173174    $(PDWIN32_INCLUDE)\versionos2.h \
     175    $(PDWIN32_INCLUDE)\wprocess.h \
    174176    console2.h \
    175177    cio.h \
  • trunk/src/kernel32/os2util.cpp

    r123 r125  
    1 /* $Id: os2util.cpp,v 1.4 1999-06-19 13:57:51 sandervl Exp $ */
     1/* $Id: os2util.cpp,v 1.5 1999-06-19 17:58:32 sandervl Exp $ */
    22
    33/*
     
    284284}
    285285//******************************************************************************
    286 //******************************************************************************
     286//Allocate local thread memory
     287//******************************************************************************
     288ULONG OS2AllocThreadLocalMemory(int nrdwords)
     289{
     290 APIRET rc;
     291 PULONG thrdaddr;
     292
     293   rc = DosAllocThreadLocalMemory(nrdwords, &thrdaddr);
     294   if(rc) {
     295        dprintf(("DosAllocThreadLocalMemory failed %d", rc));
     296        return 0;
     297   }
     298   return (ULONG)thrdaddr;
     299}
     300//******************************************************************************
     301//******************************************************************************
     302
  • trunk/src/kernel32/os2util.h

    r123 r125  
    1 /* $Id: os2util.h,v 1.4 1999-06-19 13:57:51 sandervl Exp $ */
     1/* $Id: os2util.h,v 1.5 1999-06-19 17:58:33 sandervl Exp $ */
    22
    33/*
     
    5959ULONG OS2GetPIB(int piboff);
    6060
     61ULONG OS2AllocThreadLocalMemory(int nrdwords);
     62
    6163#ifdef __cplusplus
    6264      }
  • trunk/src/kernel32/thread.H

    r99 r125  
    1 /* $Id: thread.H,v 1.3 1999-06-10 19:11:31 phaller Exp $ */
     1/* $Id: thread.H,v 1.4 1999-06-19 17:58:33 sandervl Exp $ */
    22
    33/*
     
    2222{
    2323public:
    24     Win32Thread(LPTHREAD_START_ROUTINE pUserCallback, LPVOID lpData);
     24    Win32Thread(LPTHREAD_START_ROUTINE pUserCallback, LPVOID lpData, DWORD dwFlags);
    2525    ~Win32Thread();
    2626
     
    3030 LPVOID      lpUserData;
    3131 LPTHREAD_START_ROUTINE pCallback;
     32 DWORD       dwFlags;
     33
    3234 friend static DWORD OPEN32API Win32ThreadProc(LPVOID lpData);
    3335};
  • trunk/src/kernel32/thread.cpp

    r34 r125  
    1 /* $Id: thread.cpp,v 1.4 1999-06-02 16:00:38 cbratschi Exp $ */
     1/* $Id: thread.cpp,v 1.5 1999-06-19 17:58:33 sandervl Exp $ */
    22
    33/*
     
    1717#include "except.h"
    1818#include "misc.h"
     19#include <wprocess.h>
    1920
    2021static DWORD OPEN32API Win32ThreadProc(LPVOID lpData);
     
    2425//******************************************************************************
    2526HANDLE WIN32API CreateThread(LPSECURITY_ATTRIBUTES lpsa, DWORD cbStack,
    26                    LPTHREAD_START_ROUTINE lpStartAddr,
    27                    LPVOID lpvThreadParm, DWORD fdwCreate,
    28                    LPDWORD lpIDThread)
     27                             LPTHREAD_START_ROUTINE lpStartAddr,
     28                             LPVOID lpvThreadParm, DWORD fdwCreate,
     29                             LPDWORD lpIDThread)
    2930{
    30  Win32Thread *winthread = new Win32Thread(lpStartAddr, lpvThreadParm);
     31 Win32Thread *winthread = new Win32Thread(lpStartAddr, lpvThreadParm, fdwCreate);
    3132
    3233  if(winthread == 0)
     
    122123           exitcode));
    123124
     125#ifdef WIN32_TIBSEL
     126  DestroyTIB();
     127#endif
    124128  O32_ExitThread(exitcode);
    125129}
    126130//******************************************************************************
    127131//******************************************************************************
    128 Win32Thread::Win32Thread(LPTHREAD_START_ROUTINE pUserCallback, LPVOID lpData)
     132Win32Thread::Win32Thread(LPTHREAD_START_ROUTINE pUserCallback, LPVOID lpData, DWORD dwFlags)
    129133{
    130134  lpUserData = lpData;
    131135  pCallback  = pUserCallback;
     136  this->dwFlags = dwFlags;
    132137}
    133138//******************************************************************************
     
    153158  delete me;    //only called once
    154159
    155   dprintf(("Win32ThreadProc %d\n",
    156            GetCurrentThreadId()));
     160  dprintf(("Win32ThreadProc %d\n", GetCurrentThreadId()));
    157161
     162#ifdef WIN32_TIBSEL
     163#else
    158164  ReplaceExceptionHandler();
     165#endif
    159166  return(winthread(userdata));
    160167}
  • trunk/src/kernel32/wprocess.cpp

    r123 r125  
    1 /* $Id: wprocess.cpp,v 1.9 1999-06-19 13:57:51 sandervl Exp $ */
     1/* $Id: wprocess.cpp,v 1.10 1999-06-19 17:58:33 sandervl Exp $ */
    22
    33/*
     
    3838PDB       ProcessPDB = {0}; 
    3939USHORT    ProcessTIBSel = 0;
    40 USHORT    OS2Selector   = 0;
    41 
    42 //#define WIN32_TIBSEL
     40DWORD    *TIBFlatPtr    = 0;
     41
    4342//******************************************************************************
    4443// Set up the TIB selector and memory for the current thread
     
    5251  USHORT tibsel;
    5352
     53   //Allocate one dword to store the flat address of our TEB
     54   TIBFlatPtr = (DWORD *)OS2AllocThreadLocalMemory(1);
     55   if(TIBFlatPtr == 0) {
     56        dprintf(("InitializeTIB: local thread memory alloc failed!!"));
     57        DebugInt3();
     58        return;
     59   }
    5460   if(OS2AllocSel(PAGE_SIZE, &tibsel) == FALSE)
    5561   {
     
    6672   }
    6773   memset(winteb, 0, PAGE_SIZE);
    68    thdb = (THDB *)(winteb+1);
     74   thdb       = (THDB *)(winteb+1);
     75   TIBFlatPtr = (DWORD)winteb;
    6976
    7077   winteb->except      = (PVOID)-1;               /* 00 Head of exception handling chain */
     
    8390   thdb->exit_code       = 0x103; /* STILL_ACTIVE */
    8491   thdb->teb_sel         = tibsel;
     92   thdb->OrgTIBSel       = GetFS();
    8593
    8694   if(OS2GetPIB(PIB_TASKTYPE) == TASKTYPE_PM)
     
    96104        //TLS in executable always TLS index 0?
    97105        ProcessTIBSel = tibsel;
    98         OS2Selector   = GetFS();        //0x150b
    99106   }
    100107   SetFS(tibsel);
     
    108115void DestroyTIB()
    109116{
     117#ifdef WIN32_TIBSEL
     118 SHORT  orgtibsel;
     119 TEB   *winteb;
     120 THDB  *thdb;
     121
    110122   dprintf(("DestroyTIB: FS = %x", GetFS()));
    111 #ifdef WIN32_TIBSEL
    112    OS2FreeSel(ProcessTIBSel);
     123
     124   winteb = (TEB *)TIBFlatPtr;
     125   if(winteb) {
     126        thdb = (THDB *)(winteb+1);
     127        orgtibsel = thdb->OrgTIBSel;
     128
     129        //Restore our original FS selector
     130        SetFS(orgtibsel);
     131
     132        //And free our own
     133        OS2FreeSel(thdb->teb_sel);
     134   }
     135   else DebugInt3();
     136
    113137   return;
    114138#endif
     
    254278#ifdef WIN32_TIBSEL
    255279  //Restore original OS/2 TIB selector
    256   SetFS(OS2Selector);
     280  DestroyTIB();
    257281#endif
    258282
Note: See TracChangeset for help on using the changeset viewer.