<!doctype html><html><head>
<title></title>
<style type="text/css">p.MsoNormal,p.MsoNoSpacing{margin:0}</style>
</head>
<body>You don't need half of the code to factor a race-prone next-device function like this.<br><br><div class="gmail_quote">Le 30 novembre 2018 10:29:56 GMT+02:00, Thomas Guillem <thomas@gllm.fr> a écrit :<blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
<div><br></div>
<div>On Thu, Nov 29, 2018, at 14:46, Rémi Denis-Courmont wrote:<br></div>
<blockquote type="cite"><div>since there is anyway a ToCToU situation now, I don't see the point of the helper, and even less of the unlocked function.<br></div>
</blockquote><div><br></div>
<div>Factorize it between several interfaces modules ?<br></div>
<div><br></div>
<blockquote type="cite"><div defang_data-gmailquote="yes"><div>Le 28 novembre 2018 16:47:22 GMT+02:00, Victorien Le Couviour--Tuffet <victorien.lecouviour.tuffet@gmail.com> a écrit :<br></div>
<blockquote defang_data-gmailquote="yes" style="margin-top:0pt;margin-right:0pt;margin-bottom:0pt;margin-left:0.8ex;border-left-color:rgb(204, 204, 204);border-left-style:solid;border-left-width:1px;padding-left:1ex;"><pre><div><hr> include/vlc_aout.h        |  1 +<br></div>
<div> src/audio_output/output.c | 94 ++++++++++++++++++++++++++++++++-------<br></div>
<div> src/libvlccore.sym        |  1 +<br></div>
<div> 3 files changed, 81 insertions(+), 15 deletions(-)<br></div>
<div><br></div>
<div>diff --git a/include/vlc_aout.h b/include/vlc_aout.h<br></div>
<div>index aa49884001..ef78127c13 100644<br></div>
<div>--- a/include/vlc_aout.h<br></div>
<div>+++ b/include/vlc_aout.h<br></div>
<div>@@ -373,6 +373,7 @@ VLC_API int aout_MuteGet (audio_output_t *);<br></div>
<div> VLC_API int aout_MuteSet (audio_output_t *, bool);<br></div>
<div> VLC_API char *aout_DeviceGet (audio_output_t *);<br></div>
<div> VLC_API int aout_DeviceSet (audio_output_t *, const char *);<br></div>
<div>+VLC_API int aout_DeviceNext (audio_output_t *, char **);<br></div>
<div> VLC_API int aout_DevicesList (audio_output_t *, char ***, char ***);<br></div>
<div> <br></div>
<div> /**<br></div>
<div>diff --git a/src/audio_output/output.c b/src/audio_output/output.c<br></div>
<div>index 019797c5ef..ef643260b0 100644<br></div>
<div>--- a/src/audio_output/output.c<br></div>
<div>+++ b/src/audio_output/output.c<br></div>
<div>@@ -701,24 +701,15 @@ int aout_DeviceSet (audio_output_t *aout, const char *id)<br></div>
<div>     return ret ? -1 : 0;<br></div>
<div> }<br></div>
<div> <br></div>
<div>-/**<br></div>
<div>- * Enumerates possible audio output devices.<br></div>
<div>- *<br></div>
<div>- * The function will heap-allocate two tables of heap-allocated strings;<br></div>
<div>- * the caller is responsible for freeing all strings and both tables.<br></div>
<div>- *<br></div>
<div>- * \param ids pointer to a table of device identifiers [OUT]<br></div>
<div>- * \param names pointer to a table of device human-readable descriptions [OUT]<br></div>
<div>- * \return the number of devices, or negative on error.<br></div>
<div>- * \note In case of error, *ids and *names are undefined.<br></div>
<div>- */<br></div>
<div>-int aout_DevicesList (audio_output_t *aout, char ***ids, char ***names)<br></div>
<div>+static int aout_DevicesListLocked(audio_output_t *aout,<br></div>
<div>+                                  char ***ids, char ***names)<br></div>
<div> {<br></div>
<div>     aout_owner_t *owner = aout_owner (aout);<br></div>
<div>+    vlc_mutex_assert(&owner->lock);<br></div>
<div>+    vlc_mutex_assert(&owner->dev.lock);<br></div>
<div>     char **tabid, **tabname;<br></div>
<div>     unsigned i = 0;<br></div>
<div> <br></div>
<div>-    vlc_mutex_lock (&owner->dev.lock);<br></div>
<div>     tabid = vlc_alloc (owner->dev.count, sizeof (*tabid));<br></div>
<div>     tabname = vlc_alloc (owner->dev.count, sizeof (*tabname));<br></div>
<div> <br></div>
<div>@@ -743,12 +734,10 @@ int aout_DevicesList (audio_output_t *aout, char ***ids, char ***names)<br></div>
<div> <br></div>
<div>         i++;<br></div>
<div>     }<br></div>
<div>-    vlc_mutex_unlock (&owner->dev.lock);<br></div>
<div> <br></div>
<div>     return i;<br></div>
<div> <br></div>
<div> error:<br></div>
<div>-    vlc_mutex_unlock(&owner->dev.lock);<br></div>
<div>     while (i > 0)<br></div>
<div>     {<br></div>
<div>         i--;<br></div>
<div>@@ -760,6 +749,81 @@ error:<br></div>
<div>     return -1;<br></div>
<div> }<br></div>
<div> <br></div>
<div>+/**<br></div>
<div>+ * Enumerates possible audio output devices.<br></div>
<div>+ *<br></div>
<div>+ * The function will heap-allocate two tables of heap-allocated strings;<br></div>
<div>+ * the caller is responsible for freeing all strings and both tables.<br></div>
<div>+ *<br></div>
<div>+ * \param ids pointer to a table of device identifiers [OUT]<br></div>
<div>+ * \param names pointer to a table of device human-readable descriptions [OUT]<br></div>
<div>+ * \return the number of devices, or negative on error.<br></div>
<div>+ * \note In case of error, *ids and *names are undefined.<br></div>
<div>+ */<br></div>
<div>+int aout_DevicesList (audio_output_t *aout, char ***ids, char ***names)<br></div>
<div>+{<br></div>
<div>+    aout_OutputLock(aout);<br></div>
<div>+    vlc_mutex_t *lock = &aout_owner(aout)->dev.lock;<br></div>
<div>+    vlc_mutex_lock(lock);<br></div>
<div>+    int ret = aout_DevicesListLocked(aout, ids, names);<br></div>
<div>+    vlc_mutex_unlock(lock);<br></div>
<div>+    aout_OutputUnlock(aout);<br></div>
<div>+    return ret;<br></div>
<div>+}<br></div>
<div>+<br></div>
<div>+/**<br></div>
<div>+ * Cycle through audio output devices.<br></div>
<div>+ * \param p_name pointer to the selected device human-readable description [OUT]<br></div>
<div>+ * \return zero on success, non-zero on error.<br></div>
<div>+ */<br></div>
<div>+int aout_DeviceNext (audio_output_t *aout, char **p_name)<br></div>
<div>+{<br></div>
<div>+    int ret = -1;<br></div>
<div>+    aout_owner_t *owner = aout_owner(aout);<br></div>
<div>+    aout_OutputLock(aout);<br></div>
<div>+    vlc_mutex_lock(&owner->dev.lock);<br></div>
<div>+    bool locked = true;<br></div>
<div>+<br></div>
<div>+    char **ids, **names;<br></div>
<div>+    int n = aout_DevicesListLocked(aout, &ids, &names);<br></div>
<div>+    if (n == -1)<br></div>
<div>+        goto end;<br></div>
<div>+    char *device = aout_DeviceGet(aout);<br></div>
<div>+    if (!device)<br></div>
<div>+        goto no_dev;<br></div>
<div>+<br></div>
<div>+    int index;<br></div>
<div>+    for (index = 0; index < n; ++index)<br></div>
<div>+        if (!strcmp(ids[index], device))<br></div>
<div>+        {<br></div>
<div>+            index = (index + 1) % n;<br></div>
<div>+            break;<br></div>
<div>+        }<br></div>
<div>+    vlc_mutex_unlock(&owner->dev.lock);<br></div>
<div>+    aout_OutputUnlock(aout);<br></div>
<div>+    locked = false;<br></div>
<div>+    ret = aout_DeviceSet(aout, ids[index]);<br></div>
<div>+    if (p_name != NULL)<br></div>
<div>+        *p_name = strdup(names[index]);<br></div>
<div>+<br></div>
<div>+    free(device);<br></div>
<div>+no_dev:<br></div>
<div>+    for (int i = 0; i < n; ++i)<br></div>
<div>+    {<br></div>
<div>+        free(ids[i]);<br></div>
<div>+        free(names[i]);<br></div>
<div>+    }<br></div>
<div>+    free(ids);<br></div>
<div>+    free(names);<br></div>
<div>+end:<br></div>
<div>+    if (locked)<br></div>
<div>+    {<br></div>
<div>+        vlc_mutex_unlock(&owner->dev.lock);<br></div>
<div>+        aout_OutputUnlock(aout);<br></div>
<div>+    }<br></div>
<div>+    return ret;<br></div>
<div>+}<br></div>
<div>+<br></div>
<div> static void aout_ChangeViewpoint(audio_output_t *aout,<br></div>
<div>                                  const vlc_viewpoint_t *p_viewpoint)<br></div>
<div> {<br></div>
<div>diff --git a/src/libvlccore.sym b/src/libvlccore.sym<br></div>
<div>index d4db4ccc51..41af4b48db 100644<br></div>
<div>--- a/src/libvlccore.sym<br></div>
<div>+++ b/src/libvlccore.sym<br></div>
<div>@@ -20,6 +20,7 @@ aout_MuteSet<br></div>
<div> aout_MuteGet<br></div>
<div> aout_DeviceGet<br></div>
<div> aout_DeviceSet<br></div>
<div>+aout_DeviceNext<br></div>
<div> aout_DevicesList<br></div>
<div> aout_FiltersNew<br></div>
<div> aout_FiltersChangeViewpoint<br></div>
</pre></blockquote></div>
<div><br></div>
<div>-- <br></div>
<div>Envoyé de mon appareil Android avec Courriel K-9 Mail. Veuillez excuser ma brièveté. <br></div>
<div><u>_______________________________________________</u><br></div>
<div>vlc-devel mailing list<br></div>
<div>To unsubscribe or modify your subscription options:<br></div>
<div><a href="https://mailman.videolan.org/listinfo/vlc-devel">https://mailman.videolan.org/listinfo/vlc-devel</a><br></div>
</blockquote><div><br></div>


</blockquote></div><br>-- <br>Envoyé de mon appareil Android avec Courriel K-9 Mail. Veuillez excuser ma brièveté.</body></html>