mirror of
https://github.com/sogou/workflow.git
synced 2026-02-08 01:33:17 +08:00
Merge branch 'windows' of https://github.com/sogou/workflow into windows
This commit is contained in:
@@ -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:
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user