Added server pid and tid in init_thread request, and use them in
CLIENT_InitThread.
This commit is contained in:
parent
ed494ec539
commit
875c4b3c61
|
@ -97,6 +97,11 @@ struct init_thread_request
|
||||||
{
|
{
|
||||||
int unix_pid; /* Unix pid of new thread */
|
int unix_pid; /* Unix pid of new thread */
|
||||||
};
|
};
|
||||||
|
struct init_thread_reply
|
||||||
|
{
|
||||||
|
void* pid; /* process id of the new thread's process */
|
||||||
|
void* tid; /* thread id of the new thread */
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/* Terminate a process */
|
/* Terminate a process */
|
||||||
|
|
|
@ -318,10 +318,16 @@ int CLIENT_InitServer(void)
|
||||||
*/
|
*/
|
||||||
int CLIENT_InitThread(void)
|
int CLIENT_InitThread(void)
|
||||||
{
|
{
|
||||||
struct init_thread_request init;
|
THDB *thdb = THREAD_Current();
|
||||||
init.unix_pid = getpid();
|
struct init_thread_request req;
|
||||||
CLIENT_SendRequest( REQ_INIT_THREAD, -1, 1, &init, sizeof(init) );
|
struct init_thread_reply reply;
|
||||||
return CLIENT_WaitReply( NULL, NULL, 0 );
|
|
||||||
|
req.unix_pid = getpid();
|
||||||
|
CLIENT_SendRequest( REQ_INIT_THREAD, -1, 1, &req, sizeof(req) );
|
||||||
|
if (CLIENT_WaitSimpleReply( &reply, sizeof(reply), NULL )) return -1;
|
||||||
|
thdb->process->server_pid = reply.pid;
|
||||||
|
thdb->server_tid = reply.tid;
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -306,9 +306,6 @@ BOOL PROCESS_Init(void)
|
||||||
/* Create the environment DB of the first process */
|
/* Create the environment DB of the first process */
|
||||||
if (!PROCESS_BuildEnvDB( &initial_pdb )) return FALSE;
|
if (!PROCESS_BuildEnvDB( &initial_pdb )) return FALSE;
|
||||||
|
|
||||||
/* Initialize the first thread */
|
|
||||||
if (CLIENT_InitThread()) return FALSE;
|
|
||||||
|
|
||||||
/* Create the SEGPTR heap */
|
/* Create the SEGPTR heap */
|
||||||
if (!(SegptrHeap = HeapCreate( HEAP_WINE_SEGPTR, 0, 0 ))) return FALSE;
|
if (!(SegptrHeap = HeapCreate( HEAP_WINE_SEGPTR, 0, 0 ))) return FALSE;
|
||||||
|
|
||||||
|
|
|
@ -80,12 +80,8 @@ int *__h_errno_location()
|
||||||
*/
|
*/
|
||||||
static void SYSDEPS_StartThread( THDB *thdb )
|
static void SYSDEPS_StartThread( THDB *thdb )
|
||||||
{
|
{
|
||||||
struct init_thread_request init;
|
|
||||||
|
|
||||||
SET_CUR_THREAD( thdb );
|
SET_CUR_THREAD( thdb );
|
||||||
init.unix_pid = getpid();
|
CLIENT_InitThread();
|
||||||
CLIENT_SendRequest( REQ_INIT_THREAD, -1, 1, &init, sizeof(init) );
|
|
||||||
CLIENT_WaitReply( NULL, NULL, 0 );
|
|
||||||
thdb->startup();
|
thdb->startup();
|
||||||
_exit(0); /* should never get here */
|
_exit(0); /* should never get here */
|
||||||
}
|
}
|
||||||
|
|
|
@ -201,6 +201,7 @@ THDB *THREAD_CreateInitialThread( PDB *pdb, int server_fd )
|
||||||
|
|
||||||
/* Now proceed with normal initialization */
|
/* Now proceed with normal initialization */
|
||||||
|
|
||||||
|
if (CLIENT_InitThread()) return NULL;
|
||||||
if (!THREAD_InitTHDB( &initial_thdb, 0, TRUE, NULL )) return NULL;
|
if (!THREAD_InitTHDB( &initial_thdb, 0, TRUE, NULL )) return NULL;
|
||||||
return &initial_thdb;
|
return &initial_thdb;
|
||||||
}
|
}
|
||||||
|
@ -344,6 +345,7 @@ DWORD WINAPI GetCurrentThreadId(void)
|
||||||
{
|
{
|
||||||
THDB *thdb = THREAD_Current();
|
THDB *thdb = THREAD_Current();
|
||||||
assert( thdb );
|
assert( thdb );
|
||||||
|
assert( thdb->server_tid );
|
||||||
return (DWORD)thdb->server_tid;
|
return (DWORD)thdb->server_tid;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -160,6 +160,8 @@ DECL_HANDLER(init_process)
|
||||||
/* initialize a new thread */
|
/* initialize a new thread */
|
||||||
DECL_HANDLER(init_thread)
|
DECL_HANDLER(init_thread)
|
||||||
{
|
{
|
||||||
|
struct init_thread_reply reply;
|
||||||
|
|
||||||
if (current->state != STARTING)
|
if (current->state != STARTING)
|
||||||
{
|
{
|
||||||
fatal_protocol_error( "init_thread: already running\n" );
|
fatal_protocol_error( "init_thread: already running\n" );
|
||||||
|
@ -169,7 +171,9 @@ DECL_HANDLER(init_thread)
|
||||||
current->unix_pid = req->unix_pid;
|
current->unix_pid = req->unix_pid;
|
||||||
if (current->suspend > 0)
|
if (current->suspend > 0)
|
||||||
kill( current->unix_pid, SIGSTOP );
|
kill( current->unix_pid, SIGSTOP );
|
||||||
send_reply( current, -1, 0 );
|
reply.pid = current->process;
|
||||||
|
reply.tid = current;
|
||||||
|
send_reply( current, -1, 1, &reply, sizeof(reply) );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* set the debug level */
|
/* set the debug level */
|
||||||
|
|
|
@ -66,6 +66,13 @@ static int dump_init_thread_request( struct init_thread_request *req, int len )
|
||||||
return (int)sizeof(*req);
|
return (int)sizeof(*req);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int dump_init_thread_reply( struct init_thread_reply *req, int len )
|
||||||
|
{
|
||||||
|
fprintf( stderr, " pid=%p,", req->pid );
|
||||||
|
fprintf( stderr, " tid=%p", req->tid );
|
||||||
|
return (int)sizeof(*req);
|
||||||
|
}
|
||||||
|
|
||||||
static int dump_terminate_process_request( struct terminate_process_request *req, int len )
|
static int dump_terminate_process_request( struct terminate_process_request *req, int len )
|
||||||
{
|
{
|
||||||
fprintf( stderr, " handle=%d,", req->handle );
|
fprintf( stderr, " handle=%d,", req->handle );
|
||||||
|
@ -638,7 +645,7 @@ static const struct dumper dumpers[REQ_NB_REQUESTS] =
|
||||||
{ (int(*)(void *,int))dump_init_process_request,
|
{ (int(*)(void *,int))dump_init_process_request,
|
||||||
(void(*)())dump_init_process_reply },
|
(void(*)())dump_init_process_reply },
|
||||||
{ (int(*)(void *,int))dump_init_thread_request,
|
{ (int(*)(void *,int))dump_init_thread_request,
|
||||||
(void(*)())0 },
|
(void(*)())dump_init_thread_reply },
|
||||||
{ (int(*)(void *,int))dump_terminate_process_request,
|
{ (int(*)(void *,int))dump_terminate_process_request,
|
||||||
(void(*)())0 },
|
(void(*)())0 },
|
||||||
{ (int(*)(void *,int))dump_terminate_thread_request,
|
{ (int(*)(void *,int))dump_terminate_thread_request,
|
||||||
|
|
Loading…
Reference in New Issue