[vlc-devel] [RFC v2 2/2] preparser: use the new executor API

Steve Lhomme robux4 at ycbcr.xyz
Wed Sep 2 12:04:49 CEST 2020


On 2020-09-02 11:06, Romain Vimont wrote:
> On Wed, Sep 02, 2020 at 08:28:14AM +0200, Steve Lhomme wrote:
>> On 2020-09-01 18:13, Romain Vimont wrote:
>>> Replace the background_worker by an executor.
>>> ---
>>>    src/preparser/preparser.c | 399 ++++++++++++++++++++++++--------------
>>>    1 file changed, 251 insertions(+), 148 deletions(-)
>>>
>>> diff --git a/src/preparser/preparser.c b/src/preparser/preparser.c
>>> index 723feb96dc..c78e956985 100644
>>> --- a/src/preparser/preparser.c
>>> +++ b/src/preparser/preparser.c
>>> @@ -24,8 +24,9 @@
>>>    #include <vlc_common.h>
>>>    #include <vlc_atomic.h>
>>> +#include <vlc_executor.h>
>>> +#include <vlc_tick.h>
>>
>> Why do we need this include ? We never needed it before.
> 
> We don't. It's from an older version of the executor :)
> 
> 
>>> -#include "misc/background_worker.h"
>>>    #include "input/input_interface.h"
>>>    #include "input/input_internal.h"
>>>    #include "preparser.h"
>>> @@ -35,222 +36,307 @@ struct input_preparser_t
>>>    {
>>>        vlc_object_t* owner;
>>>        input_fetcher_t* fetcher;
>>> -    struct background_worker* worker;
>>> +    vlc_executor_t *executor;
>>> +    vlc_tick_t default_timeout;
>>>        atomic_bool deactivated;
>>> +
>>> +    vlc_mutex_t lock;
>>> +    struct vlc_list submitted_tasks; /**< list of struct input_preparser_task */
>>>    };
>>> -typedef struct input_preparser_req_t
>>> +struct input_preparser_task
>>>    {
>>> +    input_preparser_t *preparser;
>>>        input_item_t *item;
>>>        input_item_meta_request_option_t options;
>>>        const input_preparser_callbacks_t *cbs;
>>>        void *userdata;
>>> -    vlc_atomic_rc_t rc;
>>> -} input_preparser_req_t;
>>> +    void *id;
>>> +    vlc_tick_t timeout;
>>> -typedef struct input_preparser_task_t
>>> -{
>>> -    input_preparser_req_t *req;
>>> -    input_preparser_t* preparser;
>>> -    int preparse_status;
>>>        input_item_parser_id_t *parser;
>>> -    atomic_int state;
>>> -    atomic_bool done;
>>> -} input_preparser_task_t;
>>> -
>>> -static input_preparser_req_t *ReqCreate(input_item_t *item,
>>> -                                        input_item_meta_request_option_t options,
>>> -                                        const input_preparser_callbacks_t *cbs,
>>> -                                        void *userdata)
>>> +
>>> +    vlc_mutex_t lock;
>>> +    vlc_cond_t cond_ended;
>>> +    bool preparse_ended;
>>> +    int preparse_status;
>>> +    bool fetch_ended;
>>> +
>>> +    atomic_bool interrupted;
>>> +
>>> +    struct vlc_runnable runnable; /**< to be passed to the executor */
>>> +
>>> +    struct vlc_list node; /**< node of input_preparser_t.submitted_tasks */
>>> +};
>>> +
>>> +static void RunnableRun(void *);
>>> +
>>> +static struct input_preparser_task *
>>> +TaskNew(input_preparser_t *preparser, input_item_t *item,
>>> +        input_item_meta_request_option_t options,
>>> +        const input_preparser_callbacks_t *cbs, void *userdata,
>>> +        void *id, vlc_tick_t timeout)
>>>    {
>>> -    input_preparser_req_t *req = malloc(sizeof(*req));
>>> -    if (unlikely(!req))
>>> +    assert(timeout >= 0);
>>
>> Did you mean VLC_TICK_INVALID ?
> 
> I keep the meaning exposed to the user:
>   - -1: use the default timeout (so not possible here)
>   - 0: infinite timeout
>   - >0: use the given timeout

That's not how vlc_tick_t is usually used. You should have defines for 
these values.
An infinite timeout should be INT64_MAX, not VLC_TICK_INVALID.


More information about the vlc-devel mailing list