Re: [asterisk-dev] [Code Review] 4465: Update the kqueue timing module to conform to current timer API.

2015-03-27 Thread Matt Jordan


 On March 23, 2015, 9:57 a.m., Matt Jordan wrote:
  Ship It!

As an addendum to this, this patch does not merge cleanly on Asterisk 11. As 
such, I'll be merging this to Asterisk 13+.

Alas, as I don't run a system that can compile kqueue, it's kind of hard for me 
to backport that. If someone would like a backport of this patch to 11, a 
review should be put up for that branch.


- Matt


---
This is an automatically generated e-mail. To reply, visit:
https://reviewboard.asterisk.org/r/4465/#review14766
---


On March 18, 2015, 11:44 a.m., Justin T. Gibbs wrote:
 
 ---
 This is an automatically generated e-mail. To reply, visit:
 https://reviewboard.asterisk.org/r/4465/
 ---
 
 (Updated March 18, 2015, 11:44 a.m.)
 
 
 Review request for Asterisk Developers.
 
 
 Bugs: ASTERISK-24857
 https://issues.asterisk.org/jira/browse/ASTERISK-24857
 
 
 Repository: Asterisk
 
 
 Description
 ---
 
 Update the kqueue timing module to conform to current timer API.
 
 This fixes issues with using the kqueue timing source on Asterisk 13
 on FreeBSD 10.
 
 res_timing_kqueue.c:
   Remove support for kevent64().  The values used to support Asterisk
   timers fit within 32bits and so can be handled on all platforms via
   kevent().
 
   Provide debug logging for, but do not track, unacked events.  This
   matches the behavior of all other timer implementations.
 
   Implement continuous mode by triggering and leaving active, a user
   event.  This ensures that the file descriptor for the timer returns
   immediately from poll(), without placing the load of a high speed
   timer on the kernel.
 
   In kqueue_timer_get_max_rate(), don't overstate the capability of
   the timer.  On some platforms, UINT_MAX is greater than INTPTR_MAX,
   the largest integer type kqueue supports for timers.
 
   In kqueue_timer_get_event(), assume the caller woke up from poll()
   and just return the mode the timer is currently in.  This matches
   all other timer implementations.
 
   Adjust the test code now that unacked events are not tracked.
 
 
 Diffs
 -
 
   /trunk/res/res_timing_kqueue.c 432637 
 
 Diff: https://reviewboard.asterisk.org/r/4465/diff/
 
 
 Testing
 ---
 
 Asterisk 13.2.0 on FreeBSD 10-stable: timing test, pjsip incoming/outgoing 
 calls, voicemail prompts and recordings.  All of the above failed without 
 these changes.
 
 
 Thanks,
 
 Justin T. Gibbs
 


-- 
_
-- Bandwidth and Colocation Provided by http://www.api-digital.com --

asterisk-dev mailing list
To UNSUBSCRIBE or update options visit:
   http://lists.digium.com/mailman/listinfo/asterisk-dev

Re: [asterisk-dev] [Code Review] 4465: Update the kqueue timing module to conform to current timer API.

2015-03-27 Thread Justin T. Gibbs

---
This is an automatically generated e-mail. To reply, visit:
https://reviewboard.asterisk.org/r/4465/
---

(Updated March 27, 2015, 9:41 a.m.)


Status
--

This change has been marked as submitted.


Review request for Asterisk Developers.


Changes
---

Committed in revision 433574


Bugs: ASTERISK-24857
https://issues.asterisk.org/jira/browse/ASTERISK-24857


Repository: Asterisk


Description
---

Update the kqueue timing module to conform to current timer API.

This fixes issues with using the kqueue timing source on Asterisk 13
on FreeBSD 10.

res_timing_kqueue.c:
Remove support for kevent64().  The values used to support Asterisk
timers fit within 32bits and so can be handled on all platforms via
kevent().

Provide debug logging for, but do not track, unacked events.  This
matches the behavior of all other timer implementations.

Implement continuous mode by triggering and leaving active, a user
event.  This ensures that the file descriptor for the timer returns
immediately from poll(), without placing the load of a high speed
timer on the kernel.

In kqueue_timer_get_max_rate(), don't overstate the capability of
the timer.  On some platforms, UINT_MAX is greater than INTPTR_MAX,
the largest integer type kqueue supports for timers.

In kqueue_timer_get_event(), assume the caller woke up from poll()
and just return the mode the timer is currently in.  This matches
all other timer implementations.

Adjust the test code now that unacked events are not tracked.


Diffs
-

  /trunk/res/res_timing_kqueue.c 432637 

Diff: https://reviewboard.asterisk.org/r/4465/diff/


Testing
---

Asterisk 13.2.0 on FreeBSD 10-stable: timing test, pjsip incoming/outgoing 
calls, voicemail prompts and recordings.  All of the above failed without these 
changes.


Thanks,

Justin T. Gibbs

-- 
_
-- Bandwidth and Colocation Provided by http://www.api-digital.com --

asterisk-dev mailing list
To UNSUBSCRIBE or update options visit:
   http://lists.digium.com/mailman/listinfo/asterisk-dev

Re: [asterisk-dev] [Code Review] 4465: Update the kqueue timing module to conform to current timer API.

2015-03-23 Thread Matt Jordan

---
This is an automatically generated e-mail. To reply, visit:
https://reviewboard.asterisk.org/r/4465/#review14766
---

Ship it!


Ship It!

- Matt Jordan


On March 18, 2015, 11:44 a.m., Justin T. Gibbs wrote:
 
 ---
 This is an automatically generated e-mail. To reply, visit:
 https://reviewboard.asterisk.org/r/4465/
 ---
 
 (Updated March 18, 2015, 11:44 a.m.)
 
 
 Review request for Asterisk Developers.
 
 
 Bugs: ASTERISK-24857
 https://issues.asterisk.org/jira/browse/ASTERISK-24857
 
 
 Repository: Asterisk
 
 
 Description
 ---
 
 Update the kqueue timing module to conform to current timer API.
 
 This fixes issues with using the kqueue timing source on Asterisk 13
 on FreeBSD 10.
 
 res_timing_kqueue.c:
   Remove support for kevent64().  The values used to support Asterisk
   timers fit within 32bits and so can be handled on all platforms via
   kevent().
 
   Provide debug logging for, but do not track, unacked events.  This
   matches the behavior of all other timer implementations.
 
   Implement continuous mode by triggering and leaving active, a user
   event.  This ensures that the file descriptor for the timer returns
   immediately from poll(), without placing the load of a high speed
   timer on the kernel.
 
   In kqueue_timer_get_max_rate(), don't overstate the capability of
   the timer.  On some platforms, UINT_MAX is greater than INTPTR_MAX,
   the largest integer type kqueue supports for timers.
 
   In kqueue_timer_get_event(), assume the caller woke up from poll()
   and just return the mode the timer is currently in.  This matches
   all other timer implementations.
 
   Adjust the test code now that unacked events are not tracked.
 
 
 Diffs
 -
 
   /trunk/res/res_timing_kqueue.c 432637 
 
 Diff: https://reviewboard.asterisk.org/r/4465/diff/
 
 
 Testing
 ---
 
 Asterisk 13.2.0 on FreeBSD 10-stable: timing test, pjsip incoming/outgoing 
 calls, voicemail prompts and recordings.  All of the above failed without 
 these changes.
 
 
 Thanks,
 
 Justin T. Gibbs
 


-- 
_
-- Bandwidth and Colocation Provided by http://www.api-digital.com --

asterisk-dev mailing list
To UNSUBSCRIBE or update options visit:
   http://lists.digium.com/mailman/listinfo/asterisk-dev

Re: [asterisk-dev] [Code Review] 4465: Update the kqueue timing module to conform to current timer API.

2015-03-18 Thread Justin T. Gibbs

---
This is an automatically generated e-mail. To reply, visit:
https://reviewboard.asterisk.org/r/4465/
---

(Updated March 18, 2015, 4:44 p.m.)


Review request for Asterisk Developers.


Changes
---

Address review comments.


Bugs: ASTERISK-24857
https://issues.asterisk.org/jira/browse/ASTERISK-24857


Repository: Asterisk


Description
---

Update the kqueue timing module to conform to current timer API.

This fixes issues with using the kqueue timing source on Asterisk 13
on FreeBSD 10.

res_timing_kqueue.c:
Remove support for kevent64().  The values used to support Asterisk
timers fit within 32bits and so can be handled on all platforms via
kevent().

Provide debug logging for, but do not track, unacked events.  This
matches the behavior of all other timer implementations.

Implement continuous mode by triggering and leaving active, a user
event.  This ensures that the file descriptor for the timer returns
immediately from poll(), without placing the load of a high speed
timer on the kernel.

In kqueue_timer_get_max_rate(), don't overstate the capability of
the timer.  On some platforms, UINT_MAX is greater than INTPTR_MAX,
the largest integer type kqueue supports for timers.

In kqueue_timer_get_event(), assume the caller woke up from poll()
and just return the mode the timer is currently in.  This matches
all other timer implementations.

Adjust the test code now that unacked events are not tracked.


Diffs (updated)
-

  /trunk/res/res_timing_kqueue.c 432637 

Diff: https://reviewboard.asterisk.org/r/4465/diff/


Testing
---

Asterisk 13.2.0 on FreeBSD 10-stable: timing test, pjsip incoming/outgoing 
calls, voicemail prompts and recordings.  All of the above failed without these 
changes.


Thanks,

Justin T. Gibbs

-- 
_
-- Bandwidth and Colocation Provided by http://www.api-digital.com --

asterisk-dev mailing list
To UNSUBSCRIBE or update options visit:
   http://lists.digium.com/mailman/listinfo/asterisk-dev

Re: [asterisk-dev] [Code Review] 4465: Update the kqueue timing module to conform to current timer API.

2015-03-18 Thread Justin T. Gibbs


 On March 16, 2015, 3:18 a.m., Matt Jordan wrote:
  /trunk/res/res_timing_kqueue.c, lines 76-83
  https://reviewboard.asterisk.org/r/4465/diff/2/?file=72098#file72098line76
 
  For structure packing, you may want to declare this as:
  
  struct kqueue_timer {
  int handle;
  intptr_t period;
  #ifndef EVFILT_USER
  int continuous_fd;
  unsigned int contuous_fd_valid:1;
  #endif
  unsigned int is_continuous:1;
  }

I suppose the spec may allow it to be smaller, but sizeof(intptr_t) is 
typically = sizeof(int).


- Justin


---
This is an automatically generated e-mail. To reply, visit:
https://reviewboard.asterisk.org/r/4465/#review14696
---


On March 13, 2015, 2:07 a.m., Justin T. Gibbs wrote:
 
 ---
 This is an automatically generated e-mail. To reply, visit:
 https://reviewboard.asterisk.org/r/4465/
 ---
 
 (Updated March 13, 2015, 2:07 a.m.)
 
 
 Review request for Asterisk Developers.
 
 
 Bugs: ASTERISK-24857
 https://issues.asterisk.org/jira/browse/ASTERISK-24857
 
 
 Repository: Asterisk
 
 
 Description
 ---
 
 Update the kqueue timing module to conform to current timer API.
 
 This fixes issues with using the kqueue timing source on Asterisk 13
 on FreeBSD 10.
 
 res_timing_kqueue.c:
   Remove support for kevent64().  The values used to support Asterisk
   timers fit within 32bits and so can be handled on all platforms via
   kevent().
 
   Provide debug logging for, but do not track, unacked events.  This
   matches the behavior of all other timer implementations.
 
   Implement continuous mode by triggering and leaving active, a user
   event.  This ensures that the file descriptor for the timer returns
   immediately from poll(), without placing the load of a high speed
   timer on the kernel.
 
   In kqueue_timer_get_max_rate(), don't overstate the capability of
   the timer.  On some platforms, UINT_MAX is greater than INTPTR_MAX,
   the largest integer type kqueue supports for timers.
 
   In kqueue_timer_get_event(), assume the caller woke up from poll()
   and just return the mode the timer is currently in.  This matches
   all other timer implementations.
 
   Adjust the test code now that unacked events are not tracked.
 
 
 Diffs
 -
 
   /trunk/res/res_timing_kqueue.c 432637 
 
 Diff: https://reviewboard.asterisk.org/r/4465/diff/
 
 
 Testing
 ---
 
 Asterisk 13.2.0 on FreeBSD 10-stable: timing test, pjsip incoming/outgoing 
 calls, voicemail prompts and recordings.  All of the above failed without 
 these changes.
 
 
 Thanks,
 
 Justin T. Gibbs
 


-- 
_
-- Bandwidth and Colocation Provided by http://www.api-digital.com --

asterisk-dev mailing list
To UNSUBSCRIBE or update options visit:
   http://lists.digium.com/mailman/listinfo/asterisk-dev

Re: [asterisk-dev] [Code Review] 4465: Update the kqueue timing module to conform to current timer API.

2015-03-15 Thread Matt Jordan

---
This is an automatically generated e-mail. To reply, visit:
https://reviewboard.asterisk.org/r/4465/#review14696
---


Thanks for the patch - there's a few other kqueue related issues floating 
around out there that this patch may help address.

I didn't review this for correctness, merely for coding guideline violations. 
Assuming someone else who can run res_timing_kqueue can confirm that it works 
and that the tests pass, I'll be happy to Ship It! once the guidelines are 
cleaned up.


/trunk/res/res_timing_kqueue.c
https://reviewboard.asterisk.org/r/4465/#comment25245

For structure packing, you may want to declare this as:

struct kqueue_timer {
int handle;
intptr_t period;
#ifndef EVFILT_USER
int continuous_fd;
unsigned int contuous_fd_valid:1;
#endif
unsigned int is_continuous:1;
}



/trunk/res/res_timing_kqueue.c
https://reviewboard.asterisk.org/r/4465/#comment25244

Nitpick: in the Asterisk project, we don't place the return type of the 
function or its scope on a separate line.

You can check out the coding guidelines here:

https://wiki.asterisk.org/wiki/display/AST/Coding+Guidelines



/trunk/res/res_timing_kqueue.c
https://reviewboard.asterisk.org/r/4465/#comment25246

Just use ast_debug(X, ...) here.

Since this appears to be a pretty 'low level' debug message, a debug level 
of 5 is probably appropriate.



/trunk/res/res_timing_kqueue.c
https://reviewboard.asterisk.org/r/4465/#comment25247

And ast_debug(5, ...); here as well



/trunk/res/res_timing_kqueue.c
https://reviewboard.asterisk.org/r/4465/#comment25248

ast_debug(5, ...); here as well 



/trunk/res/res_timing_kqueue.c
https://reviewboard.asterisk.org/r/4465/#comment25249

ast_debug(5, ...); here


- Matt Jordan


On March 12, 2015, 9:07 p.m., Justin T. Gibbs wrote:
 
 ---
 This is an automatically generated e-mail. To reply, visit:
 https://reviewboard.asterisk.org/r/4465/
 ---
 
 (Updated March 12, 2015, 9:07 p.m.)
 
 
 Review request for Asterisk Developers.
 
 
 Bugs: ASTERISK-24857
 https://issues.asterisk.org/jira/browse/ASTERISK-24857
 
 
 Repository: Asterisk
 
 
 Description
 ---
 
 Update the kqueue timing module to conform to current timer API.
 
 This fixes issues with using the kqueue timing source on Asterisk 13
 on FreeBSD 10.
 
 res_timing_kqueue.c:
   Remove support for kevent64().  The values used to support Asterisk
   timers fit within 32bits and so can be handled on all platforms via
   kevent().
 
   Provide debug logging for, but do not track, unacked events.  This
   matches the behavior of all other timer implementations.
 
   Implement continuous mode by triggering and leaving active, a user
   event.  This ensures that the file descriptor for the timer returns
   immediately from poll(), without placing the load of a high speed
   timer on the kernel.
 
   In kqueue_timer_get_max_rate(), don't overstate the capability of
   the timer.  On some platforms, UINT_MAX is greater than INTPTR_MAX,
   the largest integer type kqueue supports for timers.
 
   In kqueue_timer_get_event(), assume the caller woke up from poll()
   and just return the mode the timer is currently in.  This matches
   all other timer implementations.
 
   Adjust the test code now that unacked events are not tracked.
 
 
 Diffs
 -
 
   /trunk/res/res_timing_kqueue.c 432637 
 
 Diff: https://reviewboard.asterisk.org/r/4465/diff/
 
 
 Testing
 ---
 
 Asterisk 13.2.0 on FreeBSD 10-stable: timing test, pjsip incoming/outgoing 
 calls, voicemail prompts and recordings.  All of the above failed without 
 these changes.
 
 
 Thanks,
 
 Justin T. Gibbs
 


-- 
_
-- Bandwidth and Colocation Provided by http://www.api-digital.com --

asterisk-dev mailing list
To UNSUBSCRIBE or update options visit:
   http://lists.digium.com/mailman/listinfo/asterisk-dev

Re: [asterisk-dev] [Code Review] 4465: Update the kqueue timing module to conform to current timer API.

