acme
Foundational cross-platform layer of the ca2 framework
Loading...
Searching...
No Matches
fork.h
1#pragma once
2
3
4#include "task.h"
5
6
7
8template < typename PRED >
9class predicate_task:
10 virtual public ::task
11{
12public:
13
14
15 PRED m_predicate;
16
17
18 predicate_task(::particle * pparticle, PRED pred) :
19 m_predicate(pred)
20 {
21
22 m_bIsPredicate = true;
23
24 //m_bLastingThread = false;
25
26 //m_bFork = true;
27
28 initialize(pparticle);
29
30
31 }
32
33
34 virtual ~predicate_task()
35 {
36
37 }
38
39
40 void run() override
41 {
42
43 m_predicate();
44
45 //return ::success;
46
47 }
48
49
50};
51
52
53template < typename PRED >
54inline auto new_predicateicate_task(::particle * pparticle, PRED pred)
55{
56
57 return allocateø predicate_task < PRED > (pparticle, pred);
58
59}
60
61//class CLASS_DECL_ACME runner :
62// virtual public ::object
63//{
64//public:
65//
66//
67// ::task_pointer m_ptask;
68// bool m_bExecuting;
69// bool m_bPending;
70// class ::time m_timeStart;
71//
72// runner()
73// {
74//
75// m_bExecuting = false;
76//
77// m_bPending = false;
78//
79// }
80//
81// virtual ~runner()
82// {
83//
84// }
85//
86//
87// template < typename PRED >
88// void operator()(class ::time time, PRED pred)
89// {
90//
91// m_timeStart = class ::time::now() + time;
92//
93// m_bPending = true;
94//
95// auto predDelayed = [this, pred]()
96// {
97//
98// while(true)
99// {
100//
101// sleep(100_ms);
102//
103// if(!::task_get_run())
104// {
105//
106// break;
107//
108// }
109//
110// if(m_timeStart.elapsed() >= 0 && !m_bExecuting)
111// {
112//
113// m_bPending = false;
114//
115// KEEP(m_bExecuting);
116//
117// pred();
118//
119// if(!m_bPending)
120// {
121//
122// break;
123//
124// }
125//
126// }
127//
128// }
129//
130// };
131//
132// __object(this)->start(m_ptask, predDelayed);
133//
134// }
135//
136//};
137
138
139//template < typename PRED >
140//CLASS_DECL_ACME ::pointer<::task>& branch(::pointer<::task> ptask, ::particle * pparticle, const ::procedure & procedure);
141
142
143
144//template < typename PRED >
145//::task * fork(::particle * pparticle, PRED pred)
146//{
147//
148// ::task * ptask = nullptr;
149//
150// return fork(ptask, pparticle, pred);
151//
152//}
153
154
155//template < typename PRED >
156//::pointer<task>fork(PRED pred);
157
158
159//template < typename PRED >
160//inline ::task_pointer object::__task(PRED pred)
161//{
162//
163// auto ppred = __predicate(pred);
164//
165// return ::task::start(pred);
166//
167//}
168
169
170//template < typename PRED >
171//inline ::task_pointer object::__task(PRED pred)
172//{
173//
174// auto ppred = __predicate(pred);
175//
176// return ::task::start(ppred);
177//
178//}
179
180
181
182
183
184
185
186
187// template < typename PRED >
188CLASS_DECL_ACME ::task * predicate_run(::object * pobjectParent, bool bSync, const ::procedure & procedure);
189
190
191//CLASS_DECL_ACME ::i32 get_current_process_affinity_order();
192
193
194
195
196
197//
198//template < typename PRED >
199//::pointer<task>fork(::particle * pparticle, PRED pred)
200//{
201//
202// ptask = ___new predicate_task < PRED > (pparticle, pred);
203//
204// ptask->begin();
205//
206// ptask->release();
207//
208// return ptask;
209//
210//}
211//
212
213//template < typename PRED >
214//::task * fork(::particle * pparticle, PRED pred, const ::scoped_string & scopedstrTag, ::i32 iCallStackAddUp = 0, enum_priority epriority = e_priority_normal)
215//{
216//
217// auto ppredtask = allocateø predicate_task < PRED > (pparticle, pred);
218//
219// string strTag(scopedstrTag);
220//
221// if (is_callstack_enabled(callstack_fork_global))
222// {
223//
224// if (strTag.is_empty())
225// {
226//
227// iCallStackAddUp++;
228//
229// auto pcallstack = get_callstack(callstack_fork_global, iCallStackAddUp);
230//
231// strTag = pcallstack->xxxstack_trace();
232//
233// strTag.trim();
234//
235// }
236//
237// }
238//
239// ppredtask->task_set_name(strTag);
240//
241// ppredtask->begin(epriority);
242//
243// return ppredtask;
244//
245//}
246
247
249//template < typename PRED >
250//::task * opt_fork(::particle * pparticle, PRED pred)
251//{
252//
253// if (::get_task() != nullptr && ::get_task()->m_bFork)
254// {
255//
256// pred();
257//
258// return nullptr;
259//
260// }
261//
262// return fork(pparticle, pred);
263//
264//}
265
266
267//template < typename PRED >
268//inline ::pointer<::task>object::fork(PRED pred)
269//{
270//
271// iCallStackAddUp++;
272//
273// defer_create_synchronization();
274//
275// synchronous_lock synchronouslock(this->synchronization(), DEFAULT_SYNCHRONOUS_LOCK_SUFFIX);
276//
277// ptask = ::fork(ptask, this, pred, pszTag, iCallStackAddUp);
278//
279// return ptask;
280//
281//}
282
283
284//template < typename PRED >
285//inline auto object::fork(PRED pred, const ::scoped_string & scopedstrTag, ::i32 iCallStackAddUp, enum_priority epriority)
286//{
287//
288// iCallStackAddUp++;
289//
290// defer_create_synchronization();
291//
292// synchronous_lock synchronouslock(this->synchronization(), DEFAULT_SYNCHRONOUS_LOCK_SUFFIX);
293//
294// return fork(pred, pszTag, iCallStackAddUp, epriority);
295//
296//}
297
298
299
300//template < typename PRED >
301//inline ::task_pointer object::defer_fork(const ::scoped_string & scopedstrTag, PRED pred)
302//{
303//
304// ::pointer<task>ptask = running(scopedstrTag);
305//
306// if (ptask)
307// {
308//
309// return ptask;
310//
311// }
312//
313// return fork(pred, pszTag);
314//
315//}
316//
317
318//template < typename PRED >
319//inline auto object::opt_fork(PRED pred)
320//{
321//
322// return ::opt_fork(this, pred);
323//
324//}
325
326
327
328//template < typename T >
329//inline void fork_release(::object * pobjectParent, pointer < T > & t)
330//{
331//
332// try
333// {
334//
335// T * p;
336//
337// p = t.m_p;
338//
339// p->increment_reference_count(REFERENCING_DEBUGGING_P_NOTE(pobjectParent, "fork_release"));
340//
341// t.release();
342//
343// pobjectParent->fork([&]()
344// {
345//
346// ::release(p);
347//
348// });
349//
350// }
351// catch (...)
352// {
353//
354//
355// }
356//
357//}
358//
359
360
361//class CLASS_DECL_ACME forking_count_function :
362// virtual public particle
363//{
364//public:
365//
366// ::function < void(index) > m_function;
367//
368// struct fork_index
369// {
370//
371// index m_iOrder;
372// index m_iIndex;
373// index m_iScan;
374// ::collection::count m_cCount;
375// index m_i32;
376//
377// operator index()
378// {
379//
380// return m_i32;
381//
382// }
383//
384// };
385//
386// fork_index m_index;
387//
388// forking_count_predicate(::collection::index iOrder, ::collection::index iIndex, ::collection::count iScan, ::collection::count cCount, const ::function < void(index) > & function) :
389// m_predicate(function)
390// {
391//
392// m_index.m_iOrder = iOrder;
393// m_index.m_iIndex = iIndex;
394// m_index.m_iScan = iScan;
395// m_index.m_cCount = cCount;
396//
397// }
398//
399// virtual void run() override
400// {
401//
402// for (m_index.m_i32 = m_index.m_iIndex; m_index.m_i32 < m_index.m_cCount; m_index.m_i32 += m_index.m_iScan)
403// {
404//
405// m_function(m_index);
406//
407// }
408//
409// //return ::success;
410//
411// }
412//
413//};
414
415
416class CLASS_DECL_ACME forking_count_task :
417virtual public task
418{
419public:
420
421
422
423 ::function < void(::collection::index, ::collection::index, ::collection::index, ::collection::index) > m_function;
424
425
426 ::collection::index m_iOrder;
427 ::collection::index m_iIndex;
428 ::collection::count m_iScan;
429 ::collection::count m_iCount;
430
431 ::pointer<object> m_pobjectTaskEnd;
432
433 ::pointer<object> m_pholdref;
434
435
436 forking_count_task(::particle * pparticle, ::pointer<object>pholdref, ::collection::index iOrder, ::collection::index iIndex, ::collection::count iScan, ::collection::count iCount, const ::function < void(::collection::index, ::collection::index, ::collection::index, ::collection::index) > & function, ::object * pobjectTaskEnd = nullptr);
437
438 forking_count_task(::particle * pparticle, ::collection::index iOrder, ::collection::index iIndex, ::collection::count iScan, ::collection::count iCount, const ::function < void(::collection::index, ::collection::index, ::collection::index, ::collection::index) > & function, ::object * pobjectTaskEnd = nullptr);
439
440
441 void construct();
442
443
444 ~forking_count_task() override;
445
446 void run() override;
447
448};
449
450
451//CLASS_DECL_ACME void fork_count(::particle * pobjectParent, ::collection::count iCount, const ::function < void(::collection::index, ::collection::index, ::collection::index, ::collection::index) > & function, const ::procedure & procedureCompletion, ::collection::index iStart = 0);
452
453
454//template < typename PRED, typename PRED_END >
455//::collection::count fork_count_end_predicate(::collection::count iCount, PRED pred, PRED_END predEnd, class ::time time = ::time::infinite(), ::collection::index iStart = 0)
456//{
457//
458// //ASSERT(pobjectParent != nullptr && pobjectParent->application() != nullptr);
459//
460// ::i32 iAffinityOrder = get_current_process_affinity_order();
461//
462// if (::get_task() == nullptr || ::get_task()->m_bAvoidProcedureFork)
463// {
464//
465// iAffinityOrder = 1;
466//
467// }
468//
469// ::collection::count iScan = maximum(1, minimum(iCount - iStart, iAffinityOrder));
470//
471// auto pobjectTaskEnd = create_task(predEnd);
472//
473// for (::collection::index iOrder = 0; iOrder < iScan; iOrder++)
474// {
475//
476// auto ppredtask = allocateø forking_count_task < PRED > (iOrder, iOrder + iStart, iScan, iCount, pred, pobjectTaskEnd);
477//
478// ppredtask->begin();
479//
480// }
481//
482// return iScan;
483//
484//}
485//
486
487//template < typename PRED >
488//class forking_for_task :
489//virtual public task
490//{
491//public:
492//
493// PRED m_predicate;
494//
495//
496//
497// index m_iOrder;
498// index m_iIndex;
499// ::collection::count m_iScan;
500// ::collection::count m_iCount;
501//
502// ::pointer<::object> m_pobjectTaskEnd;
503//
504// forking_for_task(::particle * pparticle, ::collection::index iOrder, ::collection::index iIndex, ::collection::count iScan, ::collection::count iCount, PRED pred) :
505// ::object(pparticle),
506// m_predicate(pred),
507// m_iOrder(iOrder),
508// m_iIndex(iIndex),
509// m_iScan(iScan),
510// m_iCount(iCount)
511// {
512// construct();
513// }
514//
515// void construct()
516// {
517//
518// m_uThreadAffinityMask = translate_processor_affinity(::i32(m_iOrder));
519//
520// }
521//
522// virtual ~forking_for_task()
523// {
524//
525// }
526//
527// void run()
528// {
529//
530// for (; m_iIndex < m_iCount; m_iIndex += m_iScan)
531// {
532//
533// m_predicate(m_iIndex);
534//
535// }
536//
537// if (m_pobjectTaskEnd)
538// {
539//
540// m_pobjectTaskEnd->m_cRun++;
541//
542// if (m_pobjectTaskEnd->m_cRun == 0)
543// {
544//
545// m_pobjectTaskEnd->operator()();
546//
547// }
548//
549// }
550//
551// return ::success;
552//
553// }
554//
555//};
556
557
558//template < typename PRED >
559//auto fork_for(::object * pobjectParent, ::collection::count iCount, PRED pred, ::collection::index iStart = 0)
560//{
561//
562// ::i32 iAffinityOrder = get_current_process_affinity_order();
563//
564// if (::get_task() == nullptr || ::get_task()->m_bAvoidProcedureFork)
565// {
566//
567// iAffinityOrder = 1;
568//
569// }
570//
571// ::collection::count iScan = maximum(1, minimum(iCount - iStart, iAffinityOrder));
572//
573// auto pcounter = allocateø ::counter < ::i32 > (iScan);
574//
575// for (::collection::index iOrder = 0; iOrder < iScan; iOrder++)
576// {
577//
578// auto ppredtask = allocateø forking_for_task < PRED > (pobjectParent, iOrder, iOrder + iStart, iScan, iCount, pred);
579//
580// ppredtask->m_pcounter = pcounter;
581//
582// ppredtask->begin();
583//
584// }
585//
586// return pcounter;
587//
588//}
589
590//template < typename PRED, typename PRED_END >
591//auto fork_for_end(::object* pobjectParent, ::collection::count iCount, PRED pred, PRED_END predEnd, ::collection::index iStart = 0)
592//{
593//
594// ::i32 iAffinityOrder = get_current_process_affinity_order();
595//
596// if (::get_task() == nullptr || ::get_task()->m_bAvoidProcedureFork)
597// {
598//
599// iAffinityOrder = 1;
600//
601// }
602//
603// ::collection::count iScan = maximum(1, minimum(iCount - iStart, iAffinityOrder));
604//
605// auto pcounter = allocateø ::counter < ::i32 > (iScan);
606//
607// auto pobjectTaskEnd = __runnable(predEnd);
608//
609// pobjectTaskEnd->m_cRun = -iScan;
610//
611// for (::collection::index iOrder = 0; iOrder < iScan; iOrder++)
612// {
613//
614// auto ppredtask = allocateø forking_for_task < PRED > (pobjectParent, iOrder, iOrder + iStart, iScan, iCount, pred);
615//
616// ppredtask->m_pcounter = pcounter;
617//
618// ppredtask->m_pobjectTaskEnd = pobjectTaskEnd;
619//
620// ppredtask->begin();
621//
622// }
623//
624// return pcounter;
625//
626//}
627
628
629
630CLASS_DECL_ACME ::u32 processor_index_generator();
631
632
633//template < typename PRED >
634//pointer_array < ::task > fork_proc(::object * pobjectParent, PRED pred, ::collection::index iCount = -1)
635//{
636//
637// pointer_array < ::task > taskptra;
638//
639// ::i32 iProcCount = get_current_process_affinity_order();
640//
641// if (iCount < 0 || iCount > iProcCount)
642// {
643//
644// iCount = iProcCount;
645//
646// }
647//
648// iCount = maximum(1, iCount);
649//
650// if (::get_task() == nullptr || ::get_task()->m_bAvoidProcedureFork)
651// {
652//
653// iCount = 1;
654//
655// }
656//
657// for (::collection::index iProcessor = 0; iProcessor < iCount; iProcessor++)
658// {
659//
660// auto ppredtask = allocateø predicate_task < PRED > (pobjectParent, pred);
661//
662// ::task * ptask = dynamic_cast < ::task * > (ppredtask);
663//
664// ptask->m_uThreadAffinityMask = translate_processor_affinity(processor_index_generator() % iProcCount);
665//
666// ptask->m_bThreadToolsForIncreasedFps = false;
667//
668// //ptask->m_bAvoidProcFork = true;
669//
670// taskptra.add(ptask);
671//
672// ptask->begin();
673//
674// }
675//
676// return taskptra;
677//
678//}
679
680
681CLASS_DECL_ACME ::task * predicate_run(::particle * pparticle, bool bSync, const ::procedure & procedure);
682
683
684//template < typename PRED >
685//inline ::task_pointer & object::start(::task_pointer & ptask, PRED pred)
686//{
687//
688// if (ptask && ptask->is_running())
689// {
690//
691// return ptask;
692//
693// }
694//
695// return fork(ptask, pred);
696//
697//}
698//
699//
700//template < typename PRED >
701//inline ::task_pointer & object::defer_fork(::task_pointer& ptask, PRED pred)
702//{
703//
704// if (ptask && ptask->is_running())
705// {
706//
707// return ptask;
708//
709// }
710//
711// return fork(ptask, pred);
712//
713//}
714//
715//
716//template < typename TYPE >
717//inline ::pointer<TYPE>& object::defer_fork(::pointer<TYPE> ptype)
718//{
719//
720// if (ptype && ptype->is_running())
721// {
722//
723// return ptype;
724//
725// }
726//
727// return fork(ptype);
728//
729//}
730
731
732//template < typename PRED >
733//inline ::task_pointer& object::fork(::task_pointer& ptask, PRED pred)
734//{
735//
736// ptask->m_pmatter = __predicate(pred);
737//
738// return fork(ptask);
739//
740//}
741
742
743//template < typename PRED >
744//inline ::task_pointer& object::fork(::task_pointer& ptask, PRED pred)
745//{
746//
747// ptask->m_pmatter = __predicate(pred);
748//
749// return fork(ptask);
750//
751//}
752//
753//
754//template < typename TYPE >
755//inline ::pointer<TYPE> object::fork(::pointer<TYPE>ptype)
756//{
757//
758// ::task::start(ptype);
759//
760// return ptype;
761//
762//}
763
764
765
Definition _template_forward_declaration.h:297
Definition bbb_object.h:11
Definition particle.h:95