From 53b4b88c7125a3081e7607ea06c52dbed80856f2 Mon Sep 17 00:00:00 2001 From: Johan Nordlander Date: Thu, 24 Apr 2025 15:23:15 +0200 Subject: [PATCH 01/11] Debug traces --- base/rts/rts.c | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/base/rts/rts.c b/base/rts/rts.c index e24286f38..ea175b599 100644 --- a/base/rts/rts.c +++ b/base/rts/rts.c @@ -1587,13 +1587,18 @@ void wt_work_cb(uv_check_t *ev) { save_actor_state(current, m); m->value = r.value; // m->value holds the message result, $Actor b = FREEZE_waiting(m, MARK_RESULT); // so mark this and stop further m->waiting additions - while (b) { - b->B_Msg->value = r.value; - b->$waitsfor = NULL; - $Actor c = b->$next; - ENQ_ready(b); - rtsd_printf("## Waking up actor %ld : %s", b->$globkey, b->$class->$GCINFO); - b = c; + if (b) { + while (b) { + b->B_Msg->value = r.value; + b->$waitsfor = NULL; + $Actor c = b->$next; + ENQ_ready(b); + rtsd_printf("## Waking up actor %ld : %s", b->$globkey, b->$class->$GCINFO); + fprintf(stderr, "==== Result by actor %ld for msg %p, waking up client %ld\n", current->$globkey, m, b->$globkey); + b = c; + } + } else { + fprintf(stderr, "==== Result by actor %ld for msg %p, no waiting clients\n", current->$globkey, m); } rtsd_printf("## DONE actor %ld : %s", current->$globkey, current->$class->$GCINFO); if (DEQ_msg(current)) { @@ -1635,6 +1640,7 @@ void wt_work_cb(uv_check_t *ev) { $Actor c = b->$next; ENQ_ready(b); rtsd_printf("## Propagating exception to actor %ld : %s", b->$globkey, b->$class->$GCINFO); + fprintf(stderr, "==== Exception by actor %ld for msg %p, waking up client %ld\n", current->$globkey, m, b->$globkey); b = c; } if (DEQ_msg(current)) { @@ -1676,14 +1682,17 @@ void wt_work_cb(uv_check_t *ev) { assert(x != NULL); if (ADD_waiting(current, x)) { // x->cont is a proper $Cont: x is still being processed so current was added to x->waiting rtsd_printf("## AWAIT actor %ld : %s", current->$globkey, current->$class->$GCINFO); + fprintf(stderr, "---- AWAIT by client %ld on msg %p to actor %ld\n", current->$globkey, x, x->$to->$globkey); current->$waitsfor = x; } else if (EXCEPTIONAL(x)) { // x->cont == MARK_EXCEPTION: x->value holds the raised exception, current is not in x->waiting rtsd_printf("## AWAIT/fail actor %ld : %s", current->$globkey, current->$class->$GCINFO); + fprintf(stderr, "---- Immediate exception found by client %ld in msg %p to actor %ld\n", current->$globkey, x, x->$to->$globkey); m->$cont = &$Fail$instance; m->value = x->value; ENQ_ready(current); } else { // x->cont == MARK_RESULT: x->value holds the final response, current is not in x->waiting rtsd_printf("## AWAIT/wakeup actor %ld : %s", current->$globkey, current->$class->$GCINFO); + fprintf(stderr, "---- Immediate result found by client %ld in msg %p to actor %ld\n", current->$globkey, x, x->$to->$globkey); m->value = x->value; ENQ_ready(current); } @@ -2347,6 +2356,8 @@ int main(int argc, char **argv) { appname = argv[0]; pid = getpid(); + fprintf(stderr, "RTS-DEBUG\n"); + #ifndef _WIN32 // Do line buffered output setlinebuf(stdout); From bcc199891d13bc0a22574fadcd62db7b66248810 Mon Sep 17 00:00:00 2001 From: Kristian Larsson Date: Thu, 24 Apr 2025 15:42:08 +0200 Subject: [PATCH 02/11] Test debug branch of orchestron --- .github/workflows/test-app.yml | 14 +++++++++++++- .github/workflows/test.yml | 1 + 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test-app.yml b/.github/workflows/test-app.yml index 78afcec50..8cc6655a4 100644 --- a/.github/workflows/test-app.yml +++ b/.github/workflows/test-app.yml @@ -9,6 +9,9 @@ on: required: false type: string default: "amd64" + branch: + required: false + type: string jobs: test-app: @@ -26,11 +29,20 @@ jobs: run: | sudo apt install -y ./deb/acton_*.deb acton --version - - name: "Clone app repo" + - name: "Clone app repo with default branch" + if: inputs.branch == '' + uses: actions/checkout@v4 + with: + repository: ${{ inputs.repo_url }} + path: app + + - name: "Clone app repo with specific branch" + if: inputs.branch != '' uses: actions/checkout@v4 with: repository: ${{ inputs.repo_url }} path: app + ref: ${{ inputs.branch }} - name: "Compile acton program" run: | cd app diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 3596c033b..193b2eae9 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -528,6 +528,7 @@ jobs: uses: "./.github/workflows/test-app.yml" with: repo_url: "orchestron-orchestrator/orchestron" + branch: "debug" test-app-snappy: needs: build-debs From 3b00cdb168ce16a1a7b752fb0f06d067684b9662 Mon Sep 17 00:00:00 2001 From: Kristian Larsson Date: Thu, 24 Apr 2025 15:42:16 +0200 Subject: [PATCH 03/11] Directly invoke relevant orchestron test --- .github/workflows/test-app.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/test-app.yml b/.github/workflows/test-app.yml index 8cc6655a4..5a3ba9226 100644 --- a/.github/workflows/test-app.yml +++ b/.github/workflows/test-app.yml @@ -47,5 +47,6 @@ jobs: run: | cd app acton build + for ((i = 0; i < 1000; i++)); do out/bin/test_ttt_callbacks; echo "\n\n\n"; done acton test acton test perf From 0bfa644d15e2f4b9d4e61c43f6c5cf659ad8bf70 Mon Sep 17 00:00:00 2001 From: Johan Nordlander Date: Thu, 24 Apr 2025 20:34:32 +0200 Subject: [PATCH 04/11] Extra trace --- base/rts/rts.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/base/rts/rts.c b/base/rts/rts.c index ea175b599..224f3ec89 100644 --- a/base/rts/rts.c +++ b/base/rts/rts.c @@ -978,7 +978,10 @@ void FLUSH_outgoing_local($Actor self) { if (m->$baseline == self->B_Msg->$baseline) { $Actor to = m->$to; if (ENQ_msg(m, to)) { + fprintf(stderr, ">>>> ASYNC msg %p from actor %ld wakes up target %ld\n", m, self->$globkey, to->$globkey); ENQ_ready(to); + } else { + fprintf(stderr, ">>>> ASYNC msg %p from actor %ld queued on target %ld\n", m, self->$globkey, to->$globkey); } dest = to->$globkey; } else { From 330292d3639cc399dc7c23b30ea2e8faaed82e73 Mon Sep 17 00:00:00 2001 From: Johan Nordlander Date: Fri, 25 Apr 2025 10:16:01 +0200 Subject: [PATCH 05/11] Another trace bit --- base/rts/rts.c | 1 + 1 file changed, 1 insertion(+) diff --git a/base/rts/rts.c b/base/rts/rts.c index 224f3ec89..a37642ed2 100644 --- a/base/rts/rts.c +++ b/base/rts/rts.c @@ -1558,6 +1558,7 @@ void wt_work_cb(uv_check_t *ev) { wctx->jump0 = wctx->jump_top; } rtsd_printf("## Running actor %ld : %s", current->$globkey, current->$class->$GCINFO); + fprintf(stderr, "RUNNING actor %ld : %s\n", current->$globkey, current->$class->$GCINFO); r = cont->$class->__call__(cont, val); uv_clock_gettime(UV_CLOCK_MONOTONIC, &ts2); From 5bc18c33d30e4676e8583e3ff37455478e41221c Mon Sep 17 00:00:00 2001 From: Johan Nordlander Date: Fri, 25 Apr 2025 15:52:03 +0200 Subject: [PATCH 06/11] Yet more rts traces --- base/rts/rts.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/base/rts/rts.c b/base/rts/rts.c index a37642ed2..274ddcc90 100644 --- a/base/rts/rts.c +++ b/base/rts/rts.c @@ -978,7 +978,7 @@ void FLUSH_outgoing_local($Actor self) { if (m->$baseline == self->B_Msg->$baseline) { $Actor to = m->$to; if (ENQ_msg(m, to)) { - fprintf(stderr, ">>>> ASYNC msg %p from actor %ld wakes up target %ld\n", m, self->$globkey, to->$globkey); + fprintf(stderr, ">>>> ASYNC msg %p from actor %ld WAKEUP target %ld\n", m, self->$globkey, to->$globkey); ENQ_ready(to); } else { fprintf(stderr, ">>>> ASYNC msg %p from actor %ld queued on target %ld\n", m, self->$globkey, to->$globkey); @@ -1003,6 +1003,7 @@ void handle_timeout() { if (m) { rtsd_printf("## Dequeued timed msg with baseline %ld (now is %ld)", m->$baseline, now); if (ENQ_msg(m, m->$to)) { + fprintf(stderr, " Timed WAKEUP of actor %ld\n", m->$to->$globkey); int wtid = ENQ_ready(m->$to); wake_wt(wtid); } @@ -1422,6 +1423,7 @@ void BOOTSTRAP(int argc, char *argv[]) { } #endif if (ENQ_msg(m, root_actor)) { + fprintf(stderr, "Bootstrap WAKEUP %ld\n", root_actor->$globkey); ENQ_ready(root_actor); } @@ -1558,7 +1560,7 @@ void wt_work_cb(uv_check_t *ev) { wctx->jump0 = wctx->jump_top; } rtsd_printf("## Running actor %ld : %s", current->$globkey, current->$class->$GCINFO); - fprintf(stderr, "RUNNING actor %ld : %s\n", current->$globkey, current->$class->$GCINFO); + fprintf(stderr, "Run %ld msg %p\n", current->$globkey, m); r = cont->$class->__call__(cont, val); uv_clock_gettime(UV_CLOCK_MONOTONIC, &ts2); @@ -1598,14 +1600,15 @@ void wt_work_cb(uv_check_t *ev) { $Actor c = b->$next; ENQ_ready(b); rtsd_printf("## Waking up actor %ld : %s", b->$globkey, b->$class->$GCINFO); - fprintf(stderr, "==== Result by actor %ld for msg %p, waking up client %ld\n", current->$globkey, m, b->$globkey); + fprintf(stderr, "==== Result by actor %ld for msg %p, WAKEUP client %ld\n", current->$globkey, m, b->$globkey); b = c; } } else { - fprintf(stderr, "==== Result by actor %ld for msg %p, no waiting clients\n", current->$globkey, m); + fprintf(stderr, "==== Result by actor %ld for msg %p, no clients\n", current->$globkey, m); } rtsd_printf("## DONE actor %ld : %s", current->$globkey, current->$class->$GCINFO); if (DEQ_msg(current)) { + fprintf(stderr, " More work for actor %ld, keep AWAKE\n", current->$globkey); ENQ_ready(current); } break; @@ -1648,6 +1651,7 @@ void wt_work_cb(uv_check_t *ev) { b = c; } if (DEQ_msg(current)) { + fprintf(stderr, " More work for actor %ld after exception, keep AWAKE\n", current->$globkey); ENQ_ready(current); } rtsd_printf("## Done handling failed actor %ld : %s", current->$globkey, current->$class->$GCINFO); From 4e0311cc04f365707e3dcc163b0e47d0a17e9dd7 Mon Sep 17 00:00:00 2001 From: Johan Nordlander Date: Sat, 26 Apr 2025 20:19:40 +0200 Subject: [PATCH 07/11] Extra checks in ENQ/DEQ --- base/rts/q.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/base/rts/q.c b/base/rts/q.c index 8b2b4fcd8..4badd08d3 100644 --- a/base/rts/q.c +++ b/base/rts/q.c @@ -17,6 +17,10 @@ int ENQ_ready($Actor a) { #elif defined MPMC && MPMC == 2 int ENQ_ready($Actor a) { int i = a->$affinity; + $Actor b = a ? a->$waitsfor : NULL; + if (b != NULL) { + fprintf(stderr, "????????????? ENQ_ready(%d) inserts actor %ld that waits for actor %ld!\n", i, a->$globkey, b->$globkey); + } spinlock_lock(&rqs[i].lock); if (rqs[i].tail) { rqs[i].tail->$next = a; @@ -91,7 +95,12 @@ int ENQ_ready($Actor a) { rqs[idx].tail = NULL; } rqs[idx].count--; + $Actor b = res ? res->$waitsfor : NULL; spinlock_unlock(&rqs[idx].lock); + if (b != NULL) { + fprintf(stderr, "????????????? DEQ_ready(%d) returns actor %ld that waits for actor %ld!\n", idx, res->$globkey, b->$globkey); + } +// assert(res->$waitsfor == NULL); return res; } #else From 523c4d9daa370423424c0d91e9bca1d3478dc128 Mon Sep 17 00:00:00 2001 From: Johan Nordlander Date: Sat, 26 Apr 2025 21:13:05 +0200 Subject: [PATCH 08/11] Fix traces --- base/rts/q.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/base/rts/q.c b/base/rts/q.c index 4badd08d3..6c3de4c8b 100644 --- a/base/rts/q.c +++ b/base/rts/q.c @@ -17,9 +17,9 @@ int ENQ_ready($Actor a) { #elif defined MPMC && MPMC == 2 int ENQ_ready($Actor a) { int i = a->$affinity; - $Actor b = a ? a->$waitsfor : NULL; - if (b != NULL) { - fprintf(stderr, "????????????? ENQ_ready(%d) inserts actor %ld that waits for actor %ld!\n", i, a->$globkey, b->$globkey); + B_Msg m = a ? a->$waitsfor : NULL; + if (m != NULL) { + fprintf(stderr, "????????????? ENQ_ready inserts actor %ld that waits for msg %p to actor %ld!\n", a->$globkey, m, m->$to->$globkey); } spinlock_lock(&rqs[i].lock); if (rqs[i].tail) { @@ -95,10 +95,10 @@ int ENQ_ready($Actor a) { rqs[idx].tail = NULL; } rqs[idx].count--; - $Actor b = res ? res->$waitsfor : NULL; + B_Msg m = res ? res->$waitsfor : NULL; spinlock_unlock(&rqs[idx].lock); - if (b != NULL) { - fprintf(stderr, "????????????? DEQ_ready(%d) returns actor %ld that waits for actor %ld!\n", idx, res->$globkey, b->$globkey); + if (m != NULL) { + fprintf(stderr, "????????????? DEQ_ready returns actor %ld that waits for msg %p to actor %ld!\n", res->$globkey, m, m->$to->$globkey); } // assert(res->$waitsfor == NULL); return res; From 28e415950fadaf51effb19fdd5746f72e2706e0d Mon Sep 17 00:00:00 2001 From: Johan Nordlander Date: Sat, 26 Apr 2025 21:34:45 +0200 Subject: [PATCH 09/11] Adjust trace position --- base/rts/rts.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/base/rts/rts.c b/base/rts/rts.c index 274ddcc90..a908b481c 100644 --- a/base/rts/rts.c +++ b/base/rts/rts.c @@ -1598,9 +1598,9 @@ void wt_work_cb(uv_check_t *ev) { b->B_Msg->value = r.value; b->$waitsfor = NULL; $Actor c = b->$next; + fprintf(stderr, "==== Result by actor %ld for msg %p, WAKEUP client %ld\n", current->$globkey, m, b->$globkey); ENQ_ready(b); rtsd_printf("## Waking up actor %ld : %s", b->$globkey, b->$class->$GCINFO); - fprintf(stderr, "==== Result by actor %ld for msg %p, WAKEUP client %ld\n", current->$globkey, m, b->$globkey); b = c; } } else { From 5d079fede21dc65c7aae16baab9746c0357eb2d4 Mon Sep 17 00:00:00 2001 From: Johan Nordlander Date: Sun, 27 Apr 2025 09:39:23 +0200 Subject: [PATCH 10/11] Detail msg waiting list --- base/rts/rts.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/base/rts/rts.c b/base/rts/rts.c index a908b481c..003c823ac 100644 --- a/base/rts/rts.c +++ b/base/rts/rts.c @@ -1560,7 +1560,7 @@ void wt_work_cb(uv_check_t *ev) { wctx->jump0 = wctx->jump_top; } rtsd_printf("## Running actor %ld : %s", current->$globkey, current->$class->$GCINFO); - fprintf(stderr, "Run %ld msg %p\n", current->$globkey, m); + fprintf(stderr, "Run %ld msg %p (%p)\n", current->$globkey, m, m->$waiting); r = cont->$class->__call__(cont, val); uv_clock_gettime(UV_CLOCK_MONOTONIC, &ts2); @@ -1592,6 +1592,7 @@ void wt_work_cb(uv_check_t *ev) { case $RDONE: { save_actor_state(current, m); m->value = r.value; // m->value holds the message result, + fprintf(stderr, " (Result by actor %ld for msg %p, waiting: %p)\n", current->$globkey, m, m->$waiting); $Actor b = FREEZE_waiting(m, MARK_RESULT); // so mark this and stop further m->waiting additions if (b) { while (b) { From 4d24a348ac3c28708c28b16059087a43c2905361 Mon Sep 17 00:00:00 2001 From: Johan Nordlander Date: Mon, 28 Apr 2025 09:58:36 +0200 Subject: [PATCH 11/11] Extra trace details --- base/rts/rts.c | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/base/rts/rts.c b/base/rts/rts.c index 003c823ac..f70676305 100644 --- a/base/rts/rts.c +++ b/base/rts/rts.c @@ -571,13 +571,18 @@ bool ADD_waiting($Actor a, B_Msg m) { assert(m != NULL); + $Actor prev; spinlock_lock(&m->$wait_lock); if (!FROZEN(m)) { + prev = m->$waiting; a->$next = m->$waiting; m->$waiting = a; did_add = true; } spinlock_unlock(&m->$wait_lock); + if (did_add) { + fprintf(stderr, " (wrote waiting %p to %p, was %p)\n", a, m, prev); + } return did_add; } @@ -798,6 +803,7 @@ B_Msg $ASYNC($Actor to, $Cont cont) { B_Msg m = B_MsgG_newXX(to, cont, baseline, &$Done$instance); if (self) { // $ASYNC called by actor code m->$baseline = self->B_Msg->$baseline; + fprintf(stderr, " Outgoing msg %p by actor %ld (waiting: %p)\n", m, self->$globkey, m->$waiting); PUSH_outgoing(self, m); } else { // $ASYNC called by the event loop m->$baseline = current_time(); @@ -978,10 +984,10 @@ void FLUSH_outgoing_local($Actor self) { if (m->$baseline == self->B_Msg->$baseline) { $Actor to = m->$to; if (ENQ_msg(m, to)) { - fprintf(stderr, ">>>> ASYNC msg %p from actor %ld WAKEUP target %ld\n", m, self->$globkey, to->$globkey); + fprintf(stderr, ">>>> ASYNC msg %p from actor %ld WAKEUP target %ld (waiting: %p)\n", m, self->$globkey, to->$globkey, m->$waiting); ENQ_ready(to); } else { - fprintf(stderr, ">>>> ASYNC msg %p from actor %ld queued on target %ld\n", m, self->$globkey, to->$globkey); + fprintf(stderr, ">>>> ASYNC msg %p from actor %ld queued on target %ld (waiting: %p)\n", m, self->$globkey, to->$globkey, m->$waiting); } dest = to->$globkey; } else { @@ -1559,8 +1565,8 @@ void wt_work_cb(uv_check_t *ev) { if (!wctx->jump0) { wctx->jump0 = wctx->jump_top; } - rtsd_printf("## Running actor %ld : %s", current->$globkey, current->$class->$GCINFO); - fprintf(stderr, "Run %ld msg %p (%p)\n", current->$globkey, m, m->$waiting); + rtsd_printf("## Running actor %ld : %s", wctx->id, current->$globkey, current->$class->$GCINFO); + fprintf(stderr, "(%d) Run %ld msg %p (%p)\n", wctx->id, current->$globkey, m, m->$waiting); r = cont->$class->__call__(cont, val); uv_clock_gettime(UV_CLOCK_MONOTONIC, &ts2); @@ -1592,24 +1598,24 @@ void wt_work_cb(uv_check_t *ev) { case $RDONE: { save_actor_state(current, m); m->value = r.value; // m->value holds the message result, - fprintf(stderr, " (Result by actor %ld for msg %p, waiting: %p)\n", current->$globkey, m, m->$waiting); + fprintf(stderr, " (%d) (Result by actor %ld for msg %p, waiting: %p)\n", wctx->id, current->$globkey, m, m->$waiting); $Actor b = FREEZE_waiting(m, MARK_RESULT); // so mark this and stop further m->waiting additions if (b) { while (b) { b->B_Msg->value = r.value; b->$waitsfor = NULL; $Actor c = b->$next; - fprintf(stderr, "==== Result by actor %ld for msg %p, WAKEUP client %ld\n", current->$globkey, m, b->$globkey); + fprintf(stderr, "==== (%d) Result by actor %ld for msg %p, WAKEUP client %ld\n", wctx->id, current->$globkey, m, b->$globkey); ENQ_ready(b); rtsd_printf("## Waking up actor %ld : %s", b->$globkey, b->$class->$GCINFO); b = c; } } else { - fprintf(stderr, "==== Result by actor %ld for msg %p, no clients\n", current->$globkey, m); + fprintf(stderr, "==== (%d) Result by actor %ld for msg %p, no clients\n", wctx->id, current->$globkey, m); } rtsd_printf("## DONE actor %ld : %s", current->$globkey, current->$class->$GCINFO); if (DEQ_msg(current)) { - fprintf(stderr, " More work for actor %ld, keep AWAKE\n", current->$globkey); + fprintf(stderr, " (%d) More work for actor %ld, keep AWAKE\n", wctx->id, current->$globkey); ENQ_ready(current); } break; @@ -1691,17 +1697,17 @@ void wt_work_cb(uv_check_t *ev) { assert(x != NULL); if (ADD_waiting(current, x)) { // x->cont is a proper $Cont: x is still being processed so current was added to x->waiting rtsd_printf("## AWAIT actor %ld : %s", current->$globkey, current->$class->$GCINFO); - fprintf(stderr, "---- AWAIT by client %ld on msg %p to actor %ld\n", current->$globkey, x, x->$to->$globkey); + fprintf(stderr, "---- (%d) AWAIT by client %ld on msg %p to actor %ld\n", wctx->id, current->$globkey, x, x->$to->$globkey); current->$waitsfor = x; } else if (EXCEPTIONAL(x)) { // x->cont == MARK_EXCEPTION: x->value holds the raised exception, current is not in x->waiting rtsd_printf("## AWAIT/fail actor %ld : %s", current->$globkey, current->$class->$GCINFO); - fprintf(stderr, "---- Immediate exception found by client %ld in msg %p to actor %ld\n", current->$globkey, x, x->$to->$globkey); + fprintf(stderr, "---- (%d) Immediate exception found by client %ld in msg %p to actor %ld\n", wctx->id, current->$globkey, x, x->$to->$globkey); m->$cont = &$Fail$instance; m->value = x->value; ENQ_ready(current); } else { // x->cont == MARK_RESULT: x->value holds the final response, current is not in x->waiting rtsd_printf("## AWAIT/wakeup actor %ld : %s", current->$globkey, current->$class->$GCINFO); - fprintf(stderr, "---- Immediate result found by client %ld in msg %p to actor %ld\n", current->$globkey, x, x->$to->$globkey); + fprintf(stderr, "---- (%d) Immediate result found by client %ld in msg %p to actor %ld\n", wctx->id, current->$globkey, x, x->$to->$globkey); m->value = x->value; ENQ_ready(current); }