0001:
0002:
0003:
0004:
0005:
0006:
0007:
0008:
0009:
0010:
0011:
0012:
0013:
0014:
0015:
0016:
0017:
0018:
0019:
0020:
0021:
0022:
0023:
0024:
0025:
0026:
0027:
0028:
0029:
0030:
0031:
0032:
0033:
0034:
0035:
0036:
0037:
0038:
0039:
0040:
0041:
0042:
0043:
0044:
0045:
0046:
0047:
0048:
0049:
0050:
0051:
0052:
0053:
0054:
0055:
0056:
0057:
0058:
0059:
0060:
0061:
0062:
0063:
0064:
0065:
0066:
0067:
0068:
0069:
0070:
0071:
0072:
0073:
0074:
0075:
0076:
0077:
0078:
0079:
0080:
0081:
0082:
0083:
0084:
0085:
0086:
0087:
0088:
0089:
0090:
0091:
0092:
0093:
0094:
0095:
0096:
0097:
0098:
0099:
0100:
0101:
0102:
0103:
0104:
0105:
0106:
0107:
0108:
0109:
0110:
0111:
0112:
0113:
0114:
0115:
0116:
0117:
0118:
0119:
0120:
0121:
0122:
0123:
0124:
0125:
0126:
0127:
0128:
0129:
0130:
0131:
0132:
0133:
0134:
0135:
0136:
0137:
0138:
0139:
0140:
0141:
0142:
0143:
0144:
0145:
0146:
0147:
0148:
0149:
0150:
0151:
0152:
0153:
0154:
0155:
0156:
0157:
0158:
0159:
0160:
0161:
0162:
0163:
0164:
0165:
0166:
0167:
0168:
0169:
0170:
0171:
0172:
0173:
0174:
0175:
0176:
0177:
0178:
0179:
0180:
0181:
0182:
0183:
0184:
0185:
0186:
0187:
0188:
0189:
0190:
0191:
0192:
0193:
0194:
0195:
0196:
0197:
0198:
0199:
0200:
0201:
0202:
0203:
0204:
0205:
0206:
0207:
0208:
0209:
0210:
0211:
0212:
0213:
0214:
0215:
0216:
0217:
0218:
0219:
0220:
0221:
0222:
0223:
0224:
0225:
0226:
0227:
0228:
0229:
0230:
0231:
0232:
0233:
0234:
0235:
0236:
0237:
0238:
0239:
0240:
0241:
0242:
0243:
0244:
0245:
0246:
0247:
0248:
0249:
0250:
0251:
0252:
0253:
0254:
0255:
0256:
0257:
0258:
0259:
0260:
0261:
0262:
0263:
0264:
0265:
0266:
0267:
0268:
0269:
0270:
0271:
0272:
0273:
0274:
0275:
0276:
0277:
0278:
0279:
0280:
0281:
0282:
0283:
0284:
0285:
0286:
0287:
0288:
0289:
0290:
0291:
0292:
0293:
0294:
0295:
0296:
0297:
0298:
0299:
0300:
0301:
0302:
0303:
0304:
0305:
0306:
0307:
0308:
0309:
0310:
0311:
0312:
0313:
0314:
0315:
0316:
0317:
0318:
0319:
0320:
0321:
0322:
0323:
0324:
0325:
0326:
0327:
0328:
0329:
0330:
0331:
0332:
0333:
0334:
0335:
0336:
0337:
0338:
0339:
0340:
0341:
0342:
0343:
0344:
0345:
0346:
0347:
0348:
0349:
0350:
0351:
0352:
0353:
0354:
0355:
0356:
0357:
0358:
0359:
0360:
0361:
0362:
0363:
0364:
0365:
0366:
0367:
0368:
0369:
0370:
0371:
0372:
0373:
0374:
0375:
0376:
0377:
0378:
0379:
0380:
0381:
0382:
0383:
0384:
0385:
0386:
0387:
0388:
0389:
0390:
0391:
0392:
0393:
0394:
0395:
0396:
0397:
0398:
0399:
0400:
0401:
0402:
0403:
0404:
0405:
0406:
0407:
0408:
0409:
0410:
0411:
0412:
0413:
0414:
0415:
0416:
0417:
0418:
0419:
0420:
0421:
0422:
0423:
0424:
0425:
0426:
0427:
0428:
0429:
0430:
0431:
0432:
0433:
0434:
0435:
0436:
0437:
0438:
0439:
0440:
0441:
0442:
0443:
0444:
0445:
0446:
0447:
0448:
0449:
0450:
0451:
0452:
0453:
0454:
0455:
0456:
0457:
0458:
0459:
0460:
0461:
0462:
0463:
0464:
0465:
0466:
0467:
0468:
0469:
0470:
0471:
0472:
0473:
0474:
0475:
0476:
0477:
0478:
0479:
0480:
0481:
0482:
0483:
0484:
0485:
0486:
0487:
0488:
0489:
0490:
0491:
0492:
0493:
0494:
0495:
0496:
0497:
0498:
0499:
0500:
0501:
0502:
0503:
0504:
0505:
0506:
0507:
0508:
0509:
0510:
0511:
0512:
0513:
0514:
0515:
0516:
0517:
0518:
0519:
0520:
0521:
0522:
0523:
0524:
0525:
0526:
0527:
0528:
0529:
0530:
0531:
0532:
0533:
0534:
0535:
0536:
0537:
0538:
0539:
0540:
0541:
0542:
0543:
0544:
0545:
0546:
0547:
0548:
0549:
0550:
0551:
0552:
0553:
0554:
0555:
0556:
0557:
0558:
0559:
0560:
0561:
0562:
0563:
0564:
0565:
0566:
0567:
0568:
0569:
0570:
0571:
0572:
0573:
0574:
0575:
0576:
0577:
0578:
0579:
0580:
0581:
0582:
0583:
0584:
0585:
0586:
0587:
0588:
0589:
0590:
0591:
0592:
0593:
0594:
0595:
0596:
0597:
0598:
0599:
0600:
0601:
0602:
0603:
0604:
0605:
0606:
0607:
0608:
0609:
0610:
0611:
0612:
0613:
0614:
0615:
0616:
0617:
0618:
0619:
0620:
0621:
0622:
0623:
0624:
0625:
0626:
0627:
0628:
0629:
0630:
0631:
0632:
0633:
0634:
0635:
0636:
0637:
0638:
0639:
0640:
0641:
0642:
0643:
0644:
0645:
0646:
0647:
0648:
0649:
0650:
0651:
0652:
0653:
0654:
0655:
0656:
0657:
0658:
0659:
0660:
0661:
0662:
0663:
0664:
0665:
0666:
0667:
0668:
0669:
0670:
0671:
0672:
0673:
0674:
0675:
0676:
0677:
0678:
0679:
0680:
0681:
0682:
0683:
0684:
0685:
0686:
0687:
0688:
0689:
0690:
0691:
0692:
0693:
0694:
0695:
0696:
0697:
0698:
0699:
0700:
0701:
0702:
0703:
0704:
0705:
0706:
0707:
0708:
0709:
0710:
0711:
0712:
0713:
0714:
0715:
0716:
0717:
0718:
0719:
0720:
0721:
0722:
0723:
0724:
0725:
0726:
0727:
0728:
0729:
0730:
0731:
0732:
0733:
0734:
0735:
0736:
0737:
0738:
0739:
0740:
0741:
0742:
0743:
0744:
0745:
0746:
0747:
0748:
0749:
0750:
0751:
0752:
0753:
0754:
0755:
0756:
0757:
0758:
0759:
0760:
0761:
0762:
0763:
0764:
0765:
0766:
0767:
0768:
0769:
0770:
0771:
0772:
0773:
0774:
0775:
0776:
0777:
0778:
0779:
0780:
0781:
0782:
0783:
0784:
0785:
0786:
0787:
0788:
0789:
0790:
0791:
0792:
0793:
0794:
0795:
0796:
0797:
0798:
0799:
0800:
0801:
0802:
0803:
0804:
0805:
0806:
0807:
0808:
0809:
0810:
0811:
0812:
0813:
0814:
0815:
0816:
0817:
0818:
0819:
0820:
0821:
0822:
0823:
0824:
0825:
0826:
0827:
0828:
0829:
0830:
0831:
0832:
0833:
0834:
0835:
0836:
0837:
0838:
0839:
0840:
0841:
0842:
0843:
0844:
0845:
0846:
0847:
0848:
0849:
0850:
0851:
0852:
0853:
0854:
0855:
0856:
0857:
0858:
0859:
0860:
0861:
0862:
0863:
0864:
0865:
0866:
0867:
0868:
0869:
0870:
0871:
0872:
0873:
0874:
0875:
0876:
0877:
0878:
0879:
0880:
0881:
0882:
0883:
0884:
0885:
0886:
0887:
0888:
0889:
0890:
0891:
0892:
0893:
0894:
0895:
0896:
0897:
0898:
0899:
0900:
0901:
0902:
0903:
0904:
0905:
0906:
0907:
0908:
0909:
0910:
0911:
0912:
0913:
0914:
0915:
0916:
0917:
0918:
0919:
0920:
0921:
0922:
0923:
0924:
0925:
0926:
0927:
0928:
0929:
0930:
0931:
0932:
0933:
0934:
0935:
0936:
0937:
0938:
0939:
0940:
0941:
0942:
0943:
0944:
0945:
0946:
0947:
0948:
0949:
0950:
0951:
0952:
0953:
0954:
0955:
0956:
0957:
0958:
0959:
0960:
0961:
0962:
0963:
0964:
0965:
0966:
0967:
0968:
0969:
0970:
0971:
0972:
0973:
0974:
0975:
0976:
0977:
0978:
0979:
0980:
0981:
0982:
0983:
0984:
0985:
0986:
0987:
0988:
0989:
0990:
0991:
0992:
0993:
0994:
0995:
0996:
0997:
0998:
0999:
1000:
1001:
1002:
1003:
1004:
1005:
1006:
1007:
1008:
1009:
1010:
1011:
1012:
1013:
1014:
1015:
1016:
1017:
1018:
1019:
1020:
1021:
1022:
1023:
1024:
1025:
1026:
1027:
1028:
1029:
1030:
1031:
1032:
1033:
1034:
1035:
1036:
1037:
1038:
1039:
1040:
1041:
1042:
1043:
1044:
1045:
1046:
1047:
1048:
1049:
1050:
1051:
1052:
1053:
1054:
1055:
1056:
1057:
1058:
1059:
1060:
1061:
1062:
1063:
1064:
1065:
1066:
1067:
1068:
1069:
1070:
1071:
1072:
1073:
1074:
1075:
1076:
1077:
1078:
1079:
1080:
1081:
1082:
1083:
1084:
1085:
1086:
1087:
1088:
1089:
1090:
1091:
1092:
1093:
1094:
1095:
1096:
1097:
1098:
1099:
1100:
1101:
1102:
1103:
1104:
1105:
1106:
1107:
1108:
1109:
1110:
1111:
1112:
1113:
1114:
1115:
1116:
1117:
1118:
1119:
1120:
1121:
1122:
1123:
1124:
1125:
1126:
1127:
1128:
1129:
1130:
1131:
1132:
1133:
1134:
1135:
1136:
1137:
1138:
1139:
1140:
1141:
1142:
1143:
1144:
1145:
1146:
1147:
1148:
1149:
1150:
1151:
1152:
1153:
1154:
1155:
1156:
1157:
1158:
1159:
1160:
1161:
1162:
1163:
1164:
1165:
1166:
1167:
1168:
1169:
1170:
1171:
1172:
1173:
1174:
1175:
1176:
1177:
1178:
1179:
1180:
1181:
1182:
1183:
1184:
1185:
1186:
1187:
1188:
1189:
1190:
1191:
1192:
1193:
1194:
1195:
1196:
1197:
1198:
1199:
1200:
1201:
1202:
1203:
1204:
1205:
1206:
1207:
1208:
1209:
1210:
1211:
1212:
1213:
1214:
1215:
1216:
1217:
1218:
1219:
1220:
1221:
1222:
1223:
1224:
1225:
1226:
1227:
1228:
1229:
1230:
1231:
1232:
1233:
1234:
1235:
1236:
1237:
1238:
1239:
1240:
1241:
1242:
1243:
1244:
1245:
1246:
1247:
1248:
1249:
1250:
1251:
1252:
1253:
1254:
1255:
1256:
1257:
1258:
1259:
1260:
1261:
1262:
1263:
1264:
1265:
1266:
1267:
1268:
1269:
1270:
1271:
1272:
1273:
1274:
1275:
1276:
1277:
1278:
1279:
1280:
1281:
1282:
1283:
1284:
1285:
1286:
1287:
1288:
1289:
1290:
1291:
1292:
1293:
1294:
1295:
1296:
1297:
1298:
1299:
1300:
1301:
1302:
1303:
1304:
1305:
1306:
1307:
1308:
1309:
1310:
1311:
1312:
1313:
1314:
1315:
1316:
1317:
1318:
1319:
1320:
1321:
1322:
1323:
1324:
1325:
1326:
1327:
1328:
1329:
1330:
1331:
1332:
1333:
1334:
1335:
1336:
1337:
1338:
1339:
1340:
1341:
1342:
1343:
1344:
1345:
1346:
1347:
1348:
1349:
1350:
1351:
1352:
1353:
1354:
1355:
1356:
1357:
1358:
1359:
1360:
1361:
1362:
1363:
1364:
1365:
1366:
1367:
1368:
1369:
1370:
1371:
1372:
1373:
1374:
1375:
1376:
1377:
1378:
1379:
1380:
1381:
1382:
1383:
1384:
1385:
1386:
1387:
1388:
1389:
1390:
1391:
1392:
1393:
1394:
1395:
1396:
1397:
1398:
1399:
1400:
1401:
1402:
1403:
1404:
1405:
1406:
1407:
1408:
1409:
1410:
1411:
1412:
1413:
1414:
1415:
1416:
1417:
1418:
1419:
1420:
1421:
1422:
1423:
1424:
1425:
1426:
1427:
1428:
1429:
1430:
1431:
1432:
1433:
1434:
1435:
1436:
1437:
1438:
1439:
1440:
1441:
1442:
1443:
1444:
1445:
1446:
1447:
1448:
1449:
1450:
1451:
1452:
1453:
1454:
1455:
1456:
1457:
1458:
1459:
1460:
1461:
1462:
1463:
1464:
1465:
1466:
1467:
1468:
1469:
1470:
1471:
1472:
1473:
1474:
1475:
1476:
1477:
1478:
1479:
1480:
1481:
1482:
1483:
1484:
1485:
1486:
1487:
1488:
1489:
1490:
1491:
1492:
1493:
1494:
1495:
1496:
1497:
1498:
1499:
1500:
1501:
1502:
1503:
1504:
1505:
1506:
1507:
1508:
1509:
1510:
1511:
1512:
1513:
1514:
1515:
1516:
1517:
1518:
1519:
1520:
1521:
1522:
1523:
1524:
1525:
1526:
1527:
1528:
1529:
1530:
1531:
1532:
1533:
1534:
1535:
1536:
1537:


