Skip to content

Commit

Permalink
Update.
Browse files Browse the repository at this point in the history
1999-11-02  Ulrich Drepper  <drepper@cygnus.com>

	* sysdeps/unix/sysv/linux/i386/sys/procfs.h: Include sys/ucontext.h
	instead of duplicating definitions.
  • Loading branch information
Ulrich Drepper committed Nov 2, 1999
1 parent 03fc7ab commit a9cb398
Show file tree
Hide file tree
Showing 21 changed files with 395 additions and 52 deletions.
5 changes: 5 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
1999-11-02 Ulrich Drepper <drepper@cygnus.com>

* sysdeps/unix/sysv/linux/i386/sys/procfs.h: Include sys/ucontext.h
instead of duplicating definitions.

1999-11-01 Ulrich Drepper <drepper@cygnus.com>

* sysdeps/unix/sysv/linux/alpha/sys/procfs.h: Add more pr* types used
Expand Down
18 changes: 18 additions & 0 deletions linuxthreads/ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,21 @@
1999-11-02 Ulrich Drepper <drepper@cygnus.com>

* Makefile (libpthread-routines): Add events.
* events.c: New file.
* internals.h: Protect against multiple inclusion.
Include thread_dbP.h header.
(struct _pthread_descr_struct): Add new fields p_report_events and
p_eventbuf.
Declare event reporting functions.
* join.c (pthread_exit): Signal event if this is wanted.
* manager.c (__pthread_threads_events): New variable.
(pthread_handle_create): Take new parameters with event information.
Signal TD_CREATE event if wanted.
(__pthread_manager): Adjust pthread_handle_create call.
(pthread_start_thread_event): New function. Block until manager is
finished and then call pthread_start_thread.
(pthread_exited): Signal TD_REAP event if wanted.

1999-10-26 Ulrich Drepper <drepper@cygnus.com>

* restart.h (suspend_with_cancellation): Rewrite as a macro.
Expand Down
2 changes: 1 addition & 1 deletion linuxthreads/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ extra-libs-others := $(extra-libs)
libpthread-routines := attr cancel condvar join manager mutex ptfork \
ptlongjmp pthread signals specific errno lockfile \
semaphore spinlock wrapsyscall rwlock pt-machine \
oldsemaphore
oldsemaphore events

vpath %.c Examples
tests = ex1 ex2 ex3 ex4 ex5 ex6
Expand Down
35 changes: 35 additions & 0 deletions linuxthreads/events.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
/* Event functions used while debugging.
Copyright (C) 1999 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */

/* The functions contained here do nothing, they just return. */

void
__linuxthreads_create_event (void)
{
}

void
__linuxthreads_death_event (void)
{
}

void
__linuxthreads_reap_event (void)
{
}
17 changes: 17 additions & 0 deletions linuxthreads/internals.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@
/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
/* GNU Library General Public License for more details. */

#ifndef _INTERNALS_H
#define _INTERNALS_H 1

/* Internal data structures */

/* Includes */
Expand All @@ -25,6 +28,7 @@

#include "pt-machine.h"
#include "semaphore.h"
#include "../linuxthreads_db/thread_dbP.h"

#ifndef THREAD_GETMEM
# define THREAD_GETMEM(descr, member) descr->member
Expand Down Expand Up @@ -115,6 +119,9 @@ struct _pthread_descr_struct {
size_t p_guardsize; /* size of guard area */
pthread_descr p_self; /* Pointer to this structure */
int p_nr; /* Index of descriptor in __pthread_handles */
/* New elements must be added at the end. */
int p_report_events; /* Nonzero if events must be reported. */
td_eventbuf_t p_eventbuf; /* Data for event. */
} __attribute__ ((aligned(32))); /* We need to align the structure so that
doubles are aligned properly. This is 8
bytes on MIPS and 16 bytes on MIPS64.
Expand Down Expand Up @@ -219,6 +226,9 @@ extern int __pthread_exit_requested, __pthread_exit_code;

extern volatile int __pthread_threads_debug;

/* Globally enabled events. */
extern volatile td_thr_events_t __pthread_threads_events;

/* Return the handle corresponding to a thread id */

static inline pthread_handle thread_handle(pthread_t id)
Expand Down Expand Up @@ -364,3 +374,10 @@ extern ssize_t __libc_write (int fd, const void *buf, size_t count);

/* Prototypes for some of the new semaphore functions. */
extern int __new_sem_post (sem_t * sem);

/* The functions called the signal events. */
extern void __linuxthreads_create_event (void);
extern void __linuxthreads_death_event (void);
extern void __linuxthreads_reap_event (void);

