Cygwin: timerfd: rework implementation
timerfd_tracker and timerfd_shared classes:
- Just because handles are shared, we don't have to store them in
shared memory. Move share handles into timerfd_tracker class.
- Drop shared instance counter since it's not required anymore.
timerfd_shared only stores the actual timer data.
- Drop timerfd_shared::create, just set clock id.
- Drop timerfd_shared::dtor, it's not required anymore.
- Drop timerfd_tracker::close, just call dtor where required.
- Rename timerfd_tracker::increment_instances to timerfd_tracker::dup.
It's the only reason it exists...
- timerfd_tracker::dtor now checks the non-shared pointers for NULL
before attempting to close them.
- timerfd_tracker::dtor handles decrementing the local instance count
by itself.
- Add a method timerfd_tracker::init_fixup_after_fork_exec to set
non-shared pointers to NULL. Together with the dtor patches it
fixes a problem with close_on_exec timerfd descriptors.
- Fix a bug in handling the thread synchronization event. It's
actually nice to create it before using it...
- Drop using sec_none{_nih} in InitializeObjectAttributes. It's
an unnecessary roundabout route just to get a NULL pointer.
- Slightly rework timechange window handling.
- Add more comments to explain what happens.
fhandler_timerfd:
- Drop cnew macro, it just hides what happens.
- fhandler_timerfd::fixup_after_exec now calls
timerfd_tracker::init_fixup_after_fork_exec first, so a subsequent
call to timerfd_tracker::dtor only works on valid handles.
- fhandler_timerfd::close directly calls timerfd_tracker::dtor now.
- Drop dtor call in fhandler_timerfd destructor.
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
This commit is contained in:
@@ -30,21 +30,17 @@ fhandler_timerfd::get_proc_fd_name (char *buf)
|
||||
/* The timers connected to a descriptor are stored on the cygheap
|
||||
together with their fhandler. */
|
||||
|
||||
#define cnew(name, ...) \
|
||||
({ \
|
||||
void* ptr = (void*) ccalloc (HEAP_FHANDLER, 1, sizeof (name)); \
|
||||
ptr ? new (ptr) name (__VA_ARGS__) : NULL; \
|
||||
})
|
||||
|
||||
int
|
||||
fhandler_timerfd::timerfd (clockid_t clock_id, int flags)
|
||||
{
|
||||
timerfd_tracker *tfd = cnew (timerfd_tracker);
|
||||
timerfd_tracker *tfd = (timerfd_tracker *)
|
||||
ccalloc (HEAP_FHANDLER, 1, sizeof (timerfd_tracker));
|
||||
if (!tfd)
|
||||
{
|
||||
set_errno (ENOMEM);
|
||||
return -1;
|
||||
}
|
||||
new (tfd) timerfd_tracker ();
|
||||
int ret = tfd->create (clock_id);
|
||||
if (ret < 0)
|
||||
{
|
||||
@@ -178,7 +174,7 @@ fhandler_timerfd::dup (fhandler_base *child, int flags)
|
||||
__try
|
||||
{
|
||||
timerfd_tracker *tfd = (timerfd_tracker *) fhc->timerid;
|
||||
tfd->increment_instances ();
|
||||
tfd->dup ();
|
||||
ret = 0;
|
||||
}
|
||||
__except (EFAULT) {}
|
||||
@@ -234,8 +230,9 @@ fhandler_timerfd::fixup_after_exec ()
|
||||
__try
|
||||
{
|
||||
timerfd_tracker *tfd = (timerfd_tracker *) timerid;
|
||||
tfd->init_fixup_after_fork_exec ();
|
||||
if (close_on_exec ())
|
||||
tfd->decrement_instances ();
|
||||
timerfd_tracker::dtor (tfd);
|
||||
else
|
||||
tfd->fixup_after_exec ();
|
||||
}
|
||||
@@ -243,17 +240,6 @@ fhandler_timerfd::fixup_after_exec ()
|
||||
__endtry
|
||||
}
|
||||
|
||||
fhandler_timerfd::~fhandler_timerfd ()
|
||||
{
|
||||
__try
|
||||
{
|
||||
timerfd_tracker *tfd = (timerfd_tracker *) timerid;
|
||||
timerfd_tracker::dtor (tfd);
|
||||
}
|
||||
__except (EFAULT) {}
|
||||
__endtry
|
||||
}
|
||||
|
||||
int
|
||||
fhandler_timerfd::close ()
|
||||
{
|
||||
@@ -262,7 +248,7 @@ fhandler_timerfd::close ()
|
||||
__try
|
||||
{
|
||||
timerfd_tracker *tfd = (timerfd_tracker *) timerid;
|
||||
tfd->close ();
|
||||
timerfd_tracker::dtor (tfd);
|
||||
ret = 0;
|
||||
}
|
||||
__except (EFAULT) {}
|
||||
|
||||
Reference in New Issue
Block a user