@@ -48,7 +48,7 @@ static void enqueueGlobal(Job *job,
4848 // Add the job after (i.e. before in execution order) all jobs
4949 // with lower priority.
5050 for (auto i = globalQueue.begin (), e = globalQueue.end (); i != e; ++i) {
51- if (job ->getPriority () <= (*i) ->getPriority ()) {
51+ if (descendingPriorityOrder ((*i) ->getPriority (), job ->getPriority ()) <= 0 ) {
5252 globalQueue.insert (i, job);
5353 return ;
5454 }
@@ -158,6 +158,19 @@ static AsyncTask *createTask(JobPriority priority, Fn &&fn) {
158158 .first ;
159159}
160160
161+ template <class Fn >
162+ static AsyncTask *createAndEnqueueTask (JobPriority priority,
163+ TestActor *actor,
164+ Fn &&fn) {
165+ auto task = createTaskWithContext<AsyncContext, Fn>(priority, std::move (fn))
166+ .first ;
167+ if (actor)
168+ swift_task_enqueue (task, ExecutorRef::forDefaultActor (actor));
169+ else
170+ swift_task_enqueueGlobal (task);
171+ return task;
172+ }
173+
161174template <class Context , class Fn >
162175static void parkTask (AsyncTask *task, Context *context, Fn &&fn) {
163176 auto invoke =
@@ -312,7 +325,7 @@ TEST(ActorTest, actorContention) {
312325
313326 parkTask (task, context,
314327 [](Context *context) SWIFT_CC (swiftasync) {
315- EXPECT_PROGRESS (3 );
328+ EXPECT_PROGRESS (2 );
316329 auto executor = swift_task_getCurrentExecutor ();
317330 EXPECT_FALSE (executor.isGeneric ());
318331 EXPECT_EQ (ExecutorRef::forDefaultActor (context->get <1 >()),
@@ -336,7 +349,7 @@ TEST(ActorTest, actorContention) {
336349 auto task1 = createTaskStoring (JobPriority::Background,
337350 (AsyncTask*) nullptr , actor,
338351 [](Context *context) SWIFT_CC (swiftasync) {
339- EXPECT_PROGRESS (2 );
352+ EXPECT_PROGRESS (3 );
340353 auto executor = swift_task_getCurrentExecutor ();
341354 EXPECT_FALSE (executor.isGeneric ());
342355 EXPECT_EQ (ExecutorRef::forDefaultActor (context->get <1 >()),
@@ -361,3 +374,115 @@ TEST(ActorTest, actorContention) {
361374 EXPECT_PROGRESS (0 );
362375 });
363376}
377+
378+ TEST (ActorTest, actorPriority) {
379+ run ([] {
380+ auto actor = createActor ();
381+
382+ createAndEnqueueTask (JobPriority::Background, actor,
383+ [=](AsyncContext *context) {
384+ EXPECT_PROGRESS (4 );
385+ return context->ResumeParent (context);
386+ });
387+
388+ createAndEnqueueTask (JobPriority::Utility, actor,
389+ [=](AsyncContext *context) {
390+ EXPECT_PROGRESS (1 );
391+ return context->ResumeParent (context);
392+ });
393+
394+ createAndEnqueueTask (JobPriority::Background, actor,
395+ [=](AsyncContext *context) {
396+ EXPECT_PROGRESS (5 );
397+ finishTest ();
398+ return context->ResumeParent (context);
399+ });
400+
401+ createAndEnqueueTask (JobPriority::Utility, actor,
402+ [=](AsyncContext *context) {
403+ EXPECT_PROGRESS (2 );
404+ return context->ResumeParent (context);
405+ });
406+
407+ createAndEnqueueTask (JobPriority::Default, actor,
408+ [=](AsyncContext *context) {
409+ EXPECT_PROGRESS (0 );
410+ return context->ResumeParent (context);
411+ });
412+
413+ createAndEnqueueTask (JobPriority::Utility, actor,
414+ [=](AsyncContext *context) {
415+ EXPECT_PROGRESS (3 );
416+ return context->ResumeParent (context);
417+ });
418+ });
419+ }
420+
421+ TEST (ActorTest, actorPriority2) {
422+ run ([] {
423+ auto actor = createActor ();
424+
425+ createAndEnqueueTask (JobPriority::Background, actor,
426+ [=](AsyncContext *context) {
427+ EXPECT_PROGRESS (7 );
428+ return context->ResumeParent (context);
429+ });
430+
431+ createAndEnqueueTask (JobPriority::Utility, actor,
432+ [=](AsyncContext *context) {
433+ EXPECT_PROGRESS (1 );
434+
435+ createAndEnqueueTask (JobPriority::Utility, actor,
436+ [=](AsyncContext *context) {
437+ EXPECT_PROGRESS (5 );
438+ return context->ResumeParent (context);
439+ });
440+
441+ createAndEnqueueTask (JobPriority::Default, actor,
442+ [](AsyncContext *context) {
443+ EXPECT_PROGRESS (2 );
444+ return context->ResumeParent (context);
445+ });
446+
447+ return context->ResumeParent (context);
448+ });
449+
450+ createAndEnqueueTask (JobPriority::Background, actor,
451+ [=](AsyncContext *context) {
452+ EXPECT_PROGRESS (8 );
453+ return context->ResumeParent (context);
454+ });
455+
456+ createAndEnqueueTask (JobPriority::Utility, actor,
457+ [=](AsyncContext *context) {
458+ EXPECT_PROGRESS (3 );
459+
460+ createAndEnqueueTask (JobPriority::Background, actor,
461+ [=](AsyncContext *context) {
462+ EXPECT_PROGRESS (9 );
463+ finishTest ();
464+ return context->ResumeParent (context);
465+ });
466+
467+ createAndEnqueueTask (JobPriority::Utility, actor,
468+ [=](AsyncContext *context) {
469+ EXPECT_PROGRESS (6 );
470+ return context->ResumeParent (context);
471+ });
472+
473+ return context->ResumeParent (context);
474+ });
475+
476+ createAndEnqueueTask (JobPriority::Default, actor,
477+ [=](AsyncContext *context) {
478+ EXPECT_PROGRESS (0 );
479+ return context->ResumeParent (context);
480+ });
481+
482+ createAndEnqueueTask (JobPriority::Utility, actor,
483+ [=](AsyncContext *context) {
484+ EXPECT_PROGRESS (4 );
485+ return context->ResumeParent (context);
486+ });
487+ });
488+ }
0 commit comments