#endif /* internals.h */
20 changes: 20 additions & 0 deletions linuxthreads/join.c
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,26 @@ void pthread_exit(void * retval)
THREAD_SETMEM(self, p_retval, retval);
/* Say that we've terminated */
THREAD_SETMEM(self, p_terminated, 1);
/* See whether we have to signal the death. */
if (THREAD_GETMEM(self, p_report_events))
{
/* See whether TD_DEATH is in any of the mask. */
int idx = __td_eventword (TD_DEATH);
uint32_t mask = __td_eventmask (TD_DEATH);

if ((mask & (__pthread_threads_events.event_bits[idx]
| THREAD_GETMEM(self,
p_eventbuf.eventmask).event_bits[idx]))
!= 0)
{
/* Yep, we have to signal the death. */
THREAD_SETMEM(self, p_eventbuf.eventnum, TD_DEATH);
THREAD_SETMEM(self, p_eventbuf.eventdata, self);

/* Now call the function to signal the event. */
__linuxthreads_death_event();
}
}
/* See if someone is joining on us */
joining = THREAD_GETMEM(self, p_joining);
__pthread_unlock(THREAD_GETMEM(self, p_lock));
Expand Down
95 changes: 86 additions & 9 deletions linuxthreads/manager.c
Original file line number Diff line number Diff line change
Expand Up @@ -43,14 +43,17 @@ const int __linuxthreads_pthread_threads_max = PTHREAD_THREADS_MAX;

/* Indicate whether at least one thread has a user-defined stack (if 1),
or if all threads have stacks supplied by LinuxThreads (if 0). */
int __pthread_nonstandard_stacks = 0;
int __pthread_nonstandard_stacks;

/* Number of active entries in __pthread_handles (used by gdb) */
volatile int __pthread_handles_num = 2;

/* Whether to use debugger additional actions for thread creation
(set to 1 by gdb) */
volatile int __pthread_threads_debug = 0;
volatile int __pthread_threads_debug;

/* Globally enabled events. */
volatile td_thr_events_t __pthread_threads_events;

/* Mapping from stack segment to thread descriptor. */
/* Stack segment numbers are also indices into the __pthread_handles array. */
Expand Down Expand Up @@ -80,7 +83,9 @@ static pthread_t pthread_threads_counter = 0;

static int pthread_handle_create(pthread_t *thread, const pthread_attr_t *attr,
void * (*start_routine)(void *), void *arg,
sigset_t *mask, int father_pid);
sigset_t *mask, int father_pid,
int report_events,
td_thr_events_t *event_maskp);
static void pthread_handle_free(pthread_t th_id);
static void pthread_handle_exit(pthread_descr issuing_thread, int exitcode);
static void pthread_reap_children(void);
Expand Down Expand Up @@ -141,7 +146,9 @@ int __pthread_manager(void *arg)
request.req_args.create.fn,
request.req_args.create.arg,
&request.req_args.create.mask,
request.req_thread->p_pid);
request.req_thread->p_pid,
request.req_thread->p_report_events,
&request.req_thread->p_eventbuf.eventmask);
restart(request.req_thread);
break;
case REQ_FREE:
Expand Down Expand Up @@ -220,6 +227,19 @@ static int pthread_start_thread(void *arg)
return 0;
}

static int pthread_start_thread_event(void *arg)
{
pthread_descr self = thread_self ();

/* Get the lock the manager will free once all is correctly set up. */
__pthread_lock (THREAD_GETMEM(self, p_lock), NULL);
/* Free it immediately. */
__pthread_unlock (THREAD_GETMEM(self, p_lock));

/* Continue with the real function. */
return pthread_start_thread (arg);
}

