|
@@ -408,23 +408,16 @@ out_err:
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
- * Caller must eventually drop thread->refcnt returned with a successful
|
|
|
- * lookup/new thread inserted.
|
|
|
+ * Front-end cache - TID lookups come in blocks,
|
|
|
+ * so most of the time we dont have to look up
|
|
|
+ * the full rbtree:
|
|
|
*/
|
|
|
-static struct thread *____machine__findnew_thread(struct machine *machine,
|
|
|
- struct threads *threads,
|
|
|
- pid_t pid, pid_t tid,
|
|
|
- bool create)
|
|
|
+static struct thread*
|
|
|
+threads__get_last_match(struct threads *threads, struct machine *machine,
|
|
|
+ int pid, int tid)
|
|
|
{
|
|
|
- struct rb_node **p = &threads->entries.rb_node;
|
|
|
- struct rb_node *parent = NULL;
|
|
|
struct thread *th;
|
|
|
|
|
|
- /*
|
|
|
- * Front-end cache - TID lookups come in blocks,
|
|
|
- * so most of the time we dont have to look up
|
|
|
- * the full rbtree:
|
|
|
- */
|
|
|
th = threads->last_match;
|
|
|
if (th != NULL) {
|
|
|
if (th->tid == tid) {
|
|
@@ -435,6 +428,26 @@ static struct thread *____machine__findnew_thread(struct machine *machine,
|
|
|
threads->last_match = NULL;
|
|
|
}
|
|
|
|
|
|
+ return NULL;
|
|
|
+}
|
|
|
+
|
|
|
+/*
|
|
|
+ * Caller must eventually drop thread->refcnt returned with a successful
|
|
|
+ * lookup/new thread inserted.
|
|
|
+ */
|
|
|
+static struct thread *____machine__findnew_thread(struct machine *machine,
|
|
|
+ struct threads *threads,
|
|
|
+ pid_t pid, pid_t tid,
|
|
|
+ bool create)
|
|
|
+{
|
|
|
+ struct rb_node **p = &threads->entries.rb_node;
|
|
|
+ struct rb_node *parent = NULL;
|
|
|
+ struct thread *th;
|
|
|
+
|
|
|
+ th = threads__get_last_match(threads, machine, pid, tid);
|
|
|
+ if (th)
|
|
|
+ return th;
|
|
|
+
|
|
|
while (*p != NULL) {
|
|
|
parent = *p;
|
|
|
th = rb_entry(parent, struct thread, rb_node);
|