Ignore:
Timestamp:
Sep 20, 2000, 11:32:58 PM (25 years ago)
Author:
hugh
Message:

Implemented Serial APIs

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/kernel32/wintls.cpp

    r3975 r4285  
    1 /* $Id: wintls.cpp,v 1.11 2000-08-09 18:59:03 sandervl Exp $ */
     1/* $Id: wintls.cpp,v 1.12 2000-09-20 21:32:54 hugh Exp $ */
    22/*
    33 * Win32 TLS API functions
     
    1717#include "exceptutil.h"
    1818
    19 #define DBG_LOCALLOG    DBG_wintls
     19#define DBG_LOCALLOG  DBG_wintls
    2020#include "dbglocal.h"
    2121
    2222//******************************************************************************
    2323//******************************************************************************
    24 void Win32ImageBase::tlsAlloc() //Allocate TLS index for this module
    25 {
    26    if(!tlsAddress) 
    27         return;
     24void Win32ImageBase::tlsAlloc() //Allocate TLS index for this module
     25{
     26   if(!tlsAddress)
     27  return;
    2828
    2929   tlsIndex = TlsAlloc();
    3030   if(tlsIndex >= TLS_MINIMUM_AVAILABLE) {
    31         dprintf(("tlsAttachThread: invalid tlsIndex %x!!!!", tlsIndex));
    32         DebugInt3();
    33         return;         
     31  dprintf(("tlsAttachThread: invalid tlsIndex %x!!!!", tlsIndex));
     32  DebugInt3();
     33  return;
    3434   }
    3535   dprintf(("Win32ImageBase::tlsAlloc (%d) for module %x", tlsIndex, hinstance));
     
    3737//******************************************************************************
    3838//******************************************************************************
    39 void Win32ImageBase::tlsDelete()        //Free TLS index for this module
    40 {
    41    if(!tlsAddress) 
    42         return;
     39void Win32ImageBase::tlsDelete()  //Free TLS index for this module
     40{
     41   if(!tlsAddress)
     42  return;
    4343
    4444   if(tlsIndex >= TLS_MINIMUM_AVAILABLE) {
    45         dprintf(("tlsAttachThread: invalid tlsIndex %x!!!!", tlsIndex));
    46         DebugInt3();
    47         return;         
     45  dprintf(("tlsAttachThread: invalid tlsIndex %x!!!!", tlsIndex));
     46  DebugInt3();
     47  return;
    4848   }
    4949   dprintf(("Win32ImageBase::tlsDestroy (%d) for module %x", tlsIndex, hinstance));
     
    5353//******************************************************************************
    5454//******************************************************************************
    55 void Win32ImageBase::tlsAttachThread()  //setup TLS structures for new thread
     55void Win32ImageBase::tlsAttachThread()  //setup TLS structures for new thread
    5656{
    5757 EXCEPTION_FRAME      exceptFrame;
     
    5959 LPVOID               tibmem;
    6060
    61    if(!tlsAddress) 
    62         return;
     61   if(!tlsAddress)
     62  return;
    6363
    6464   if(tlsIndex >= TLS_MINIMUM_AVAILABLE) {
    65         dprintf(("tlsAttachThread: invalid tlsIndex %x!!!!", tlsIndex));
    66         DebugInt3();
    67         return;         
     65  dprintf(("tlsAttachThread: invalid tlsIndex %x!!!!", tlsIndex));
     66  DebugInt3();
     67  return;
    6868   }
    6969
     
    7777   tibmem = VirtualAlloc(0, tlsTotalSize, MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE);
    7878   if(tibmem == NULL) {
    79         dprintf(("tlsAttachThread: tibmem == NULL!!!!"));
    80         DebugInt3();
    81         return;
     79  dprintf(("tlsAttachThread: tibmem == NULL!!!!"));
     80  DebugInt3();
     81  return;
    8282   }
    8383   memset(tibmem, 0, tlsTotalSize);
     
    8888
    8989   if(tlsCallBackAddr && (ULONG)*tlsCallBackAddr != 0) {
    90         pCallback = tlsCallBackAddr;
    91         while(*pCallback) {
    92                 dprintf(("tlsAttachThread: calling TLS Callback %x", *pCallback));
    93 
    94                 (*pCallback)((LPVOID)hinstance, DLL_THREAD_ATTACH, 0);
    95 
    96                 dprintf(("tlsAttachThread: finished calling TLS Callback %x", *pCallback));
    97                 *pCallback++;
    98         }
     90  pCallback = tlsCallBackAddr;
     91  while(*pCallback) {
     92    dprintf(("tlsAttachThread: calling TLS Callback %x", *pCallback));
     93
     94    (*pCallback)((LPVOID)hinstance, DLL_THREAD_ATTACH, 0);
     95
     96    dprintf(("tlsAttachThread: finished calling TLS Callback %x", *pCallback));
     97    *pCallback++;
     98  }
    9999   }
    100100   return;
     
    102102//******************************************************************************
    103103//******************************************************************************
    104 void Win32ImageBase::tlsDetachThread()  //destroy TLS structures
     104void Win32ImageBase::tlsDetachThread()  //destroy TLS structures
    105105{
    106106 EXCEPTION_FRAME      exceptFrame;
     
    108108 LPVOID tlsmem;
    109109
    110    if(!tlsAddress) 
    111         return;
     110   if(!tlsAddress)
     111  return;
    112112
    113113   dprintf(("Win32ImageBase::tlsDetachThread for module %x, thread id %x", hinstance, GetCurrentThreadId()));
    114114
    115115   if(tlsCallBackAddr && (ULONG)*tlsCallBackAddr != 0) {
    116         pCallback = tlsCallBackAddr;
    117         while(*pCallback) {
    118                 dprintf(("tlsDetachThread: calling TLS Callback %x", *pCallback));
    119 
    120                 (*pCallback)((LPVOID)hinstance, DLL_THREAD_DETACH, 0);
    121 
    122                 dprintf(("tlsDetachThread: finished calling TLS Callback %x", *pCallback));
    123                 *pCallback++;
    124         }
     116  pCallback = tlsCallBackAddr;
     117  while(*pCallback) {
     118    dprintf(("tlsDetachThread: calling TLS Callback %x", *pCallback));
     119
     120    (*pCallback)((LPVOID)hinstance, DLL_THREAD_DETACH, 0);
     121
     122    dprintf(("tlsDetachThread: finished calling TLS Callback %x", *pCallback));
     123    *pCallback++;
     124  }
    125125   }
    126126   tlsmem = TlsGetValue(tlsIndex);
    127127   if(tlsmem) {
    128         VirtualFree(tlsmem, tlsTotalSize, MEM_RELEASE);
     128    VirtualFree(tlsmem, tlsTotalSize, MEM_RELEASE);
    129129   }
    130130   else {
    131         dprintf(("ERROR: tlsDetachThread: tlsmem == NULL!!!"));
     131  dprintf(("ERROR: tlsDetachThread: tlsmem == NULL!!!"));
    132132   }
    133133   TlsFree(tlsIndex);
     
    154154  tibidx = 0;
    155155  if(pdb->tls_bits[0] == 0xFFFFFFFF) {
    156         if(pdb->tls_bits[1] == 0xFFFFFFFF) {
    157                 LeaveCriticalSection(&pdb->crit_section);
    158                 SetLastError(ERROR_NO_MORE_ITEMS);  //TODO: correct error?
    159                 return -1;
    160         }
    161         tibidx = 1;
     156    if(pdb->tls_bits[1] == 0xFFFFFFFF) {
     157      LeaveCriticalSection(&pdb->crit_section);
     158      SetLastError(ERROR_NO_MORE_ITEMS);  //TODO: correct error?
     159    return -1;
     160  }
     161  tibidx = 1;
    162162  }
    163163  for(i=0;i<32;i++) {
    164         mask = (1 << i);
    165         if((pdb->tls_bits[tibidx] & mask) == 0) {
    166                 pdb->tls_bits[tibidx] |= mask;
    167                 index = (tibidx*32) + i;
    168                 break;
    169         }
     164  mask = (1 << i);
     165  if((pdb->tls_bits[tibidx] & mask) == 0) {
     166    pdb->tls_bits[tibidx] |= mask;
     167    index = (tibidx*32) + i;
     168    break;
     169  }
    170170  }
    171171  LeaveCriticalSection(&pdb->crit_section);
     
    200200  tlsidx = 0;
    201201  if(index > 32) {
    202         tlsidx++;
     202  tlsidx++;
    203203  }
    204204  mask = (1 << index);
    205205  if(pdb->tls_bits[tlsidx] & mask) {
    206206        LeaveCriticalSection(&pdb->crit_section);
    207         pdb->tls_bits[tlsidx] &= ~mask;
     207  pdb->tls_bits[tlsidx] &= ~mask;
    208208        thdb->tls_array[index] = 0;
    209209        SetLastError(ERROR_SUCCESS);
    210         return TRUE;
     210  return TRUE;
    211211  }
    212212  LeaveCriticalSection(&pdb->crit_section);
Note: See TracChangeset for help on using the changeset viewer.