Skip to content

Async timer cannot be start from sync timer handler #13224

Open
@linev

Description

@linev

Check duplicate issues.

  • Checked for duplicates

Description

Class TProcessEventTimer is async timer and used inside TTreePlayer::Process() method to enable events processing during TTree::Draw(). Main problem - all data handling in the THttpServer performed inside THttpTimer handler - including TTree::Draw() invoked from RBrowser. So to say one cannot initiate async timer inside sync timer handler.

There is simple solution. In TUnixSystem::DispatchTimers(Bool_t mode) one should change line 2947:
https://github.com/root-project/root/blob/master/core/unix/src/TUnixSystem.cxx#L2947

fInsideNotify = !mode; 

Means handling of "normal" sync timers is not dangerous and do not block functionality to reset async timer inside
TUnixSystem::ResetTimer which implemented as:

void TUnixSystem::ResetTimer(TTimer *ti)
{
   if (!fInsideNotify && ti && ti->IsAsync())
      UnixSetitimer(NextTimeOut(kFALSE));
}

Another solution - let process THttpServer events differently - not in the THttpTimer handler.
But this means extension of TSystem::DispatchOneEvent method. Like adding generic event handlers called every time gSystem->ProcessEvents() is called.

Reproducer

Not provided

ROOT version

master

Installation method

build from source

Operating system

OpenSUSE Linux

Additional context

No response

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions