>
> You'd rather use 8 here, so that if somebody else adds yet another
> field things work correctly. Actually, looking at what is done for
> THREAD_BASIC_INFO, there is no check there. AIUI that's because the
> output message is allocated by the caller to the largest RPC size, so we
> can just fill there without having to care actually, drop that if.
>
> You however do need to allow for *thread_info_count ==
> THREAD_SCHED_INFO_COUNT-1 above, just similarly to how it is done for
> the THREAD_BASIC_INFO case.
Fixed
El dom., 27 oct. 2019 a las 20:27, Samuel Thibault (<[email protected]>)
escribió:
> Almudena Garcia, le dim. 27 oct. 2019 20:13:40 +0100, a ecrit:
> > > Please really add it to thread_sched_info_t.
> >
> > Fixed. Now working in Hurd patch
>
>
>
> > --- gnumach/kern/thread.c 2019-09-03 01:22:10.932747830 +0200
> > +++ GNUMach_SMP/kern/thread.c 2019-10-27 20:09:10.515836242 +0100
> > @@ -1609,6 +1609,18 @@
> > sched_info->depressed = (thread->depress_priority >= 0);
> > sched_info->depress_priority = thread->depress_priority;
> >
> > +
> > + /* Check if the sched_info includes all new members
> (including last_processor) */
> > + if (*thread_info_count >= THREAD_SCHED_INFO_COUNT) {
>
> You'd rather use 8 here, so that if somebody else adds yet another
> field things work correctly. Actually, looking at what is done for
> THREAD_BASIC_INFO, there is no check there. AIUI that's because the
> output message is allocated by the caller to the largest RPC size, so we
> can just fill there without having to care actually, drop that if.
>
> You however do need to allow for *thread_info_count ==
> THREAD_SCHED_INFO_COUNT-1 above, just similarly to how it is done for
> the THREAD_BASIC_INFO case.
>
> > +
> > + #if NCPUS > 1
> > + sched_info->last_processor = thread->last_processor;
> > + #else
> > + sched_info->last_processor = 0;
> > + #endif
> > +
> > + }
> > +
>
>
--- gnumach/include/mach/thread_info.h 2019-09-03 01:22:10.920747802 +0200
+++ GNUMach_SMP/include/mach/thread_info.h 2019-10-27 20:06:55.785860002 +0100
@@ -107,6 +107,7 @@
integer_t cur_priority; /* current priority */
/*boolean_t*/integer_t depressed; /* depressed ? */
integer_t depress_priority; /* priority depressed from */
+ integer_t last_processor; /* last processor used by the thread */
};
typedef struct thread_sched_info thread_sched_info_data_t;
--- gnumach/kern/thread.c 2019-09-03 01:22:10.932747830 +0200
+++ GNUMach_SMP/kern/thread.c 2019-10-27 20:36:05.156083522 +0100
@@ -1580,7 +1580,10 @@
else if (flavor == THREAD_SCHED_INFO) {
thread_sched_info_t sched_info;
- if (*thread_info_count < THREAD_SCHED_INFO_COUNT) {
+ /* Allow *thread_info_count to be one smaller than the
+ usual amount, because last_processor is a
+ new member that some callers might not know about. */
+ if (*thread_info_count < THREAD_SCHED_INFO_COUNT -1) {
return KERN_INVALID_ARGUMENT;
}
@@ -1609,6 +1612,12 @@
sched_info->depressed = (thread->depress_priority >= 0);
sched_info->depress_priority = thread->depress_priority;
+ #if NCPUS > 1
+ sched_info->last_processor = thread->last_processor;
+ #else
+ sched_info->last_processor = 0;
+ #endif
+
thread_unlock(thread);
splx(s);