static int pthread_allocate_stack(const pthread_attr_t *attr,
pthread_descr default_new_thread,
int pagesize,
Expand Down Expand Up @@ -297,7 +317,9 @@ static int pthread_allocate_stack(const pthread_attr_t *attr,

static int pthread_handle_create(pthread_t *thread, const pthread_attr_t *attr,
void * (*start_routine)(void *), void *arg,
sigset_t * mask, int father_pid)
sigset_t * mask, int father_pid,
int report_events,
td_thr_events_t *event_maskp)
{
size_t sseg;
int pid;
Expand Down Expand Up @@ -372,10 +394,47 @@ static int pthread_handle_create(pthread_t *thread, const pthread_attr_t *attr,
new_thread->p_start_args.mask = *mask;
/* Raise priority of thread manager if needed */
__pthread_manager_adjust_prio(new_thread->p_priority);
/* Do the cloning */
pid = __clone(pthread_start_thread, (void **) new_thread,
CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND |
__pthread_sig_cancel, new_thread);
/* Do the cloning. We have to use two different functions depending
on whether we are debugging or not. */
pid = 0; /* Note that the thread never can have PID zero. */
if (report_events)
{
/* See whether the TD_CREATE event bit is set in any of the
masks. */
int idx = __td_eventword (TD_CREATE);
uint32_t mask = __td_eventmask (TD_CREATE);

if ((mask & (__pthread_threads_events.event_bits[idx]
| event_maskp->event_bits[idx])) != 0)
{
/* Lock the mutex the child will use now so that it will stop. */
__pthread_lock(new_thread->p_lock, NULL);

/* We have to report this event. */
pid = __clone(pthread_start_thread_event, (void **) new_thread,
CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND |
__pthread_sig_cancel, new_thread);
if (pid != -1)
{
/* Now fill in the information about the new thread in
the newly created thread's data structure. We cannot let
the new thread do this since we don't know whether it was
already scheduled when we send the event. */
new_thread->p_eventbuf.eventdata = new_thread;
new_thread->p_eventbuf.eventnum = TD_CREATE;

/* Now call the function which signals the event. */
__linuxthreads_create_event ();

/* Now restart the thread. */
__pthread_unlock(new_thread->p_lock);
}
}
}
if (pid == 0)
pid = __clone(pthread_start_thread, (void **) new_thread,
CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND |
__pthread_sig_cancel, new_thread);
/* Check if cloning succeeded */
if (pid == -1) {
/* Free the stack if we allocated it */
Expand Down Expand Up @@ -451,6 +510,24 @@ static void pthread_exited(pid_t pid)
/* Mark thread as exited, and if detached, free its resources */
__pthread_lock(th->p_lock, NULL);
th->p_exited = 1;
/* If we have to signal this event do it now. */
if (th->p_report_events)
{
/* See whether TD_DEATH is in any of the mask. */
int idx = __td_eventword (TD_REAP);
uint32_t mask = __td_eventmask (TD_REAP);

if ((mask & (__pthread_threads_events.event_bits[idx]
| th->p_eventbuf.eventmask.event_bits[idx])) != 0)
{
/* Yep, we have to signal the death. */
th->p_eventbuf.eventnum = TD_DEATH;
th->p_eventbuf.eventdata = th;

/* Now call the function to signal the event. */
__linuxthreads_reap_event();
}
}
detached = th->p_detached;
__pthread_unlock(th->p_lock);
if (detached)
Expand Down
28 changes: 20 additions & 8 deletions linuxthreads_db/ChangeLog
Original file line number Diff line number Diff line change
@@ -1,16 +1,28 @@
1999-11-02 Ulrich Drepper <drepper@cygnus.com>

* td_ta_new.c: Don't test for __pthread_threads_debug. Get address
of __pthread_threads_events and fail if this is not possible.
* td_ta_event_addr.c: Implement.
* td_thr_event_enable.c: Implement.
* td_thr_event_getmsg.c: Implement.
* td_thr_set_event.c: Implement.
* td_ta_set_event.c: New file.
* thread_db.h (td_eventbuf_t): Define.
Declare td_ta_set_event.
* thread_dbP.h (struct td_thragent): Add pthread_threads_eventsp.

* td_thr_getfpregs.c: For terminated threads return empty structure.
* td_thr_getgregs.c: Likewise.
* td_thr_setfpregs.c: Likewise.
* td_thr_setgregs.c: Likewise.

1999-11-01 Ulrich Drepper <drepper@cygnus.com>

* sysdeps/unix/sysv/linux/alpha/sys/procfs.h: Add more pr* types used
by the debugger.
* sysdeps/unix/sysv/linux/arm/sys/procfs.h: Likewise.
* sysdeps/unix/sysv/linux/i386/sys/procfs.h: Likewise.
* sysdeps/unix/sysv/linux/mips/sys/procfs.h: Likewise.
* sysdeps/unix/sysv/linux/powerpc/sys/procfs.h: Likewise.
* sysdeps/unix/sysv/linux/sys/procfs.h: Likewise.
* thread_db.h: Shuffle types around to make things work for gdb.
* thread_dbP.h: Include proc_service.h before thread_db.h.

* td_ta_new.c: It's TD_NOLIBTHREAD, not TD_LIBTHREAD.
* thread_db.h: It's TD_NOLIBTHREAD, not TD_LIBTHREAD.
* td_ta_new.c: Likewise.

1999-10-14 Ulrich Drepper <drepper@cygnus.com>

Expand Down
45 changes: 43 additions & 2 deletions linuxthreads_db/td_ta_event_addr.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,54 @@
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */

#include <gnu/lib-names.h>

#include "thread_dbP.h"


td_err_e
td_ta_event_addr (const td_thragent_t *ta, td_event_e event, td_notify_t *addr)
{
/* XXX We have to figure out what has to be done. */
td_err_e res = TD_NOEVENT;
const char *symbol = NULL;

LOG (__FUNCTION__);
return TD_NOCAPAB;

switch (event)
{
case TD_CREATE:
symbol = "__linuxthreads_create_event";
break;

case TD_DEATH:
symbol = "__linuxthreads_death_event";
break;

case TD_REAP:
symbol = "__linuxthreads_reap_event";
break;

default:
/* Event cannot be handled. */
break;
}

/* Now get the address. */
if (symbol != NULL)
{
psaddr_t taddr;

if (ps_pglobal_lookup (ta->ph, LIBPTHREAD_SO, symbol, &taddr) == PS_OK)
{
/* Success, we got the address. */
addr->type = NOTIFY_BPT;
addr->u.bptaddr = taddr;

res = TD_OK;
}
else
res = TD_ERR;
}

return res;
}
Loading

0 comments on commit a9cb398

Please sign in to comment.