PERFORCE change 49848 for review
Marcel Moolenaar
marcel at FreeBSD.org
Sun Mar 28 13:15:54 PST 2004
http://perforce.freebsd.org/chv.cgi?CH=49848
Change 49848 by marcel at marcel_nfs on 2004/03/28 13:15:17
Commit to adding thread IDs. Threads create as part of a
fork will inherit the process ID as before. Threads created
by 1:1 or M:N threading will get an ID in a seperate range
so that they won't affect or conflict with process creation.
Add thread_new_tid() to assign new thread IDs. Provide a
place holder for now. Move the td_tid field out of the
zero range. It now needs to be set explicitly.
Affected files ...
.. //depot/projects/gdb/sys/kern/kern_fork.c#8 edit
.. //depot/projects/gdb/sys/kern/kern_thr.c#3 edit
.. //depot/projects/gdb/sys/kern/kern_thread.c#6 edit
.. //depot/projects/gdb/sys/sys/proc.h#8 edit
Differences ...
==== //depot/projects/gdb/sys/kern/kern_fork.c#8 (text+ko) ====
@@ -497,8 +497,8 @@
(unsigned) RANGEOF(struct ksegrp, kg_startcopy, kg_endcopy));
#undef RANGEOF
+ td2->td_tid = p2->p_pid;
td2->td_sigstk = td->td_sigstk;
- td2->td_tid = p2->p_pid;
/* Set up the thread as an active thread (as if runnable). */
ke2->ke_state = KES_THREAD;
==== //depot/projects/gdb/sys/kern/kern_thr.c#3 (text+ko) ====
@@ -133,6 +133,7 @@
/* Initialize our td. */
td0 = thread_alloc();
+ td0->td_tid = thread_new_tid();
/*
* Try the copyout as soon as we allocate the td so we don't have to
==== //depot/projects/gdb/sys/kern/kern_thread.c#6 (text+ko) ====
@@ -1032,6 +1032,17 @@
}
/*
+ * Assign a thread ID between 100000 and 999999.
+ */
+int
+thread_new_tid(void)
+{
+ static int next_tid = 100000;
+
+ return (next_tid++);
+}
+
+/*
* Store the thread context in the UTS's mailbox.
* then add the mailbox at the head of a list we are building in user space.
* The list is anchored in the ksegrp structure.
@@ -1472,8 +1483,10 @@
if (td->td_standin)
return;
- if (spare == NULL)
+ if (spare == NULL) {
spare = thread_alloc();
+ spare->td_tid = thread_new_tid();
+ }
td->td_standin = spare;
bzero(&spare->td_startzero,
(unsigned)RANGEOF(struct thread, td_startzero, td_endzero));
==== //depot/projects/gdb/sys/sys/proc.h#8 (text+ko) ====
@@ -145,6 +145,7 @@
* p - select lock (sellock)
* q - td_contested lock
* r - p_peers lock
+ * t - updated at kernel (re)entry. Read-only in all other cases.
* x - created at fork, only changes during single threading in exec
* z - zombie threads/kse/ksegroup lock
*
@@ -268,14 +269,14 @@
TAILQ_HEAD(, selinfo) td_selq; /* (p) List of selinfos. */
struct sleepqueue *td_sleepqueue; /* (k) Associated sleep queue. */
struct turnstile *td_turnstile; /* (k) Associated turnstile. */
+ int td_tid; /* (b) Thread ID. */
/* Cleared during fork1() or thread_sched_upcall(). */
#define td_startzero td_flags
int td_flags; /* (j) TDF_* flags. */
int td_inhibitors; /* (j) Why can not run. */
int td_pflags; /* (k) Private thread (TDP_*) flags. */
- int td_tid; /* XXX currently unused. */
- struct trapframe *td_last_frame;
+ struct trapframe *td_last_frame; /* (t) Trapframe of last entry. */
struct kse *td_last_kse; /* (j) Previous value of td_kse. */
struct kse *td_kse; /* (j) Current KSE if running. */
int td_dupfd; /* (k) Ret value from fdopen. XXX */
@@ -905,6 +906,7 @@
int thread_export_context(struct thread *td, int willexit);
void thread_free(struct thread *td);
void thread_link(struct thread *td, struct ksegrp *kg);
+int thread_new_tid(void);
void thread_reap(void);
struct thread *thread_schedule_upcall(struct thread *td, struct kse_upcall *ku);
int thread_single(int how);
More information about the p4-projects
mailing list