[Nice] complete example

Youness Alaoui youness.alaoui at collabora.co.uk
Fri Feb 1 12:25:05 PST 2013

Hi Bryce,

I've looked at the code and it looks good! I do agree with Rohan though that
multi-threading is not a good thing for a simple example. I think what Rohan
wanted to do is call g_main_loop_run, then wait until the callback calls
g_main_loop_quit, then continue doing stuff in the main() function, then call
g_main_loop_run() again (instead of "while (!something_done) sleep(1);").
I think the way I'll do it is a bit better, I will simply call
nice_agent_gather_candidates() then g_main_loop_run(), and that's the end of the
main() function. The rest of the code will be done in the gathering_done callback.
I will be refactoring that code not to use any threads and will let you know
when it's done (later today it should be). I think I will also make it use glib
to add a io_watch on stdin instead of calling fgets() synchronously.


On 02/01/2013 12:24 PM, Bryce Allen wrote:
> Hi Rohan,
> Thanks for testing it out and for the feedback!
> Re parse_args, I think it is correct as is. The line returned by fgets
> may not contains '\n' (if it's very long), so it's not safe to only
> check for '\n' as end of string, and the !isspace(*p) already handles
> the '\n' as well as other whitespace to make sure it won't be included
> in the arg:
>         // find end of current arg
>         while (*p != '\0' && !isspace(*p)) { p++; }
>         if (*p == '\0')
>             break;
>         *p = '\0';
> Were you getting a crash or a hang? It works for me when I copy just
> the single line, but if I include extra empty lines it just hangs.
> Also if your terminal wraps the input line, it will fail. It would be
> nice to have a less fragile format - I think that is what Youness was
> suggesting with the SDP format. I've attached a new version that
> handles empty lines and re-prompts if the parse fails, and fixes a
> memory leak in parse_remote_data.
> Re removing the thread for mainloop, I'm not sure the STUN binding/keep
> alive requests will continue if the thread is quit after negotiation is
> complete (during the send/receive phase). It seems nice to manually
> drive the loop for tests and avoid the complexity of threads, but I'm
> not sure it's what we want for an example.
> -Bryce
> On Fri, 1 Feb 2013 12:37:43 +0530
> Rohan Garg <rohan16garg at gmail.com> wrote:
>> Hey everyone :)
>> I went over the program a bit, and I'm attaching a patch that fixes a
>> couple of issues, just minor stuff regarding the thread_mainloop and
>> making the code a wee bit more async.
>> There also seems to be a bug on line 241 of the original code where it
>> only stops at \0 , I believe that should be \n. When using \0 the
>> program simply crashes at " remote_candidates =
>> g_slist_reverse(remote_candidates); " in parse_remote_data.
>> On Fri, Feb 1, 2013 at 6:05 AM, Youness Alaoui
>>> I have a plan of adding a new API call for transforming the
>>> candidates into SDP and to parse candidates from SDP. I think it
>>> will help people, and I think it would be a good idea to port your
>>> code to it. I'll let you know tomorrow what I find!
>> Could you explain this a bit on the list in another thread? :)
>> Regards
>> Rohan Garg
>>> Thanks,
>>> Youness.
>>> On 01/31/2013 07:30 PM, Bryce Allen wrote:
>>>> I expanded my nicetest.c into a complete example, using a simple
>>>> serialization format and copying/pasting the data between clients.
>>>> It's inspired by icedemo from pjnath, but I didn't find having
>>>> separate commands for each phase useful for testing and it made
>>>> reading the code more difficult, so I just have three phases:
>>>> 1) gather candidates, print serialized local data
>>>> 2) prompt user for remote data, parse and set when entered
>>>> 3) if successful, prompt for data to send to remote end
>>>> I'm probably missing some failure cases and some error checking,
>>>> but it seems like it could be a useful addition to the main
>>>> distribution after a fixup. I can re-license under LGPL/MPL if
>>>> needed.
>>>> Also please let me know if I'm doing anything fundamentally wrong
>>>> here. I'm using pretty much the same flow for a real application,
>>>> with condition variables to synchronize instead busy waiting.
>>>> Thanks,
>>>> Bryce
>>>> _______________________________________________
>>>> nice mailing list
>>>> nice at lists.freedesktop.org
>>>> http://lists.freedesktop.org/mailman/listinfo/nice
>>> _______________________________________________
>>> nice mailing list
>>> nice at lists.freedesktop.org
>>> http://lists.freedesktop.org/mailman/listinfo/nice
>>> _______________________________________________
>>> nice mailing list
>>> nice at lists.freedesktop.org
>>> http://lists.freedesktop.org/mailman/listinfo/nice

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 263 bytes
Desc: OpenPGP digital signature
URL: <http://lists.freedesktop.org/archives/nice/attachments/20130201/c9c78265/attachment.pgp>

More information about the nice mailing list