Changed initial process creation to avoid memory allocations.
Removed a few unused fields in PDB and THDB.
This commit is contained in:
parent
13e55192b9
commit
214399f283
|
@ -81,7 +81,7 @@ typedef struct _PDB32
|
|||
HANDLE_TABLE *handle_table; /* 44 Handle table */
|
||||
struct _PDB32 *parent; /* 48 Parent process */
|
||||
WINE_MODREF *modref_list; /* 4c MODREF list */
|
||||
struct _THREAD_ENTRY *thread_list; /* 50 List of threads */
|
||||
void *thread_list; /* 50 List of threads */
|
||||
void *debuggee_CB; /* 54 Debuggee context block */
|
||||
void *local_heap_free; /* 58 Head of local heap free list */
|
||||
DWORD unknown4; /* 5c Unknown */
|
||||
|
@ -132,9 +132,6 @@ extern void ENV_FreeEnvironment( PDB32 *pdb );
|
|||
extern BOOL32 HANDLE_CreateTable( PDB32 *pdb, BOOL32 inherit );
|
||||
extern HANDLE32 HANDLE_Alloc( PDB32 *pdb, K32OBJ *ptr, DWORD access,
|
||||
BOOL32 inherit, int server_handle );
|
||||
extern K32OBJ *HANDLE_GetObjPtr( PDB32 *pdb, HANDLE32 handle,
|
||||
K32OBJ_TYPE type, DWORD access,
|
||||
int *server_handle );
|
||||
extern int HANDLE_GetServerHandle( PDB32 *pdb, HANDLE32 handle,
|
||||
K32OBJ_TYPE type, DWORD access );
|
||||
extern void HANDLE_CloseAll( PDB32 *pdb, K32OBJ *ptr );
|
||||
|
|
|
@ -8,9 +8,8 @@
|
|||
#define __WINE_THREAD_H
|
||||
|
||||
#include "config.h"
|
||||
#include "k32obj.h"
|
||||
#include "winbase.h"
|
||||
#include "winnt.h"
|
||||
#include "k32obj.h"
|
||||
#include "selectors.h" /* for SET_FS */
|
||||
|
||||
#ifdef linux
|
||||
|
@ -56,15 +55,6 @@ typedef struct _TEB
|
|||
#define TEBF_WIN32 0x0001
|
||||
#define TEBF_TRAP 0x0002
|
||||
|
||||
/* Event waiting structure */
|
||||
typedef struct
|
||||
{
|
||||
DWORD count; /* Count of valid objects */
|
||||
BOOL32 wait_all; /* Wait for all objects flag */
|
||||
K32OBJ *objs[MAXIMUM_WAIT_OBJECTS]; /* Object pointers */
|
||||
int server[MAXIMUM_WAIT_OBJECTS]; /* Server handles */
|
||||
} WAIT_STRUCT;
|
||||
|
||||
/* Thread database */
|
||||
typedef struct _THDB
|
||||
{
|
||||
|
@ -77,7 +67,7 @@ typedef struct _THDB
|
|||
WORD teb_sel; /* 4c Selector to TEB */
|
||||
WORD emu_sel; /* 4e 80387 emulator selector */
|
||||
int thread_errno; /* 50 Per-thread errno (was: unknown) */
|
||||
WAIT_STRUCT *wait_list; /* 54 Event waiting list */
|
||||
void *wait_list; /* 54 Event waiting list */
|
||||
int thread_h_errno; /* 50 Per-thread h_errno (was: unknown) */
|
||||
void *ring0_thread; /* 5c Pointer to ring 0 thread */
|
||||
void *ptdbx; /* 60 Pointer to TDBX structure */
|
||||
|
@ -102,29 +92,17 @@ typedef struct _THDB
|
|||
DWORD suspend_count; /* 1bc SuspendThread() counter */
|
||||
void *entry_point; /* 1c0 Thread entry point (was: unknown) */
|
||||
void *entry_arg; /* 1c4 Entry point arg (was: unknown) */
|
||||
int unix_pid; /* 1c8 Unix thread pid (was: unknown) */
|
||||
DWORD unknown5[3]; /* 1cc Unknown */
|
||||
DWORD unknown5[4]; /* 1c8 Unknown */
|
||||
DWORD sys_count[4]; /* 1d8 Syslevel mutex entry counters */
|
||||
CRITICAL_SECTION *sys_mutex[4];/* 1e8 Syslevel mutex pointers */
|
||||
DWORD unknown6[2]; /* 1f8 Unknown */
|
||||
/* The following are Wine-specific fields */
|
||||
WAIT_STRUCT wait_struct; /* 200 Event wait structure */
|
||||
int socket; /* Socket for server communication */
|
||||
int socket; /* 200 Socket for server communication */
|
||||
unsigned int seq; /* Server sequence number */
|
||||
void *server_tid; /* Server id for this thread */
|
||||
} THDB;
|
||||
|
||||
|
||||
/* Thread queue entry */
|
||||
typedef struct _THREAD_ENTRY
|
||||
{
|
||||
THDB *thread;
|
||||
struct _THREAD_ENTRY *next;
|
||||
} THREAD_ENTRY;
|
||||
|
||||
/* A thread queue is a circular list; a THREAD_QUEUE is a pointer */
|
||||
/* to the end of the queue (i.e. where we add elements) */
|
||||
typedef THREAD_ENTRY *THREAD_QUEUE;
|
||||
|
||||
/* THDB <-> Thread id conversion macros */
|
||||
#define THREAD_OBFUSCATOR ((DWORD)0xdeadbeef)
|
||||
|
@ -144,6 +122,7 @@ extern THDB *pCurrentThread;
|
|||
|
||||
|
||||
/* scheduler/thread.c */
|
||||
extern THDB *THREAD_CreateInitialThread( struct _PDB32 *pdb );
|
||||
extern THDB *THREAD_Create( struct _PDB32 *pdb, DWORD stack_size,
|
||||
BOOL32 alloc_stack16,
|
||||
int *server_thandle, int *server_phandle,
|
||||
|
@ -152,8 +131,6 @@ extern THDB *THREAD_Current(void);
|
|||
extern BOOL32 THREAD_IsWin16( THDB *thdb );
|
||||
extern THDB *THREAD_IdToTHDB( DWORD id );
|
||||
extern void THREAD_Start( THDB *thdb );
|
||||
extern void THREAD_AddQueue( THREAD_QUEUE *queue, THDB *thread );
|
||||
extern void THREAD_RemoveQueue( THREAD_QUEUE *queue, THDB *thread );
|
||||
extern DWORD THREAD_TlsAlloc( THDB *thread );
|
||||
|
||||
/* scheduler/sysdeps.c */
|
||||
|
|
|
@ -31,7 +31,9 @@ const K32OBJ_OPS PROCESS_Ops =
|
|||
PROCESS_Destroy /* destroy */
|
||||
};
|
||||
|
||||
static DWORD PROCESS_InitialProcessID = 0;
|
||||
/* The initial process PDB */
|
||||
static PDB32 initial_pdb;
|
||||
|
||||
static PDB32 *PROCESS_PDBList = NULL;
|
||||
static DWORD PROCESS_PDBList_Size = 0;
|
||||
|
||||
|
@ -53,7 +55,7 @@ PDB32 *PROCESS_Current(void)
|
|||
*/
|
||||
PDB32 *PROCESS_Initial(void)
|
||||
{
|
||||
return PROCESS_IdToPDB( PROCESS_InitialProcessID );
|
||||
return &initial_pdb;
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
|
@ -361,31 +363,39 @@ static BOOL32 PROCESS_FinishCreatePDB( PDB32 *pdb )
|
|||
*/
|
||||
BOOL32 PROCESS_Init(void)
|
||||
{
|
||||
PDB32 *pdb;
|
||||
THDB *thdb;
|
||||
|
||||
/* Fill the initial process structure */
|
||||
initial_pdb.header.type = K32OBJ_PROCESS;
|
||||
initial_pdb.header.refcount = 1;
|
||||
initial_pdb.exit_code = 0x103; /* STILL_ACTIVE */
|
||||
initial_pdb.threads = 1;
|
||||
initial_pdb.running_threads = 1;
|
||||
initial_pdb.ring0_threads = 1;
|
||||
initial_pdb.group = &initial_pdb;
|
||||
initial_pdb.priority = 8; /* Normal */
|
||||
|
||||
/* Initialize virtual memory management */
|
||||
if (!VIRTUAL_Init()) return FALSE;
|
||||
|
||||
/* Create the system heaps */
|
||||
/* Create the system heap */
|
||||
if (!(SystemHeap = HeapCreate( HEAP_GROWABLE, 0x10000, 0 ))) return FALSE;
|
||||
initial_pdb.system_heap = initial_pdb.heap = SystemHeap;
|
||||
|
||||
/* Create the initial process and thread structures */
|
||||
if (!(pdb = PROCESS_CreatePDB( NULL, FALSE ))) return FALSE;
|
||||
if (!(thdb = THREAD_Create( pdb, 0, FALSE, NULL, NULL, NULL, NULL ))) return FALSE;
|
||||
thdb->unix_pid = getpid();
|
||||
|
||||
PROCESS_InitialProcessID = PDB_TO_PROCESS_ID(pdb);
|
||||
if (!HANDLE_CreateTable( &initial_pdb, FALSE )) return FALSE;
|
||||
if (!(thdb = THREAD_CreateInitialThread( &initial_pdb ))) return FALSE;
|
||||
|
||||
/* Remember TEB selector of initial process for emergency use */
|
||||
SYSLEVEL_EmergencyTeb = thdb->teb_sel;
|
||||
|
||||
/* Create the environment DB of the first process */
|
||||
if (!PROCESS_BuildEnvDB( pdb )) return FALSE;
|
||||
PROCESS_PDBList_Insert( &initial_pdb );
|
||||
if (!PROCESS_BuildEnvDB( &initial_pdb )) return FALSE;
|
||||
|
||||
/* Initialize the first thread */
|
||||
if (CLIENT_InitThread()) return FALSE;
|
||||
if (!PROCESS_FinishCreatePDB( pdb )) return FALSE;
|
||||
if (!PROCESS_FinishCreatePDB( &initial_pdb )) return FALSE;
|
||||
|
||||
/* Create the SEGPTR heap */
|
||||
if (!(SegptrHeap = HeapCreate( HEAP_WINE_SEGPTR, 0, 0 ))) return FALSE;
|
||||
|
@ -453,15 +463,6 @@ PDB32 *PROCESS_Create( NE_MODULE *pModule, LPCSTR cmd_line, LPCSTR env,
|
|||
info->dwProcessId = PDB_TO_PROCESS_ID(pdb);
|
||||
info->dwThreadId = THDB_TO_THREAD_ID(thdb);
|
||||
|
||||
#if 0
|
||||
thdb->unix_pid = getpid(); /* FIXME: wrong here ... */
|
||||
#else
|
||||
/* All Win16 'threads' have the same unix_pid, no matter by which thread
|
||||
they were created ! */
|
||||
pTask = (TDB *)GlobalLock16( parent->task );
|
||||
thdb->unix_pid = pTask? pTask->thdb->unix_pid : THREAD_Current()->unix_pid;
|
||||
#endif
|
||||
|
||||
/* Duplicate the standard handles */
|
||||
|
||||
if ((!(pdb->env_db->startup_info->dwFlags & STARTF_USESTDHANDLES)) && !inherit)
|
||||
|
@ -897,6 +898,7 @@ DWORD WINAPI GetProcessHeaps(DWORD nrofheaps,HANDLE32 *heaps) {
|
|||
|
||||
void PROCESS_SuspendOtherThreads(void)
|
||||
{
|
||||
#if 0
|
||||
PDB32 *pdb;
|
||||
THREAD_ENTRY *entry;
|
||||
|
||||
|
@ -919,6 +921,7 @@ void PROCESS_SuspendOtherThreads(void)
|
|||
}
|
||||
|
||||
SYSTEM_UNLOCK();
|
||||
#endif
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
|
@ -927,6 +930,7 @@ void PROCESS_SuspendOtherThreads(void)
|
|||
|
||||
void PROCESS_ResumeOtherThreads(void)
|
||||
{
|
||||
#if 0
|
||||
PDB32 *pdb;
|
||||
THREAD_ENTRY *entry;
|
||||
|
||||
|
@ -949,5 +953,6 @@ void PROCESS_ResumeOtherThreads(void)
|
|||
}
|
||||
|
||||
SYSTEM_UNLOCK();
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
|
@ -80,7 +80,6 @@ int *__h_errno_location()
|
|||
*/
|
||||
static void SYSDEPS_StartThread( THDB *thdb )
|
||||
{
|
||||
thdb->unix_pid = getpid();
|
||||
SET_FS( thdb->teb_sel );
|
||||
THREAD_Start( thdb );
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue