]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
use lighter math and avoid infinite loop in port allocator (FSCORE-148)
authorMichael Jerris <mike@jerris.com>
Mon, 7 Jul 2008 18:13:17 +0000 (18:13 +0000)
committerMichael Jerris <mike@jerris.com>
Mon, 7 Jul 2008 18:13:17 +0000 (18:13 +0000)
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@8909 d0543943-73ff-0310-b7d9-9358b9ac24b2

src/switch_core_port_allocator.c

index 4f0f19833c36ad4da5ecbd7b460a111bbff7e9e0..feff7c3970d0b158938c17ca584f4b5380c4d9ef 100644 (file)
@@ -121,23 +121,20 @@ SWITCH_DECLARE(switch_status_t) switch_core_port_allocator_request_port(switch_c
        srand(getpid() + (unsigned) switch_timestamp(NULL));
 
        while (alloc->track_used < alloc->track_len) {
-               double r;
                uint32_t index;
-               int tries = 0;
+               uint32_t tries = 0;
 
-               do {
-                       r = ((double) rand() / ((double) (RAND_MAX) + (double) (1)));
-                       index = (int) (r * alloc->track_len);
-                       tries++;
-               } while ((alloc->track[index] || index >= alloc->track_len) && tries < 10000);
+               /* randomly pick a port */
+               index = rand() % alloc->track_len;
 
-               while (alloc->track[index]) {
-                       if (++index >= alloc->track_len) {
-                               index = 0;
-                       }
+               /* if it is used walk up the list to find a free one */
+               while (alloc->track[index] && tries < alloc->track_len)
+               {
+                       tries++;
+                       if(++index >= alloc->track_len) index = 0;
                }
 
-               if (index < alloc->track_len) {
+               if (tries < alloc->track_len) {
                        alloc->track[index] = 1;
                        alloc->track_used++;
                        status = SWITCH_STATUS_SUCCESS;