/*
* Copyright (c), Zeriph Enterprises
* All rights reserved.
*
* Contributor(s):
* Zechariah Perez, omni (at) zeriph (dot) com
*
* THIS SOFTWARE IS PROVIDED BY ZERIPH AND CONTRIBUTORS "AS IS" AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL ZERIPH AND CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#if !defined(OMNI_THREAD_T_HPP)
#define OMNI_THREAD_T_HPP 1
#include <omni/defs/global.hpp>
#include <omni/defs/thread_def.hpp>
#include <omni/string/util.hpp>
#include <omni/types/string_t.hpp>
#include <omni/util/bits.hpp>
#include <omni/generic_ptr.hpp>
#include <omni/chrono/tick.hpp>
#include <omni/delegate/0.hpp>
#include <omni/delegate/1.hpp>
#include <omni/delegate/2.hpp>
#include <omni/defs/consts.hpp>
namespace omni {
namespace sync {
class thread_priority {
public:
typedef enum enum_t {
IDLE = -15,
LOWEST = -2,
BELOW_NORMAL = -1,
NORMAL = 0,
ABOVE_NORMAL = 1,
HIGHEST = 2,
REAL_TIME = 15
} enum_t;
static inline unsigned short COUNT()
{
return 7;
}
static inline enum_t DEFAULT_VALUE()
{
return NORMAL;
}
static std::string to_string(enum_t v)
{
return _to_val<std::stringstream>(v);
}
static std::wstring to_wstring(enum_t v)
{
return _to_val<std::wstringstream>(v);
}
static enum_t parse(const std::string& val)
{
return _parse(val);
}
static enum_t parse(const std::wstring& val)
{
return _parse(val);
}
static bool try_parse(const std::string& val, enum_t& out)
{
return _try_parse(val, out);
}
static bool try_parse(const std::wstring& val, enum_t& out)
{
return _try_parse(val, out);
}
static bool try_parse(const std::string& val, thread_priority& out)
{
return _try_parse(val, out);
}
static bool try_parse(const std::wstring& val, thread_priority& out)
{
return _try_parse(val, out);
}
static bool is_valid(int32_t val)
{
return _valid(val);
}
thread_priority() :
OMNI_CTOR_FW(omni::sync::thread_priority)
m_val(DEFAULT_VALUE())
{ }
thread_priority(const thread_priority& cp) :
OMNI_CPCTOR_FW(cp)
m_val(cp.m_val)
{ }
thread_priority(enum_t val) :
OMNI_CTOR_FW(omni::sync::thread_priority)
m_val(val)
{ }
~thread_priority()
{
OMNI_TRY_FW
OMNI_DTOR_FW
OMNI_CATCH_FW
OMNI_D5_FW("destroyed");
}
enum_t value() const
{
return this->m_val;
}
const std::string to_string() const
{
return to_string(this->m_val);
}
const std::wstring to_wstring() const
{
return to_wstring(this->m_val);
}
bool operator!=(const thread_priority& val) const
{
return !(*this == val);
}
bool operator!=(enum_t val) const
{
return (this->m_val != val);
}
thread_priority& operator=(const thread_priority& val)
{
if (this != &val) {
OMNI_ASSIGN_FW(val)
this->m_val = val.m_val;
}
return *this;
}
thread_priority& operator=(enum_t val)
{
this->m_val = val;
return *this;
}
thread_priority& operator=(int32_t val)
{
if (!thread_priority::is_valid(val)) {
OMNI_ERR_RET_FW("Invalid enumeration value specified.", omni::exceptions::invalid_enum(val));
} else {
this->m_val = static_cast<enum_t>(val);
}
return *this;
}
bool operator<(const thread_priority& val) const
{
return this->m_val < val.m_val;
}
bool operator<(enum_t val) const
{
return this->m_val < val;
}
bool operator<(int32_t val) const
{
return this->m_val < static_cast<enum_t>(val);
}
bool operator>(const thread_priority& val) const
{
return this->m_val > val.m_val;
}
bool operator>(enum_t val) const
{
return this->m_val > val;
}
bool operator>(int32_t val) const
{
return this->m_val > val;
}
bool operator==(const thread_priority& val) const
{
if (this == &val) { return true; }
return this->m_val == val.m_val
OMNI_EQUAL_FW(val);
}
bool operator==(enum_t val) const
{
return this->m_val == val;
}
bool operator==(int32_t val) const
{
return this->m_val == val;
}
operator enum_t() const
{
return this->m_val;
}
operator int32_t() const
{
return static_cast<int32_t>(this->m_val);
}
operator std::string() const
{
return this->to_string();
}
operator std::wstring() const
{
return this->to_wstring();
}
OMNI_MEMBERS_FW(omni::sync::thread_priority) // disposing,name,type(),hash()
OMNI_OSTREAM_FW(omni::sync::thread_priority)
OMNI_OSTREAM_FN_FW(enum_t)
private:
enum_t m_val;
template < typename S >
static enum_t _parse(const S& val)
{
enum_t ret;
if (_try_parse(val, ret)) { return ret; }
OMNI_ERR_FW("invalid enum parse", omni::exceptions::invalid_enum())
return DEFAULT_VALUE();
}
template < typename S >
static bool _try_parse(const S& str, enum_t& out)
{
return _try_parse(omni::string::util::to_upper(str), out);
}
template < typename S >
static bool _try_parse(const S& val, thread_priority& out)
{
enum_t tmp;
if (_try_parse(val, tmp)) {
out.m_val = tmp;
return true;
}
return false;
}
static bool _try_parse(const std::wstring& val, enum_t& out)
{
return _try_parse(omni::string::util::to_string(val), out);
}
static bool _try_parse(const std::string& val, enum_t& out)
{
if (!val.empty()) {
OMNI_S2E_FW(IDLE)
OMNI_S2E_FW(LOWEST)
OMNI_S2E_FW(BELOW_NORMAL)
OMNI_S2E_FW(NORMAL)
OMNI_S2E_FW(ABOVE_NORMAL)
OMNI_S2E_FW(HIGHEST)
OMNI_S2E_FW(REAL_TIME)
}
return false;
}
template < typename S >
static std::basic_string< typename S::char_type > _to_val(enum_t v)
{
S ss;
switch (v) {
OMNI_E2SS_FW(IDLE);
OMNI_E2SS_FW(LOWEST);
OMNI_E2SS_FW(BELOW_NORMAL);
OMNI_E2SS_FW(NORMAL);
OMNI_E2SS_FW(ABOVE_NORMAL);
OMNI_E2SS_FW(HIGHEST);
OMNI_E2SS_FW(REAL_TIME);
default: ss << "UNKNOWN"; break;
}
return ss.str();
}
static bool _valid(int32_t val)
{
return (val ==
IDLE ||
LOWEST ||
BELOW_NORMAL ||
NORMAL ||
ABOVE_NORMAL ||
HIGHEST ||
REAL_TIME
);
}
};
class thread_start_type {
public:
typedef enum enum_t {
USER = 0,
NOW = 1
} enum_t;
static inline unsigned short COUNT()
{
return 2;
}
static inline enum_t DEFAULT_VALUE()
{
return USER;
}
static std::string to_string(enum_t v)
{
return _to_val<std::stringstream>(v);
}
static std::wstring to_wstring(enum_t v)
{
return _to_val<std::wstringstream>(v);
}
static enum_t parse(const std::string& val)
{
return _parse(val);
}
static enum_t parse(const std::wstring& val)
{
return _parse(val);
}
static bool try_parse(const std::string& val, enum_t& out)
{
return _try_parse(val, out);
}
static bool try_parse(const std::wstring& val, enum_t& out)
{
return _try_parse(val, out);
}
static bool try_parse(const std::string& val, thread_start_type& out)
{
return _try_parse(val, out);
}
static bool try_parse(const std::wstring& val, thread_start_type& out)
{
return _try_parse(val, out);
}
static bool is_valid(int32_t val)
{
return _valid(val);
}
thread_start_type() :
OMNI_CTOR_FW(omni::sync::thread_start_type)
m_val(DEFAULT_VALUE())
{ }
thread_start_type(const thread_start_type& cp) :
OMNI_CPCTOR_FW(cp)
m_val(cp.m_val)
{ }
thread_start_type(enum_t val) :
OMNI_CTOR_FW(omni::sync::thread_start_type)
m_val(val)
{ }
~thread_start_type()
{
OMNI_TRY_FW
OMNI_DTOR_FW
OMNI_CATCH_FW
OMNI_D5_FW("destroyed");
}
enum_t value() const
{
return this->m_val;
}
const std::string to_string() const
{
return to_string(this->m_val);
}
const std::wstring to_wstring() const
{
return to_wstring(this->m_val);
}
bool operator!=(const thread_start_type& val) const
{
return !(*this == val);
}
bool operator!=(enum_t val) const
{
return (this->m_val != val);
}
thread_start_type& operator=(const thread_start_type& val)
{
if (this != &val) {
OMNI_ASSIGN_FW(val)
this->m_val = val.m_val;
}
return *this;
}
thread_start_type& operator=(enum_t val)
{
this->m_val = val;
return *this;
}
thread_start_type& operator=(int32_t val)
{
if (!thread_start_type::is_valid(val)) {
OMNI_ERR_RET_FW("Invalid enumeration value specified.", omni::exceptions::invalid_enum(val));
} else {
this->m_val = static_cast<enum_t>(val);
}
return *this;
}
bool operator<(const thread_start_type& val) const
{
return this->m_val < val.m_val;
}
bool operator<(enum_t val) const
{
return this->m_val < val;
}
bool operator<(int32_t val) const
{
return this->m_val < static_cast<enum_t>(val);
}
bool operator>(const thread_start_type& val) const
{
return this->m_val > val.m_val;
}
bool operator>(enum_t val) const
{
return this->m_val > val;
}
bool operator>(int32_t val) const
{
return this->m_val > val;
}
bool operator==(const thread_start_type& val) const
{
if (this == &val) { return true; }
return this->m_val == val.m_val
OMNI_EQUAL_FW(val);
}
bool operator==(enum_t val) const
{
return this->m_val == val;
}
bool operator==(int32_t val) const
{
return this->m_val == val;
}
operator enum_t() const
{
return this->m_val;
}
operator int32_t() const
{
return static_cast<int32_t>(this->m_val);
}
operator std::string() const
{
return this->to_string();
}
operator std::wstring() const
{
return this->to_wstring();
}
OMNI_MEMBERS_FW(omni::sync::thread_start_type) // disposing,name,type(),hash()
OMNI_OSTREAM_FW(omni::sync::thread_start_type)
OMNI_OSTREAM_FN_FW(enum_t)
private:
enum_t m_val;
template < typename S >
static enum_t _parse(const S& val)
{
enum_t ret;
if (_try_parse(val, ret)) { return ret; }
OMNI_ERR_FW("invalid enum parse", omni::exceptions::invalid_enum())
return DEFAULT_VALUE();
}
template < typename S >
static bool _try_parse(const S& str, enum_t& out)
{
return _try_parse(omni::string::util::to_upper(str), out);
}
template < typename S >
static bool _try_parse(const S& val, thread_start_type& out)
{
enum_t tmp;
if (_try_parse(val, tmp)) {
out.m_val = tmp;
return true;
}
return false;
}
static bool _try_parse(const std::wstring& val, enum_t& out)
{
return _try_parse(omni::string::util::to_string(val), out);
}
static bool _try_parse(const std::string& val, enum_t& out)
{
if (!val.empty()) {
OMNI_S2E_FW(USER)
OMNI_S2E_FW(NOW)
}
return false;
}
template < typename S >
static std::basic_string< typename S::char_type > _to_val(enum_t v)
{
S ss;
switch (v) {
OMNI_E2SS_FW(USER);
OMNI_E2SS_FW(NOW);
default: ss << "UNKNOWN"; break;
}
return ss.str();
}
static bool _valid(int32_t val)
{
return (val ==
USER ||
NOW
);
}
};
class thread_state {
public:
typedef enum enum_t {
UNSTARTED = 0,
START_REQUESTED = 1,
RUNNING = 2,
COMPLETED = 4,
STOP_REQUESTED = 8,
STOPPED = 16,
ABORT_REQUESTED = 32,
ABORTED = 64,
UNKNOWN = 255
} enum_t;
static inline unsigned short COUNT()
{
return 9;
}
static inline enum_t DEFAULT_VALUE()
{
return UNSTARTED;
}
static std::string to_string(enum_t v)
{
return _to_val<std::stringstream>(v);
}
static std::wstring to_wstring(enum_t v)
{
return _to_val<std::wstringstream>(v);
}
static enum_t parse(const std::string& val)
{
return _parse(val);
}
static enum_t parse(const std::wstring& val)
{
return _parse(val);
}
static bool try_parse(const std::string& val, enum_t& out)
{
return _try_parse(val, out);
}
static bool try_parse(const std::wstring& val, enum_t& out)
{
return _try_parse(val, out);
}
static bool try_parse(const std::string& val, thread_state& out)
{
return _try_parse(val, out);
}
static bool try_parse(const std::wstring& val, thread_state& out)
{
return _try_parse(val, out);
}
static bool is_valid(int32_t val)
{
return _valid(val);
}
thread_state() :
OMNI_CTOR_FW(omni::sync::thread_state)
m_val(DEFAULT_VALUE())
{ }
thread_state(const thread_state& cp) :
OMNI_CPCTOR_FW(cp)
m_val(cp.m_val)
{ }
thread_state(enum_t val) :
OMNI_CTOR_FW(omni::sync::thread_state)
m_val(val)
{ }
~thread_state()
{
OMNI_TRY_FW
OMNI_DTOR_FW
OMNI_CATCH_FW
OMNI_D5_FW("destroyed");
}
enum_t value() const
{
return this->m_val;
}
const std::string to_string() const
{
return to_string(this->m_val);
}
const std::wstring to_wstring() const
{
return to_wstring(this->m_val);
}
bool operator!=(const thread_state& val) const
{
return !(*this == val);
}
bool operator!=(enum_t val) const
{
return (this->m_val != val);
}
thread_state& operator=(const thread_state& val)
{
if (this != &val) {
OMNI_ASSIGN_FW(val)
this->m_val = val.m_val;
}
return *this;
}
thread_state& operator=(enum_t val)
{
this->m_val = val;
return *this;
}
thread_state& operator=(int32_t val)
{
if (!thread_state::is_valid(val)) {
OMNI_ERR_RET_FW("Invalid enumeration value specified.", omni::exceptions::invalid_enum(val));
} else {
this->m_val = static_cast<enum_t>(val);
}
return *this;
}
bool operator<(const thread_state& val) const
{
return this->m_val < val.m_val;
}
bool operator<(enum_t val) const
{
return this->m_val < val;
}
bool operator<(int32_t val) const
{
return this->m_val < static_cast<enum_t>(val);
}
bool operator>(const thread_state& val) const
{
return this->m_val > val.m_val;
}
bool operator>(enum_t val) const
{
return this->m_val > val;
}
bool operator>(int32_t val) const
{
return this->m_val > val;
}
bool operator==(const thread_state& val) const
{
if (this == &val) { return true; }
return this->m_val == val.m_val
OMNI_EQUAL_FW(val);
}
bool operator==(enum_t val) const
{
return this->m_val == val;
}
bool operator==(int32_t val) const
{
return this->m_val == val;
}
operator enum_t() const
{
return this->m_val;
}
operator int32_t() const
{
return static_cast<int32_t>(this->m_val);
}
operator std::string() const
{
return this->to_string();
}
operator std::wstring() const
{
return this->to_wstring();
}
OMNI_MEMBERS_FW(omni::sync::thread_state) // disposing,name,type(),hash()
OMNI_OSTREAM_FW(omni::sync::thread_state)
OMNI_OSTREAM_FN_FW(enum_t)
private:
enum_t m_val;
template < typename S >
static enum_t _parse(const S& val)
{
enum_t ret;
if (_try_parse(val, ret)) { return ret; }
OMNI_ERR_FW("invalid enum parse", omni::exceptions::invalid_enum())
return DEFAULT_VALUE();
}
template < typename S >
static bool _try_parse(const S& str, enum_t& out)
{
return _try_parse(omni::string::util::to_upper(str), out);
}
template < typename S >
static bool _try_parse(const S& val, thread_state& out)
{
enum_t tmp;
if (_try_parse(val, tmp)) {
out.m_val = tmp;
return true;
}
return false;
}
static bool _try_parse(const std::wstring& val, enum_t& out)
{
return _try_parse(omni::string::util::to_string(val), out);
}
static bool _try_parse(const std::string& val, enum_t& out)
{
if (!val.empty()) {
OMNI_S2E_FW(UNSTARTED)
OMNI_S2E_FW(START_REQUESTED)
OMNI_S2E_FW(RUNNING)
OMNI_S2E_FW(COMPLETED)
OMNI_S2E_FW(STOP_REQUESTED)
OMNI_S2E_FW(STOPPED)
OMNI_S2E_FW(ABORT_REQUESTED)
OMNI_S2E_FW(ABORTED)
OMNI_S2E_FW(UNKNOWN)
}
return false;
}
template < typename S >
static std::basic_string< typename S::char_type > _to_val(enum_t v)
{
S ss;
switch (v) {
OMNI_E2SS_FW(UNSTARTED);
OMNI_E2SS_FW(START_REQUESTED);
OMNI_E2SS_FW(RUNNING);
OMNI_E2SS_FW(COMPLETED);
OMNI_E2SS_FW(STOP_REQUESTED);
OMNI_E2SS_FW(STOPPED);
OMNI_E2SS_FW(ABORT_REQUESTED);
OMNI_E2SS_FW(ABORTED);
OMNI_E2SS_FW(UNKNOWN);
default: ss << "UNKNOWN"; break;
}
return ss.str();
}
static bool _valid(int32_t val)
{
return (val ==
UNSTARTED ||
START_REQUESTED ||
RUNNING ||
COMPLETED ||
STOP_REQUESTED ||
STOPPED ||
ABORT_REQUESTED ||
ABORTED ||
UNKNOWN
);
}
};
class thread_option {
public:
typedef enum enum_t {
NONE = 0,
ALLOW_THREAD_REUSE = 1,
AUTO_JOIN = 2,
DETACH_ON_DESTROY = 4, // default
ABORT_ON_DESTROY = 8,
KILL_ON_DESTROY = 16,
DETACH_ON_ASSIGN = 32, // default
ABORT_ON_ASSIGN = 64,
KILL_ON_ASSIGN = 128,
STACK_SIZE = 256,
AUTO_JOIN_TIMEOUT = 512
} enum_t;
static inline unsigned short COUNT()
{
return 11;
}
static inline enum_t DEFAULT_VALUE()
{
return NONE;
}
static std::string to_string(enum_t v)
{
return _to_val<std::stringstream>(v);
}
static std::wstring to_wstring(enum_t v)
{
return _to_val<std::wstringstream>(v);
}
static enum_t parse(const std::string& val)
{
return _parse(val);
}
static enum_t parse(const std::wstring& val)
{
return _parse(val);
}
static bool try_parse(const std::string& val, enum_t& out)
{
return _try_parse(val, out);
}
static bool try_parse(const std::wstring& val, enum_t& out)
{
return _try_parse(val, out);
}
static bool try_parse(const std::string& val, thread_option& out)
{
return _try_parse(val, out);
}
static bool try_parse(const std::wstring& val, thread_option& out)
{
return _try_parse(val, out);
}
static bool is_valid(int32_t val)
{
return _valid(val);
}
thread_option() :
OMNI_CTOR_FW(omni::sync::thread_option)
m_val(DEFAULT_VALUE())
{ }
thread_option(const thread_option& cp) :
OMNI_CPCTOR_FW(cp)
m_val(cp.m_val)
{ }
thread_option(enum_t val) :
OMNI_CTOR_FW(omni::sync::thread_option)
m_val(val)
{ }
~thread_option()
{
OMNI_TRY_FW
OMNI_DTOR_FW
OMNI_CATCH_FW
OMNI_D5_FW("destroyed");
}
enum_t value() const
{
return this->m_val;
}
const std::string to_string() const
{
return to_string(this->m_val);
}
const std::wstring to_wstring() const
{
return to_wstring(this->m_val);
}
bool operator!=(const thread_option& val) const
{
return !(*this == val);
}
bool operator!=(enum_t val) const
{
return (this->m_val != val);
}
thread_option& operator=(const thread_option& val)
{
if (this != &val) {
OMNI_ASSIGN_FW(val)
this->m_val = val.m_val;
}
return *this;
}
thread_option& operator=(enum_t val)
{
this->m_val = val;
return *this;
}
thread_option& operator=(int32_t val)
{
if (!thread_option::is_valid(val)) {
OMNI_ERR_RET_FW("Invalid enumeration value specified.", omni::exceptions::invalid_enum(val));
} else {
this->m_val = static_cast<enum_t>(val);
}
return *this;
}
bool operator<(const thread_option& val) const
{
return this->m_val < val.m_val;
}
bool operator<(enum_t val) const
{
return this->m_val < val;
}
bool operator<(int32_t val) const
{
return this->m_val < static_cast<enum_t>(val);
}
bool operator>(const thread_option& val) const
{
return this->m_val > val.m_val;
}
bool operator>(enum_t val) const
{
return this->m_val > val;
}
bool operator>(int32_t val) const
{
return this->m_val > val;
}
bool operator==(const thread_option& val) const
{
if (this == &val) { return true; }
return this->m_val == val.m_val
OMNI_EQUAL_FW(val);
}
bool operator==(enum_t val) const
{
return this->m_val == val;
}
bool operator==(int32_t val) const
{
return this->m_val == val;
}
operator enum_t() const
{
return this->m_val;
}
operator int32_t() const
{
return static_cast<int32_t>(this->m_val);
}
operator std::string() const
{
return this->to_string();
}
operator std::wstring() const
{
return this->to_wstring();
}
OMNI_MEMBERS_FW(omni::sync::thread_option) // disposing,name,type(),hash()
OMNI_OSTREAM_FW(omni::sync::thread_option)
OMNI_OSTREAM_FN_FW(enum_t)
private:
enum_t m_val;
template < typename S >
static enum_t _parse(const S& val)
{
enum_t ret;
if (_try_parse(val, ret)) { return ret; }
OMNI_ERR_FW("invalid enum parse", omni::exceptions::invalid_enum())
return DEFAULT_VALUE();
}
template < typename S >
static bool _try_parse(const S& str, enum_t& out)
{
return _try_parse(omni::string::util::to_upper(str), out);
}
template < typename S >
static bool _try_parse(const S& val, thread_option& out)
{
enum_t tmp;
if (_try_parse(val, tmp)) {
out.m_val = tmp;
return true;
}
return false;
}
static bool _try_parse(const std::wstring& val, enum_t& out)
{
return _try_parse(omni::string::util::to_string(val), out);
}
static bool _try_parse(const std::string& val, enum_t& out)
{
if (!val.empty()) {
OMNI_S2E_FW(NONE)
OMNI_S2E_FW(ALLOW_THREAD_REUSE)
OMNI_S2E_FW(AUTO_JOIN)
OMNI_S2E_FW(DETACH_ON_DESTROY)
OMNI_S2E_FW(ABORT_ON_DESTROY)
OMNI_S2E_FW(KILL_ON_DESTROY)
OMNI_S2E_FW(DETACH_ON_ASSIGN)
OMNI_S2E_FW(ABORT_ON_ASSIGN)
OMNI_S2E_FW(KILL_ON_ASSIGN)
OMNI_S2E_FW(STACK_SIZE)
OMNI_S2E_FW(AUTO_JOIN_TIMEOUT)
}
return false;
}
template < typename S >
static std::basic_string< typename S::char_type > _to_val(enum_t v)
{
S ss;
switch (v) {
OMNI_E2SS_FW(NONE);
OMNI_E2SS_FW(ALLOW_THREAD_REUSE);
OMNI_E2SS_FW(AUTO_JOIN);
OMNI_E2SS_FW(DETACH_ON_DESTROY);
OMNI_E2SS_FW(ABORT_ON_DESTROY);
OMNI_E2SS_FW(KILL_ON_DESTROY);
OMNI_E2SS_FW(DETACH_ON_ASSIGN);
OMNI_E2SS_FW(ABORT_ON_ASSIGN);
OMNI_E2SS_FW(KILL_ON_ASSIGN);
OMNI_E2SS_FW(STACK_SIZE);
OMNI_E2SS_FW(AUTO_JOIN_TIMEOUT);
default: ss << "UNKNOWN"; break;
}
return ss.str();
}
static bool _valid(int32_t val)
{
return (val ==
NONE ||
ALLOW_THREAD_REUSE ||
AUTO_JOIN ||
DETACH_ON_DESTROY ||
ABORT_ON_DESTROY ||
KILL_ON_DESTROY ||
DETACH_ON_ASSIGN ||
ABORT_ON_ASSIGN ||
KILL_ON_ASSIGN ||
STACK_SIZE ||
AUTO_JOIN_TIMEOUT
);
}
};
class thread_flags {
public:
thread_flags() : m_stack(0), m_timeout(0), m_flags(0) { }
thread_flags(const omni::sync::thread_flags &cp) :
m_stack(cp.m_stack),
m_timeout(cp.m_timeout),
m_flags(cp.m_flags)
{ }
thread_flags(std::size_t stack) :
m_stack(stack),
m_timeout(0),
m_flags(0)
{ }
thread_flags(std::size_t stack, std::size_t timeout) :
m_stack(stack),
m_timeout(timeout),
m_flags(0)
{ }
thread_flags(std::size_t stack, std::size_t timeout, unsigned char flags) :
m_stack(stack),
m_timeout(timeout),
m_flags(flags)
{ }
thread_flags(std::size_t stack, std::size_t timeout, omni::sync::thread_option::enum_t flag) :
m_stack(stack),
m_timeout(timeout),
m_flags(0)
{
this->set_flag(flag, true);
}
bool allow_reuse() const
{
return OMNI_VAL_HAS_FLAG_BIT(this->m_flags, omni::sync::thread_option::ALLOW_THREAD_REUSE);
}
bool auto_join() const
{
return OMNI_VAL_HAS_FLAG_BIT(this->m_flags, omni::sync::thread_option::AUTO_JOIN);
}
std::size_t auto_join_timeout() const
{
return this->m_timeout;
}
bool abort_on_assign() const
{
return OMNI_VAL_HAS_FLAG_BIT(this->m_flags, omni::sync::thread_option::ABORT_ON_ASSIGN);
}
bool abort_on_destroy() const
{
return OMNI_VAL_HAS_FLAG_BIT(this->m_flags, omni::sync::thread_option::ABORT_ON_DESTROY);
}
bool detach_on_destroy() const
{
return OMNI_VAL_HAS_FLAG_BIT(this->m_flags, omni::sync::thread_option::DETACH_ON_DESTROY);
}
bool detach_on_assign() const
{
return OMNI_VAL_HAS_FLAG_BIT(this->m_flags, omni::sync::thread_option::DETACH_ON_ASSIGN);
}
bool kill_on_destroy() const
{
return OMNI_VAL_HAS_FLAG_BIT(this->m_flags, omni::sync::thread_option::KILL_ON_DESTROY);
}
bool kill_on_assign() const
{
return OMNI_VAL_HAS_FLAG_BIT(this->m_flags, omni::sync::thread_option::KILL_ON_ASSIGN);
}
void set_flag(omni::sync::thread_option::enum_t flag, bool val)
{
switch (flag) {
case omni::sync::thread_option::ALLOW_THREAD_REUSE:
OMNI_VAL_SET_FLAG_BOOL_T(unsigned char, this->m_flags, omni::sync::thread_option::ALLOW_THREAD_REUSE, val);
break;
case omni::sync::thread_option::AUTO_JOIN:
OMNI_VAL_SET_FLAG_BOOL_T(unsigned char, this->m_flags, omni::sync::thread_option::AUTO_JOIN, val);
break;
case omni::sync::thread_option::DETACH_ON_DESTROY:
OMNI_VAL_SET_FLAG_BOOL_T(unsigned char, this->m_flags, omni::sync::thread_option::DETACH_ON_DESTROY, val);
break;
case omni::sync::thread_option::ABORT_ON_DESTROY:
OMNI_VAL_SET_FLAG_BOOL_T(unsigned char, this->m_flags, omni::sync::thread_option::ABORT_ON_DESTROY, val);
break;
case omni::sync::thread_option::KILL_ON_DESTROY:
OMNI_VAL_SET_FLAG_BOOL_T(unsigned char, this->m_flags, omni::sync::thread_option::KILL_ON_DESTROY, val);
break;
case omni::sync::thread_option::DETACH_ON_ASSIGN:
OMNI_VAL_SET_FLAG_BOOL_T(unsigned char, this->m_flags, omni::sync::thread_option::DETACH_ON_ASSIGN, val);
break;
case omni::sync::thread_option::ABORT_ON_ASSIGN:
OMNI_VAL_SET_FLAG_BOOL_T(unsigned char, this->m_flags, omni::sync::thread_option::ABORT_ON_ASSIGN, val);
break;
case omni::sync::thread_option::KILL_ON_ASSIGN:
OMNI_VAL_SET_FLAG_BOOL_T(unsigned char, this->m_flags, omni::sync::thread_option::KILL_ON_ASSIGN, val);
break;
case omni::sync::thread_option::STACK_SIZE:
case omni::sync::thread_option::AUTO_JOIN_TIMEOUT:
case omni::sync::thread_option::NONE:
default:
OMNI_ERRV_FW("invalid option: ", flag, omni::exceptions::invalid_thread_option(static_cast<std::size_t>(flag)))
break;
}
}
std::size_t stack_size() const
{
return this->m_stack;
}
void set_auto_join_timeout(std::size_t timeout)
{
this->m_timeout = timeout;
}
void set_stack_size(std::size_t stack)
{
this->m_stack = stack;
}
bool operator==(const omni::sync::thread_flags& o) const
{
return
(this->m_stack == o.m_stack &&
this->m_timeout == o.m_timeout &&
this->m_flags == o.m_flags);
}
omni::sync::thread_flags& operator=(const omni::sync::thread_flags& o)
{
if (this != &o) {
this->m_stack = o.m_stack;
this->m_timeout = o.m_timeout;
this->m_flags = o.m_flags;
}
return *this;
}
private:
// DEV_NOTE: since the thread union has a std::size_t type, the flags are also size_t
std::size_t m_stack;
std::size_t m_timeout;
std::size_t m_flags;
};
typedef union thread_option_union {
std::size_t s_val;
bool b_val;
thread_option_union(int32_t val) : s_val(static_cast<std::size_t>(val)) {}
thread_option_union(long val) : s_val(static_cast<std::size_t>(val)) {}
thread_option_union(std::size_t val) : s_val(val) {}
thread_option_union(bool val) : b_val(val) {}
} thread_option_union;
// Types
const uint32_t INFINITE_TIMEOUT = OMNI_INFINITE_TIMEOUT;
typedef OMNI_THREAD_ARGS_T thread_arg_t;
typedef OMNI_THREAD_T thread_t;
typedef OMNI_THREAD_HANDLE_T thread_handle_t;
typedef OMNI_THREAD_FNPTR_T thread_fnptr_t;
typedef OMNI_THREAD_RET_T thread_ret_t;
typedef omni::sync::thread_option_union thread_union_t;
typedef omni::delegate<void> thread_start;
typedef omni::delegate1<void, omni::sync::thread_arg_t> parameterized_thread_start;
#if defined(OMNI_THROW)
extern omni::action unhandled_thread_exception;
extern omni::event1<void, const omni::exception&> user_thread_exception;
#endif
inline omni::sync::thread_handle_t thread_handle()
{
#if defined(OMNI_OS_WIN)
#if defined(OMNI_WIN_API)
return ::GetCurrentThread();
#else
return reinterpret_cast<omni::sync::thread_handle_t>(::GetCurrentThread());
#endif
#else
return ::pthread_self();
#endif
}
inline omni::sync::thread_t thread_id()
{
#if defined(OMNI_OS_WIN)
return ::GetCurrentThreadId();
#else
return ::pthread_self();
#endif
}
inline bool join_thread(omni::sync::thread_handle_t handle, unsigned long timeout)
{
if (handle == 0) {
OMNI_ERR_RETV_FW(OMNI_INVALID_THREAD_HANDLE_STR, omni::exceptions::invalid_thread_handle(), false)
}
if (handle == omni::sync::thread_handle()) {
OMNI_ERR_RETV_FW(OMNI_INVALID_THREAD_OWNER, omni::exceptions::invalid_thread_owner(), false)
}
#if defined(OMNI_OS_WIN)
return (::WaitForSingleObject(OMNI_WIN_TOHNDL_FW(handle), timeout) == 0) ? true :
#if !defined(OMNI_DBG_L1)
false
#else
!(OMNI_DBGEV_FW("error while waiting for thread handle: ", OMNI_GLE_PRNT))
#endif
;
#else
/* There is not a portable mechanism with pthreads to wait on a specific thread without
implementing a timed_wait condition variable. We don't want the user to have to implement
a seperate variable based on system, so we implement a 'timeout' loop*/
if (timeout != omni::sync::INFINITE_TIMEOUT) {
#if !defined(OMNI_CHRONO_AUTO_INIT_TICK)
omni::chrono::monotonic::initialize();
#endif
omni::chrono::tick_t ts = omni::chrono::monotonic_tick();
OMNI_SLEEP_INIT();
volatile bool iav = true;
//iav = (::pthread_kill(handle, 0) != ESRCH); // == "alive"
while ((iav = (::pthread_kill(handle, 0) != ESRCH)) && (omni::chrono::elapsed_ms(ts) < timeout)) {
OMNI_SLEEP1();
}
return (::pthread_kill(handle, 0) == ESRCH); // == "dead"
}
return (
(::pthread_join(handle, NULL) == 0) ? true :
#if !defined(OMNI_DBG_L1)
false
#else
!(OMNI_DBGEV_FW("error while waiting for thread handle: ", OMNI_GLE_PRNT))
#endif
);
#endif
}
inline bool join_thread(omni::sync::thread_handle_t handle)
{
return omni::sync::join_thread(handle, omni::sync::INFINITE_TIMEOUT);
}
template < void (*fnptr)() >
static omni::sync::thread_start bind()
{
return omni::sync::thread_start::bind<fnptr>();
}
template < class T, void (T::*fnptr)() >
static omni::sync::thread_start bind(T& obj)
{
return omni::sync::thread_start::bind<T, fnptr>(obj);
}
template < class T, void (T::*fnptr)() >
static omni::sync::thread_start bind(const T& obj)
{
return omni::sync::thread_start::bind<T, fnptr>(obj);
}
template < class T, void (T::*fnptr)() >
static omni::sync::thread_start bind(const T *const obj)
{
return omni::sync::thread_start::bind<T, fnptr>(obj);
}
template < class T, void (T::*fnptr)() const >
static omni::sync::thread_start bind_const(const T& obj)
{
return omni::sync::thread_start::bind<T, fnptr>(obj);
}
template < class T, void (T::*fnptr)() const >
static omni::sync::thread_start bind_const(const T *const obj)
{
return omni::sync::thread_start::bind<T, fnptr>(obj);
}
template < void (*fnptr)(omni::sync::thread_arg_t) >
static omni::sync::parameterized_thread_start bind_param()
{
return omni::sync::parameterized_thread_start::bind<fnptr>();
}
template < class T, void (T::*fnptr)(omni::sync::thread_arg_t) >
static omni::sync::parameterized_thread_start bind_param(T& obj)
{
return omni::sync::parameterized_thread_start::bind<T, fnptr>(obj);
}
template < class T, void (T::*fnptr)(omni::sync::thread_arg_t) >
static omni::sync::parameterized_thread_start bind_param(const T& obj)
{
return omni::sync::parameterized_thread_start::bind<T, fnptr>(obj);
}
template < class T, void (T::*fnptr)(omni::sync::thread_arg_t) >
static omni::sync::parameterized_thread_start bind_param(const T *const obj)
{
return omni::sync::parameterized_thread_start::bind<T, fnptr>(obj);
}
template < class T, void (T::*fnptr)(omni::sync::thread_arg_t) const >
static omni::sync::parameterized_thread_start bind_param_const(const T& obj)
{
return omni::sync::parameterized_thread_start::bind<T, fnptr>(obj);
}
template < class T, void (T::*fnptr)(omni::sync::thread_arg_t) const >
static omni::sync::parameterized_thread_start bind_param_const(const T *const obj)
{
return omni::sync::parameterized_thread_start::bind<T, fnptr>(obj);
}
}
}
#endif // OMNI_THREAD_T_HPP