@@ -48,7 +48,7 @@ static void enqueueGlobal(Job *job,
48
48
// Add the job after (i.e. before in execution order) all jobs
49
49
// with lower priority.
50
50
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 ) {
52
52
globalQueue.insert (i, job);
53
53
return ;
54
54
}
@@ -158,6 +158,19 @@ static AsyncTask *createTask(JobPriority priority, Fn &&fn) {
158
158
.first ;
159
159
}
160
160
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
+
161
174
template <class Context , class Fn >
162
175
static void parkTask (AsyncTask *task, Context *context, Fn &&fn) {
163
176
auto invoke =
@@ -312,7 +325,7 @@ TEST(ActorTest, actorContention) {
312
325
313
326
parkTask (task, context,
314
327
[](Context *context) SWIFT_CC (swiftasync) {
315
- EXPECT_PROGRESS (3 );
328
+ EXPECT_PROGRESS (2 );
316
329
auto executor = swift_task_getCurrentExecutor ();
317
330
EXPECT_FALSE (executor.isGeneric ());
318
331
EXPECT_EQ (ExecutorRef::forDefaultActor (context->get <1 >()),
@@ -336,7 +349,7 @@ TEST(ActorTest, actorContention) {
336
349
auto task1 = createTaskStoring (JobPriority::Background,
337
350
(AsyncTask*) nullptr , actor,
338
351
[](Context *context) SWIFT_CC (swiftasync) {
339
- EXPECT_PROGRESS (2 );
352
+ EXPECT_PROGRESS (3 );
340
353
auto executor = swift_task_getCurrentExecutor ();
341
354
EXPECT_FALSE (executor.isGeneric ());
342
355
EXPECT_EQ (ExecutorRef::forDefaultActor (context->get <1 >()),
@@ -361,3 +374,115 @@ TEST(ActorTest, actorContention) {
361
374
EXPECT_PROGRESS (0 );
362
375
});
363
376
}
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