From c7c9d420f2bf8514ae1eca2124c4ef19219cdf27 Mon Sep 17 00:00:00 2001
From: Iskander Sagitov <i.sagitov@tarantool.org>
Date: Fri, 14 May 2021 10:19:31 +0300
Subject: [PATCH] fiber: set fiber->csw = 0 for every creating fiber

It is strange to create a new fiber and see that it has yielded 100
times, when in fact it never actually did it.

The patch makes fiber->csw = 0 for each created fiber.

Follow-up #5799
---
 changelogs/unreleased/gh-5799-set-csw-is-0-for-new-fibers.md | 3 +++
 src/lib/core/fiber.c                                         | 1 +
 test/app/gh-5799-fiber-info.result                           | 4 +---
 test/app/gh-5799-fiber-info.test.lua                         | 4 +---
 4 files changed, 6 insertions(+), 6 deletions(-)
 create mode 100644 changelogs/unreleased/gh-5799-set-csw-is-0-for-new-fibers.md

diff --git a/changelogs/unreleased/gh-5799-set-csw-is-0-for-new-fibers.md b/changelogs/unreleased/gh-5799-set-csw-is-0-for-new-fibers.md
new file mode 100644
index 0000000000..c48eb36d97
--- /dev/null
+++ b/changelogs/unreleased/gh-5799-set-csw-is-0-for-new-fibers.md
@@ -0,0 +1,3 @@
+## feature/fiber
+
+* Previously csw (Context SWitch) of new fiber can be more than 0, now it is always 0 (gh-5799).
diff --git a/src/lib/core/fiber.c b/src/lib/core/fiber.c
index 216f8be5df..759c7da6a7 100644
--- a/src/lib/core/fiber.c
+++ b/src/lib/core/fiber.c
@@ -1260,6 +1260,7 @@ fiber_new_ex(const char *name, const struct fiber_attr *fiber_attr,
 	fiber->fid = cord->next_fid;
 	fiber_set_name(fiber, name);
 	register_fid(fiber);
+	fiber->csw = 0;
 
 	cord->next_fid++;
 	assert(cord->next_fid > FIBER_ID_MAX_RESERVED);
diff --git a/test/app/gh-5799-fiber-info.result b/test/app/gh-5799-fiber-info.result
index 716ac9a246..7012395729 100644
--- a/test/app/gh-5799-fiber-info.result
+++ b/test/app/gh-5799-fiber-info.result
@@ -26,11 +26,9 @@ test_run:cmd('setopt delimiter ";"')
  | ...
 for i=1,100 do
     fibers[i] = fiber.new(function()
-        local start_csw = fiber.info()[fiber.self():id()].csw
         for j=1,10 do
             fiber.yield()
-            if j + start_csw == fiber.self():csw() and
-               j + start_csw == fiber.self():info().csw then
+            if j == fiber.self():csw() and j == fiber.self():info().csw then
                 csw_check_counter = csw_check_counter + 1
             end
         end
diff --git a/test/app/gh-5799-fiber-info.test.lua b/test/app/gh-5799-fiber-info.test.lua
index 588f760c40..ff4df3b638 100644
--- a/test/app/gh-5799-fiber-info.test.lua
+++ b/test/app/gh-5799-fiber-info.test.lua
@@ -10,11 +10,9 @@ fibers = {}
 test_run:cmd('setopt delimiter ";"')
 for i=1,100 do
     fibers[i] = fiber.new(function()
-        local start_csw = fiber.info()[fiber.self():id()].csw
         for j=1,10 do
             fiber.yield()
-            if j + start_csw == fiber.self():csw() and
-               j + start_csw == fiber.self():info().csw then
+            if j == fiber.self():csw() and j == fiber.self():info().csw then
                 csw_check_counter = csw_check_counter + 1
             end
         end
-- 
GitLab