2015-03-14 Thread Ed Hynan


 On March 10, 2015, 1:26 p.m., Ed Hynan wrote:
  /trunk/res/res_timing_kqueue.c, line 240
  https://reviewboard.asterisk.org/r/4465/diff/1/?file=71888#file71888line240
 
  Portability: at least EVFILT_USER and NOTE_TRIGGER are not defined on 
  all kqueue(2) systems.
 
 Justin T. Gibbs wrote:
 Which platforms are you referring to?  OS-X added support in 10.6.  Why 
 they haven't updated their man pages is anyones guess:
 
 
 http://www.opensource.apple.com/source/xnu/xnu-1699.24.23/tools/tests/xnu_quick_test/kqueue_tests.c
 
 Ed Hynan wrote:
 OpenBSD and NetBSD. These do not have the user event filter.
 
 Ed Hynan wrote:
 I adapted a test program so see if uncollected EVFILT_TIMER events can 
 make poll() return -- reliably.
 After testing on FreeBSD 9.0 and OpenBSD 5.5 (leaving NetBSD alone unless 
 something seemed promising),
 I find that both will fail to return from poll initially; also both can 
 be 'kicked' with a signal or
 a EVFILT_READ event -- but the result differs on the two systems, and 
 this is undocumented and almost
 certainly undefined behavior and a side effect (and I assume the 
 EVFILT_USER event was just a similar
 'kick').
 
 I haven't studied this timing code, so I shouldn't say much, but *if* 
 res_timing_kqueue.c expects to
 return a kqueue fd for use with poll, and that poll will wake for 
 EVFILT_TIMER expire events, then
 that won't work (judging by the test program trying to do just that).  
 The technique in res_timing_pthread.c
 looks promising: return the read end of a pipe, signal poll by writing a 
 byte, unsignal by consuming
 the byte (works in the test), and just using EVFILT_TIMER for the ticks.

 
 Justin T. Gibbs wrote:
 I'm not sure what you mean by 'kick'. I believe that EVFILT_TIMER events 
 are reliable. If the application is slow to consume timer events, the kevent 
 will accumulate them and the file descriptor for the kqueue() cause poll to 
 return immediately.
 
 The goal of this change is to ensure that continuous mode is cheap and 
 activates the file descriptor immediately. Setting the timer to run as 
 quickly as possible just burns CPU cycles and means continuous mode blocks 
 until the timer goes off at least once.  Depending on the timer resolution of 
 the system, this could be a long time.  I need to do some more testing with 
 the original driver to quantify this, but I believe this was the cause of my 
 failures on FreeBSD.
 
 I coded up a version to use EVFILT_READ on a file descriptor of a closed 
 pipe.  This worked on FreeBSD.  But since it consumes another fd, I think its 
 still better to use EVFLT_USER if it is available.
 
 Ed Hynan wrote:
 Yes, EVFILT_TIMER events are reliable. I mean the interaction of kqueue 
 with a timer and poll -- the expectation
 that poll will return for a kqueue timer expiration. kqueue_timer_fd(), 
 assigned to 
 ast_timing_interface kqueue_timing.timer_fd in svn trunk source, returns 
 the kqueue descriptor (timer-handle) --
 this code was not present in 11.* sources, so I haven't had the possible 
 problems, but *if* the descriptor
 returned from ast_timing_interface kqueue_timing.timer_fd() is used with 
 poll (e.g. main/timing.c), expectations
 might/will fail to be met.
 
 By kick I mean that in tests after poll initially fails to return for 
 kqueue timer expiration, some other events
 e.g. a signal might be followed by poll suddenly starting to return for 
 kqueue timer expiration -- like 
 something stuck was kicked loose. My guess is that the user event you 
 added was doing just that; but it seems to
 be unexpected side effect behavior.
 
 Regardless of all that, the idea that it's better to use EVFLT_USER if 
 it is available would lead to 
 substantially different code for the kqueue systems.  Of course, it's up 
 to asterisk-devs whether that
 is acceptable (I'm a contributor).

I was wrong that poll does not return for EVFILT_TIMER, and of course that 
EVFILT_USER was some
unexpected trigger.

I had quickly added code to an existing test program, and failed to make sure 
the kqueue fd was
assigned the kqueue() return when passed to poll -- I was observing poll on the 
wrong descriptor.

Reduce my statements to the issue of portability, and pardon the noise.


- Ed


---
This is an automatically generated e-mail. To reply, visit:
https://reviewboard.asterisk.org/r/4465/#review14623
---


On March 13, 2015, 2:07 a.m., Justin T. Gibbs wrote:
 
 ---
 This is an automatically generated e-mail. To reply, visit:
 https://reviewboard.asterisk.org/r/4465/
 ---
 
 (Updated March 13, 2015, 2:07 a.m.)
 
 
 Review request for Asterisk 

Re: [asterisk-dev] [Code Review] 4465: Update the kqueue timing module to conform to current timer API.

2015-03-13 Thread Ed Hynan


 On March 10, 2015, 1:26 p.m., Ed Hynan wrote:
  /trunk/res/res_timing_kqueue.c, line 240
  https://reviewboard.asterisk.org/r/4465/diff/1/?file=71888#file71888line240
 
  Portability: at least EVFILT_USER and NOTE_TRIGGER are not defined on 
  all kqueue(2) systems.
 
 Justin T. Gibbs wrote:
 Which platforms are you referring to?  OS-X added support in 10.6.  Why 
 they haven't updated their man pages is anyones guess:
 
 
 http://www.opensource.apple.com/source/xnu/xnu-1699.24.23/tools/tests/xnu_quick_test/kqueue_tests.c
 
 Ed Hynan wrote:
 OpenBSD and NetBSD. These do not have the user event filter.
 
 Ed Hynan wrote:
 I adapted a test program so see if uncollected EVFILT_TIMER events can 
 make poll() return -- reliably.
 After testing on FreeBSD 9.0 and OpenBSD 5.5 (leaving NetBSD alone unless 
 something seemed promising),
 I find that both will fail to return from poll initially; also both can 
 be 'kicked' with a signal or
 a EVFILT_READ event -- but the result differs on the two systems, and 
 this is undocumented and almost
 certainly undefined behavior and a side effect (and I assume the 
 EVFILT_USER event was just a similar
 'kick').
 
 I haven't studied this timing code, so I shouldn't say much, but *if* 
 res_timing_kqueue.c expects to
 return a kqueue fd for use with poll, and that poll will wake for 
 EVFILT_TIMER expire events, then
 that won't work (judging by the test program trying to do just that).  
 The technique in res_timing_pthread.c
 looks promising: return the read end of a pipe, signal poll by writing a 
 byte, unsignal by consuming
 the byte (works in the test), and just using EVFILT_TIMER for the ticks.

 
 Justin T. Gibbs wrote:
 I'm not sure what you mean by 'kick'. I believe that EVFILT_TIMER events 
 are reliable. If the application is slow to consume timer events, the kevent 
 will accumulate them and the file descriptor for the kqueue() cause poll to 
 return immediately.
 
 The goal of this change is to ensure that continuous mode is cheap and 
 activates the file descriptor immediately. Setting the timer to run as 
 quickly as possible just burns CPU cycles and means continuous mode blocks 
 until the timer goes off at least once.  Depending on the timer resolution of 
 the system, this could be a long time.  I need to do some more testing with 
 the original driver to quantify this, but I believe this was the cause of my 
 failures on FreeBSD.
 
 I coded up a version to use EVFILT_READ on a file descriptor of a closed 
 pipe.  This worked on FreeBSD.  But since it consumes another fd, I think its 
 still better to use EVFLT_USER if it is available.

Yes, EVFILT_TIMER events are reliable. I mean the interaction of kqueue with a 
timer and poll -- the expectation
that poll will return for a kqueue timer expiration. kqueue_timer_fd(), 
assigned to 
ast_timing_interface kqueue_timing.timer_fd in svn trunk source, returns the 
kqueue descriptor (timer-handle) --
this code was not present in 11.* sources, so I haven't had the possible 
problems, but *if* the descriptor
returned from ast_timing_interface kqueue_timing.timer_fd() is used with poll 
(e.g. main/timing.c), expectations
might/will fail to be met.

By kick I mean that in tests after poll initially fails to return for kqueue 
timer expiration, some other events
e.g. a signal might be followed by poll suddenly starting to return for kqueue 
timer expiration -- like 
something stuck was kicked loose. My guess is that the user event you added was 
doing just that; but it seems to
be unexpected side effect behavior.

Regardless of all that, the idea that it's better to use EVFLT_USER if it is 
available would lead to 
substantially different code for the kqueue systems.  Of course, it's up to 
asterisk-devs whether that
is acceptable (I'm a contributor).


- Ed


---
This is an automatically generated e-mail. To reply, visit:
https://reviewboard.asterisk.org/r/4465/#review14623
---


On March 13, 2015, 2:07 a.m., Justin T. Gibbs wrote:
 
 ---
 This is an automatically generated e-mail. To reply, visit:
 https://reviewboard.asterisk.org/r/4465/
 ---
 
 (Updated March 13, 2015, 2:07 a.m.)
 
 
 Review request for Asterisk Developers.
 
 
 Bugs: ASTERISK-24857
 https://issues.asterisk.org/jira/browse/ASTERISK-24857
 
 
 Repository: Asterisk
 
 
 Description
 ---
 
 Update the kqueue timing module to conform to current timer API.
 
 This fixes issues with using the kqueue timing source on Asterisk 13
 on FreeBSD 10.
 
 res_timing_kqueue.c:
   Remove support for kevent64().  The values used to support Asterisk
   timers fit within 32bits and so can be handled on all platforms via
   kevent().
 

Re: [asterisk-dev] [Code Review] 4465: Update the kqueue timing module to conform to current timer API.

2015-03-12 Thread Justin T. Gibbs

---
This is an automatically generated e-mail. To reply, visit:
https://reviewboard.asterisk.org/r/4465/
---

(Updated March 13, 2015, 2:07 a.m.)


Review request for Asterisk Developers.


Changes
---

If EVFLT_USER isn't available, fallback to EVFLT_READ against a file descriptor 
from a closed pipe to keep a kqueue timer continuously active.


Bugs: ASTERISK-24857
https://issues.asterisk.org/jira/browse/ASTERISK-24857


Repository: Asterisk


Description
---

Update the kqueue timing module to conform to current timer API.

This fixes issues with using the kqueue timing source on Asterisk 13
on FreeBSD 10.

res_timing_kqueue.c:
Remove support for kevent64().  The values used to support Asterisk
timers fit within 32bits and so can be handled on all platforms via
kevent().

Provide debug logging for, but do not track, unacked events.  This
matches the behavior of all other timer implementations.

Implement continuous mode by triggering and leaving active, a user
event.  This ensures that the file descriptor for the timer returns
immediately from poll(), without placing the load of a high speed
timer on the kernel.

In kqueue_timer_get_max_rate(), don't overstate the capability of
the timer.  On some platforms, UINT_MAX is greater than INTPTR_MAX,
the largest integer type kqueue supports for timers.

In kqueue_timer_get_event(), assume the caller woke up from poll()
and just return the mode the timer is currently in.  This matches
all other timer implementations.

Adjust the test code now that unacked events are not tracked.


Diffs (updated)
-

  /trunk/res/res_timing_kqueue.c 432637 

Diff: https://reviewboard.asterisk.org/r/4465/diff/


Testing
---

Asterisk 13.2.0 on FreeBSD 10-stable: timing test, pjsip incoming/outgoing 
calls, voicemail prompts and recordings.  All of the above failed without these 
changes.


Thanks,

Justin T. Gibbs

-- 
_
-- Bandwidth and Colocation Provided by http://www.api-digital.com --

asterisk-dev mailing list
To UNSUBSCRIBE or update options visit:
   http://lists.digium.com/mailman/listinfo/asterisk-dev

Re: [asterisk-dev] [Code Review] 4465: Update the kqueue timing module to conform to current timer API.

2015-03-12 Thread Justin T. Gibbs


 On March 10, 2015, 1:26 p.m., Ed Hynan wrote:
  /trunk/res/res_timing_kqueue.c, line 240
  https://reviewboard.asterisk.org/r/4465/diff/1/?file=71888#file71888line240
 
  Portability: at least EVFILT_USER and NOTE_TRIGGER are not defined on 
  all kqueue(2) systems.
 
 Justin T. Gibbs wrote:
 Which platforms are you referring to?  OS-X added support in 10.6.  Why 
 they haven't updated their man pages is anyones guess:
 
 
 http://www.opensource.apple.com/source/xnu/xnu-1699.24.23/tools/tests/xnu_quick_test/kqueue_tests.c
 
 Ed Hynan wrote:
 OpenBSD and NetBSD. These do not have the user event filter.
 
 Ed Hynan wrote:
 I adapted a test program so see if uncollected EVFILT_TIMER events can 
 make poll() return -- reliably.
 After testing on FreeBSD 9.0 and OpenBSD 5.5 (leaving NetBSD alone unless 
 something seemed promising),
 I find that both will fail to return from poll initially; also both can 
 be 'kicked' with a signal or
 a EVFILT_READ event -- but the result differs on the two systems, and 
 this is undocumented and almost
 certainly undefined behavior and a side effect (and I assume the 
 EVFILT_USER event was just a similar
 'kick').
 
 I haven't studied this timing code, so I shouldn't say much, but *if* 
 res_timing_kqueue.c expects to
 return a kqueue fd for use with poll, and that poll will wake for 
 EVFILT_TIMER expire events, then
 that won't work (judging by the test program trying to do just that).  
 The technique in res_timing_pthread.c
 looks promising: return the read end of a pipe, signal poll by writing a 
 byte, unsignal by consuming
 the byte (works in the test), and just using EVFILT_TIMER for the ticks.


I'm not sure what you mean by 'kick'. I believe that EVFILT_TIMER events are 
reliable. If the application is slow to consume timer events, the kevent will 
accumulate them and the file descriptor for the kqueue() cause poll to return 
immediately.

The goal of this change is to ensure that continuous mode is cheap and 
activates the file descriptor immediately. Setting the timer to run as quickly 
as possible just burns CPU cycles and means continuous mode blocks until the 
timer goes off at least once.  Depending on the timer resolution of the system, 
this could be a long time.  I need to do some more testing with the original 
driver to quantify this, but I believe this was the cause of my failures on 
FreeBSD.

I coded up a version to use EVFILT_READ on a file descriptor of a closed pipe.  
This worked on FreeBSD.  But since it consumes another fd, I think its still 
better to use EVFLT_USER if it is available.   


- Justin


---
This is an automatically generated e-mail. To reply, visit:
https://reviewboard.asterisk.org/r/4465/#review14623
---


On March 13, 2015, 2:07 a.m., Justin T. Gibbs wrote:
 
 ---
 This is an automatically generated e-mail. To reply, visit:
 https://reviewboard.asterisk.org/r/4465/
 ---
 
 (Updated March 13, 2015, 2:07 a.m.)
 
 
 Review request for Asterisk Developers.
 
 
 Bugs: ASTERISK-24857
 https://issues.asterisk.org/jira/browse/ASTERISK-24857
 
 
 Repository: Asterisk
 
 
 Description
 ---
 
 Update the kqueue timing module to conform to current timer API.
 
 This fixes issues with using the kqueue timing source on Asterisk 13
 on FreeBSD 10.
 
 res_timing_kqueue.c:
   Remove support for kevent64().  The values used to support Asterisk
   timers fit within 32bits and so can be handled on all platforms via
   kevent().
 
   Provide debug logging for, but do not track, unacked events.  This
   matches the behavior of all other timer implementations.
 
   Implement continuous mode by triggering and leaving active, a user
   event.  This ensures that the file descriptor for the timer returns
   immediately from poll(), without placing the load of a high speed
   timer on the kernel.
 
   In kqueue_timer_get_max_rate(), don't overstate the capability of
   the timer.  On some platforms, UINT_MAX is greater than INTPTR_MAX,
   the largest integer type kqueue supports for timers.
 
   In kqueue_timer_get_event(), assume the caller woke up from poll()
   and just return the mode the timer is currently in.  This matches
   all other timer implementations.
 
   Adjust the test code now that unacked events are not tracked.
 
 
 Diffs
 -
 
   /trunk/res/res_timing_kqueue.c 432637 
 
 Diff: https://reviewboard.asterisk.org/r/4465/diff/
 
 
 Testing
 ---
 
 Asterisk 13.2.0 on FreeBSD 10-stable: timing test, pjsip incoming/outgoing 
 calls, voicemail prompts and recordings.  All of the above failed without 
 these changes.
 
 
 Thanks,
 
 Justin T. Gibbs
 


-- 

Re: [asterisk-dev] [Code Review] 4465: Update the kqueue timing module to conform to current timer API.

2015-03-11 Thread Ed Hynan


 On March 10, 2015, 1:26 p.m., Ed Hynan wrote:
  /trunk/res/res_timing_kqueue.c, line 240
  https://reviewboard.asterisk.org/r/4465/diff/1/?file=71888#file71888line240
 
  Portability: at least EVFILT_USER and NOTE_TRIGGER are not defined on 
  all kqueue(2) systems.
 
 Justin T. Gibbs wrote:
 Which platforms are you referring to?  OS-X added support in 10.6.  Why 
 they haven't updated their man pages is anyones guess:
 
 
 http://www.opensource.apple.com/source/xnu/xnu-1699.24.23/tools/tests/xnu_quick_test/kqueue_tests.c

OpenBSD and NetBSD. These do not have the user event filter.


- Ed


---
This is an automatically generated e-mail. To reply, visit:
https://reviewboard.asterisk.org/r/4465/#review14623
---


On March 9, 2015, 6:21 p.m., Justin T. Gibbs wrote:
 
 ---
 This is an automatically generated e-mail. To reply, visit:
 https://reviewboard.asterisk.org/r/4465/
 ---
 
 (Updated March 9, 2015, 6:21 p.m.)
 
 
 Review request for Asterisk Developers.
 
 
 Bugs: ASTERISK-24857
 https://issues.asterisk.org/jira/browse/ASTERISK-24857
 
 
 Repository: Asterisk
 
 
 Description
 ---
 
 Update the kqueue timing module to conform to current timer API.
 
 This fixes issues with using the kqueue timing source on Asterisk 13
 on FreeBSD 10.
 
 res_timing_kqueue.c:
   Remove support for kevent64().  The values used to support Asterisk
   timers fit within 32bits and so can be handled on all platforms via
   kevent().
 
   Provide debug logging for, but do not track, unacked events.  This
   matches the behavior of all other timer implementations.
 
   Implement continuous mode by triggering and leaving active, a user
   event.  This ensures that the file descriptor for the timer returns
   immediately from poll(), without placing the load of a high speed
   timer on the kernel.
 
   In kqueue_timer_get_max_rate(), don't overstate the capability of
   the timer.  On some platforms, UINT_MAX is greater than INTPTR_MAX,
   the largest integer type kqueue supports for timers.
 
   In kqueue_timer_get_event(), assume the caller woke up from poll()
   and just return the mode the timer is currently in.  This matches
   all other timer implementations.
 
   Adjust the test code now that unacked events are not tracked.
 
 
 Diffs
 -
 
   /trunk/res/res_timing_kqueue.c 432637 
 
 Diff: https://reviewboard.asterisk.org/r/4465/diff/
 
 
 Testing
 ---
 
 Asterisk 13.2.0 on FreeBSD 10-stable: timing test, pjsip incoming/outgoing 
 calls, voicemail prompts and recordings.  All of the above failed without 
 these changes.
 
 
 Thanks,
 
 Justin T. Gibbs
 


-- 
_
-- Bandwidth and Colocation Provided by http://www.api-digital.com --

asterisk-dev mailing list
To UNSUBSCRIBE or update options visit:
   http://lists.digium.com/mailman/listinfo/asterisk-dev

Re: [asterisk-dev] [Code Review] 4465: Update the kqueue timing module to conform to current timer API.

2015-03-10 Thread Joshua Colp

---
This is an automatically generated e-mail. To reply, visit:
https://reviewboard.asterisk.org/r/4465/#review14620
---


My immediate question for this is: How does this impact OSX? The timing module 
was originally written for both, do these changes work for both?

- Joshua Colp


On March 9, 2015, 6:21 p.m., Justin T. Gibbs wrote:
 
 ---
 This is an automatically generated e-mail. To reply, visit:
 https://reviewboard.asterisk.org/r/4465/
 ---
 
 (Updated March 9, 2015, 6:21 p.m.)
 
 
 Review request for Asterisk Developers.
 
 
 Bugs: ASTERISK-24857
 https://issues.asterisk.org/jira/browse/ASTERISK-24857
 
 
 Repository: Asterisk
 
 
 Description
 ---
 
 Update the kqueue timing module to conform to current timer API.
 
 This fixes issues with using the kqueue timing source on Asterisk 13
 on FreeBSD 10.
 
 res_timing_kqueue.c:
   Remove support for kevent64().  The values used to support Asterisk
   timers fit within 32bits and so can be handled on all platforms via
   kevent().
 
   Provide debug logging for, but do not track, unacked events.  This
   matches the behavior of all other timer implementations.
 
   Implement continuous mode by triggering and leaving active, a user
   event.  This ensures that the file descriptor for the timer returns
   immediately from poll(), without placing the load of a high speed
   timer on the kernel.
 
   In kqueue_timer_get_max_rate(), don't overstate the capability of
   the timer.  On some platforms, UINT_MAX is greater than INTPTR_MAX,
   the largest integer type kqueue supports for timers.
 
   In kqueue_timer_get_event(), assume the caller woke up from poll()
   and just return the mode the timer is currently in.  This matches
   all other timer implementations.
 
   Adjust the test code now that unacked events are not tracked.
 
 
 Diffs
 -
 
   /trunk/res/res_timing_kqueue.c 432637 
 
 Diff: https://reviewboard.asterisk.org/r/4465/diff/
 
 
 Testing
 ---
 
 Asterisk 13.2.0 on FreeBSD 10-stable: timing test, pjsip incoming/outgoing 
 calls, voicemail prompts and recordings.  All of the above failed without 
 these changes.
 
 
 Thanks,
 
 Justin T. Gibbs
 


-- 
_
-- Bandwidth and Colocation Provided by http://www.api-digital.com --

asterisk-dev mailing list
To UNSUBSCRIBE or update options visit:
   http://lists.digium.com/mailman/listinfo/asterisk-dev

Re: [asterisk-dev] [Code Review] 4465: Update the kqueue timing module to conform to current timer API.

2015-03-10 Thread Ed Hynan

---
This is an automatically generated e-mail. To reply, visit:
https://reviewboard.asterisk.org/r/4465/#review14623
---



/trunk/res/res_timing_kqueue.c
https://reviewboard.asterisk.org/r/4465/#comment25180

Portability: at least EVFILT_USER and NOTE_TRIGGER are not defined on all 
kqueue(2) systems.



/trunk/res/res_timing_kqueue.c
https://reviewboard.asterisk.org/r/4465/#comment25181

See above.



/trunk/res/res_timing_kqueue.c
https://reviewboard.asterisk.org/r/4465/#comment25182

See above.


- Ed Hynan


On March 9, 2015, 6:21 p.m., Justin T. Gibbs wrote:
 
 ---
 This is an automatically generated e-mail. To reply, visit:
 https://reviewboard.asterisk.org/r/4465/
 ---
 
 (Updated March 9, 2015, 6:21 p.m.)
 
 
 Review request for Asterisk Developers.
 
 
 Bugs: ASTERISK-24857
 https://issues.asterisk.org/jira/browse/ASTERISK-24857
 
 
 Repository: Asterisk
 
 
 Description
 ---
 
 Update the kqueue timing module to conform to current timer API.
 
 This fixes issues with using the kqueue timing source on Asterisk 13
 on FreeBSD 10.
 
 res_timing_kqueue.c:
   Remove support for kevent64().  The values used to support Asterisk
   timers fit within 32bits and so can be handled on all platforms via
   kevent().
 
   Provide debug logging for, but do not track, unacked events.  This
   matches the behavior of all other timer implementations.
 
   Implement continuous mode by triggering and leaving active, a user
   event.  This ensures that the file descriptor for the timer returns
   immediately from poll(), without placing the load of a high speed
   timer on the kernel.
 
   In kqueue_timer_get_max_rate(), don't overstate the capability of
   the timer.  On some platforms, UINT_MAX is greater than INTPTR_MAX,
   the largest integer type kqueue supports for timers.
 
   In kqueue_timer_get_event(), assume the caller woke up from poll()
   and just return the mode the timer is currently in.  This matches
   all other timer implementations.
 
   Adjust the test code now that unacked events are not tracked.
 
 
 Diffs
 -
 
   /trunk/res/res_timing_kqueue.c 432637 
 
 Diff: https://reviewboard.asterisk.org/r/4465/diff/
 
 
 Testing
 ---
 
 Asterisk 13.2.0 on FreeBSD 10-stable: timing test, pjsip incoming/outgoing 
 calls, voicemail prompts and recordings.  All of the above failed without 
 these changes.
 
 
 Thanks,
 
 Justin T. Gibbs
 


-- 
_
-- Bandwidth and Colocation Provided by http://www.api-digital.com --

asterisk-dev mailing list
To UNSUBSCRIBE or update options visit:
   http://lists.digium.com/mailman/listinfo/asterisk-dev

Re: [asterisk-dev] [Code Review] 4465: Update the kqueue timing module to conform to current timer API.

2015-03-10 Thread Justin T. Gibbs


 On March 10, 2015, 1:26 p.m., Ed Hynan wrote:
  /trunk/res/res_timing_kqueue.c, line 240
  https://reviewboard.asterisk.org/r/4465/diff/1/?file=71888#file71888line240
 
  Portability: at least EVFILT_USER and NOTE_TRIGGER are not defined on 
  all kqueue(2) systems.

Which platforms are you referring to?  OS-X added support in 10.6.  Why they 
haven't updated their man pages is anyones guess:

http://www.opensource.apple.com/source/xnu/xnu-1699.24.23/tools/tests/xnu_quick_test/kqueue_tests.c


- Justin


---
This is an automatically generated e-mail. To reply, visit:
https://reviewboard.asterisk.org/r/4465/#review14623
---


On March 9, 2015, 6:21 p.m., Justin T. Gibbs wrote:
 
 ---
 This is an automatically generated e-mail. To reply, visit:
 https://reviewboard.asterisk.org/r/4465/
 ---
 
 (Updated March 9, 2015, 6:21 p.m.)
 
 
 Review request for Asterisk Developers.
 
 
 Bugs: ASTERISK-24857
 https://issues.asterisk.org/jira/browse/ASTERISK-24857
 
 
 Repository: Asterisk
 
 
 Description
 ---
 
 Update the kqueue timing module to conform to current timer API.
 
 This fixes issues with using the kqueue timing source on Asterisk 13
 on FreeBSD 10.
 
 res_timing_kqueue.c:
   Remove support for kevent64().  The values used to support Asterisk
   timers fit within 32bits and so can be handled on all platforms via
   kevent().
 
   Provide debug logging for, but do not track, unacked events.  This
   matches the behavior of all other timer implementations.
 
   Implement continuous mode by triggering and leaving active, a user
   event.  This ensures that the file descriptor for the timer returns
   immediately from poll(), without placing the load of a high speed
   timer on the kernel.
 
   In kqueue_timer_get_max_rate(), don't overstate the capability of
   the timer.  On some platforms, UINT_MAX is greater than INTPTR_MAX,
   the largest integer type kqueue supports for timers.
 
   In kqueue_timer_get_event(), assume the caller woke up from poll()
   and just return the mode the timer is currently in.  This matches
   all other timer implementations.
 
   Adjust the test code now that unacked events are not tracked.
 
 
 Diffs
 -
 
   /trunk/res/res_timing_kqueue.c 432637 
 
 Diff: https://reviewboard.asterisk.org/r/4465/diff/
 
 
 Testing
 ---
 
 Asterisk 13.2.0 on FreeBSD 10-stable: timing test, pjsip incoming/outgoing 
 calls, voicemail prompts and recordings.  All of the above failed without 
 these changes.
 
 
 Thanks,
 
 Justin T. Gibbs
 


-- 
_
-- Bandwidth and Colocation Provided by http://www.api-digital.com --

asterisk-dev mailing list
To UNSUBSCRIBE or update options visit:
   http://lists.digium.com/mailman/listinfo/asterisk-dev

Re: [asterisk-dev] [Code Review] 4465: Update the kqueue timing module to conform to current timer API.

2015-03-10 Thread Justin T. Gibbs


 On March 10, 2015, 1:08 p.m., Joshua Colp wrote:
  My immediate question for this is: How does this impact OSX? The timing 
  module was originally written for both, do these changes work for both?

I haven't tested against OS-X, but it has had EVFILT_USER support since 10.6.


- Justin


---
This is an automatically generated e-mail. To reply, visit:
https://reviewboard.asterisk.org/r/4465/#review14620
---


On March 9, 2015, 6:21 p.m., Justin T. Gibbs wrote:
 
 ---
 This is an automatically generated e-mail. To reply, visit:
 https://reviewboard.asterisk.org/r/4465/
 ---
 
 (Updated March 9, 2015, 6:21 p.m.)
 
 
 Review request for Asterisk Developers.
 
 
 Bugs: ASTERISK-24857
 https://issues.asterisk.org/jira/browse/ASTERISK-24857
 
 
 Repository: Asterisk
 
 
 Description
 ---
 
 Update the kqueue timing module to conform to current timer API.
 
 This fixes issues with using the kqueue timing source on Asterisk 13
 on FreeBSD 10.
 
 res_timing_kqueue.c:
   Remove support for kevent64().  The values used to support Asterisk
   timers fit within 32bits and so can be handled on all platforms via
   kevent().
 
   Provide debug logging for, but do not track, unacked events.  This
   matches the behavior of all other timer implementations.
 
   Implement continuous mode by triggering and leaving active, a user
   event.  This ensures that the file descriptor for the timer returns
   immediately from poll(), without placing the load of a high speed
   timer on the kernel.
 
   In kqueue_timer_get_max_rate(), don't overstate the capability of
   the timer.  On some platforms, UINT_MAX is greater than INTPTR_MAX,
   the largest integer type kqueue supports for timers.
 
   In kqueue_timer_get_event(), assume the caller woke up from poll()
   and just return the mode the timer is currently in.  This matches
   all other timer implementations.
 
   Adjust the test code now that unacked events are not tracked.
 
 
 Diffs
 -
 
   /trunk/res/res_timing_kqueue.c 432637 
 
 Diff: https://reviewboard.asterisk.org/r/4465/diff/
 
 
 Testing
 ---
 
 Asterisk 13.2.0 on FreeBSD 10-stable: timing test, pjsip incoming/outgoing 
 calls, voicemail prompts and recordings.  All of the above failed without 
 these changes.
 
 
 Thanks,
 
 Justin T. Gibbs
 


-- 
_
-- Bandwidth and Colocation Provided by http://www.api-digital.com --

asterisk-dev mailing list
To UNSUBSCRIBE or update options visit:
   http://lists.digium.com/mailman/listinfo/asterisk-dev