Merge branch 'windows' of https://github.com/sogou/workflow into windows

This commit is contained in:
Xie Han
2023-03-28 19:06:51 +08:00
3 changed files with 26 additions and 53 deletions

View File

@@ -548,13 +548,16 @@ class WFMailboxTask : public WFGenericTask
public:
void send(void *msg)
{
*this->next++ = msg;
this->count();
*this->mailbox = msg;
if (this->flag.exchange(true))
{
this->state = WFT_STATE_SUCCESS;
this->subtask_done();
}
}
void **get_mailbox(size_t *n)
void **get_mailbox() const
{
*n = this->next - this->mailbox;
return this->mailbox;
}
@@ -564,22 +567,16 @@ public:
this->callback = std::move(cb);
}
public:
virtual void count()
protected:
virtual void dispatch()
{
if (--this->value == 0)
if (this->flag.exchange(true))
{
this->state = WFT_STATE_SUCCESS;
this->subtask_done();
}
}
protected:
virtual void dispatch()
{
this->WFMailboxTask::count();
}
virtual SubTask *done()
{
SeriesWork *series = series_of(this);
@@ -593,23 +590,20 @@ protected:
protected:
void **mailbox;
std::atomic<void **> next;
std::atomic<size_t> value;
std::atomic<bool> flag;
std::function<void (WFMailboxTask *)> callback;
public:
WFMailboxTask(void **mailbox, size_t size,
WFMailboxTask(void **mailbox,
std::function<void (WFMailboxTask *)>&& cb) :
next(mailbox),
value(size + 1),
flag(false),
callback(std::move(cb))
{
this->mailbox = mailbox;
}
WFMailboxTask(std::function<void (WFMailboxTask *)>&& cb) :
next(&this->user_data),
value(2),
flag(false),
callback(std::move(cb))
{
this->mailbox = &this->user_data;
@@ -729,9 +723,9 @@ public:
this->create = std::move(create);
}
void set_callback(std::function<void (WFRepeaterTask *)> callback)
void set_callback(std::function<void (WFRepeaterTask *)> cb)
{
this->callback = std::move(callback);
this->callback = std::move(cb);
}
protected:

View File

@@ -304,33 +304,6 @@ void WFTaskFactory::count_by_name(const std::string& counter_name, unsigned int
__counter_map.count_n(counter_name, n);
}
/********MailboxTask*************/
class __WFMailboxTask : public WFMailboxTask
{
public:
__WFMailboxTask(size_t size, mailbox_callback_t&& cb) :
WFMailboxTask(new void *[size], size, std::move(cb))
{
}
virtual ~__WFMailboxTask()
{
delete []this->mailbox;
}
};
WFMailboxTask *WFTaskFactory::create_mailbox_task(size_t size,
mailbox_callback_t callback)
{
return new __WFMailboxTask(size, std::move(callback));
}
WFMailboxTask *WFTaskFactory::create_mailbox_task(mailbox_callback_t callback)
{
return new WFMailboxTask(std::move(callback));
}
/****************** Named Conditional ******************/
class __WFConditional;

View File

@@ -231,11 +231,17 @@ public:
static void count_by_name(const std::string& counter_name, unsigned int n);
public:
static WFMailboxTask *create_mailbox_task(size_t size,
mailbox_callback_t callback);
static WFMailboxTask *create_mailbox_task(void **mailbox,
mailbox_callback_t callback)
{
return new WFMailboxTask(mailbox, std::move(callback));
}
/* Use 'user_data' as mailbox. Store only one message. */
static WFMailboxTask *create_mailbox_task(mailbox_callback_t callback);
/* Use 'user_data' as mailbox. */
static WFMailboxTask *create_mailbox_task(mailbox_callback_t callback)
{
return new WFMailboxTask(std::move(callback));
}
public:
static WFConditional *create_conditional(SubTask *task, void **msgbuf)