Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

static JSContext issue with multiple threads #21

Open
wants to merge 7 commits into
base: master
Choose a base branch
from

Conversation

BlixLT
Copy link

@BlixLT BlixLT commented Feb 1, 2021

It seems that static JSContext (Iterator.rruleContext) is causing problems when there are calculations on different threads. It happens, when in some (not so rare) cases two context?.evaluateScript("var rule = new RRule({ \(ruleJSONString) })") is being called one after another and only then two dates calculations

        guard let allOccurrences = context?.evaluateScript("rule.all()").toArray() as? [Date] else {
            return []
        }

also one after another. And in such case the second new RRule({ \(ruleJSONString) }) overwrites first RRule's properties in static JSContext and first calculation uses wrong parameters.
One way to avoid this issue would be reduce evaluateScript calls (create a rule and evaluate it in one evaluateScript call. I couldn't reproduce this issue after such modification):
guard let allOccurrences = Iterator.rruleContext?.evaluateScript("new RRule({ \(ruleJSONString) }).all()").toArray() as? [Date] else {
instead of

        let _ = Iterator.rruleContext?.evaluateScript("var rule = new RRule({ \(ruleJSONString) })")
         guard let allOccurrences = Iterator.rruleContext?.evaluateScript("rule.all()").toArray() as? [Date] else {

I also implemented a test, that could help quite easily reproduce the issue: you can launch Sample app and make testRRuleIteratorMultipleThreads() call in the viewDidLoad(). There are 2 background thread that generates rrule and checks the returned dates. If everything worked as expected, then there would be no logs in console similar to print("dates mismatch, got: ", occurrences.first, ", expected: ", startDate) - first date returned by rrule's Iterator.rruleContext?.evaluateScript should be equal to its startDate. But in some 5th-10th iteration one thread overrides other's rrule parameters and wrong parameters are being used. I hope I made myself clear.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant