35 std::cerr <<
"faudes_invalid(): " << msg << std:endl;
44 static std::string faudes_pathsep_str =
"/";
45 return faudes_pathsep_str;
53 static std::string faudes_pathseps_str =
"/\\:";
54 return faudes_pathseps_str;
57 static std::string faudes_pathsep_str =
"";
58 if(faudes_pathsep_str==
"")
60 return faudes_pathsep_str;
65 static std::string faudes_pathsep_str =
"/";
66 return faudes_pathsep_str;
85 for(pos=0; pos<res.size(); ++pos) {
97 std::string res=rPath;
101 for(pos=0; pos<res.size(); ++pos) {
118#include <linux/limits.h>
126 char buf[(PATH_MAX)+1];
127 char* wd =getcwd(buf,PATH_MAX);
128 if(wd==
nullptr)
return res;
133 return (chdir(nwd.c_str())==0 ? 0 : -1);
141 DWORD ret = GetCurrentDirectory(MAX_PATH, buf);
142 if((ret == 0) || (ret>MAX_PATH))
return res;
148 if(nwd.size()+1>MAX_PATH)
150 strncpy(buf,nwd.c_str(),MAX_PATH-1);
151 if(!SetCurrentDirectory(buf))
171 signal(SIGTERM, sighandler);
174 signal(SIGINT, sighandler);
177 signal(SIGQUIT, sighandler);
180 signal(SIGHUP, sighandler);
183 signal(SIGABRT, sighandler);
190 return strsignal(sig);
218#if defined(FAUDES_POSIX)
219void faudes_gettimeofday(faudes_systime_t* now) {
221 gettimeofday(&nowval,0);
222 now->tv_sec=nowval.tv_sec;
223 now->tv_nsec=nowval.tv_usec * 1000;
227#if defined(FAUDES_WINDOWS)
228void faudes_gettimeofday(faudes_systime_t* now) {
230 nowval= timeGetTime();
231 now->tv_sec=nowval / 1000;
232 now->tv_nsec=(nowval % 1000) *1000000;
239void faudes_diffsystime(
const faudes_systime_t& end,
const faudes_systime_t& begin, faudes_systime_t* res) {
240 res->tv_sec = end.tv_sec-begin.tv_sec;
241 res->tv_nsec = end.tv_nsec-begin.tv_nsec;
242 if(res->tv_nsec <= 0){
244 res->tv_nsec += 1000000000;
249void faudes_diffsystime(
const faudes_systime_t& end,
const faudes_systime_t& begin, faudes_mstime_t* res) {
250 *res = 1000*( end.tv_sec-begin.tv_sec);
251 *res += (end.tv_nsec-begin.tv_nsec) / 1000000;
255void faudes_sumsystime(
const faudes_systime_t& begin,
const faudes_systime_t& duration, faudes_systime_t* res) {
256 res->tv_sec = begin.tv_sec + duration.tv_sec;
257 res->tv_nsec = begin.tv_nsec + duration.tv_nsec;
258 if(res->tv_nsec >= 1000000000) {
260 res->tv_nsec-=1000000000;
266 faudes_systime_t now;
267 faudes_gettimeofday(&now);
268 faudes_systime_t delta;
269 delta.tv_sec = msecs/1000;
270 delta.tv_nsec = (msecs % 1000) *1000000;
276 faudes_systime_t now;
277 faudes_gettimeofday(&now);
278 faudes_systime_t delta;
279 delta.tv_sec = usecs/1000000;
280 delta.tv_nsec = (usecs % 1000000) * 1000;
291int faudes_closesocket(
int fd) {
294int faudes_setsockopt(
int fd,
int level,
int optname,
const void *optval, socklen_t optlen) {
295 return setsockopt(fd,level,optname,optval,optlen);
297int faudes_getsockopt(
int fd,
int level,
int optname,
void *optval, socklen_t *optlen) {
298 return getsockopt(fd,level,optname,optval,optlen);
300int faudes_getsocket_error(
int fd) {
302 socklen_t len =
sizeof(opt);
303 int res = getsockopt(fd, SOL_SOCKET, SO_ERROR, &opt, &len) < 0 ? -1 : 0;
307int faudes_setsocket_nonblocking(
int fd,
bool noblo) {
308 int sopt=fcntl(fd, F_GETFL, NULL);
309 if(sopt<0)
return -1;
311 int rc=fcntl(fd, F_SETFL, sopt|O_NONBLOCK);
312 return rc < 0 ? -1 : 0;
314 int rc=fcntl(fd, F_SETFL, sopt& (~O_NONBLOCK));
315 return rc < 0 ? -1 : 0;
320typedef int socklen_t;
321int faudes_closesocket(
int fd) {
322 return closesocket(fd);
324int faudes_setsockopt(
int fd,
int level,
int optname,
const void *optval, socklen_t optlen) {
325 return setsockopt(fd,level,optname,(
char*) optval,optlen);
327int faudes_getsockopt(
int fd,
int level,
int optname,
void *optval, socklen_t *optlen) {
328 return getsockopt(fd,level,optname,(
char*) optval,optlen);
330int faudes_getsocket_error(
int fd) {
332 socklen_t len =
sizeof(opt);
333 int res = getsockopt(fd, SOL_SOCKET, SO_ERROR, (
char*) &opt, &len) < 0 ? -1 : 0;
337int faudes_setsocket_nonblocking(
int fd,
bool noblo) {
338 unsigned long onoff=0;
340 return ioctlsocket(fd, FIONBIO, &onoff) == SOCKET_ERROR ? -1 : 0;
344#error option network not available on generic platform
355typedef pthread_t faudes_thread_t;
357int faudes_thread_create(faudes_thread_t *thr,
void *(*fnct)(
void *),
void *arg){
360 pthread_attr_init(&attr);
361 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
363 int ret = pthread_create(thr, &attr, fnct, arg);
365 pthread_attr_destroy(&attr);
366 return ret == 0 ? FAUDES_THREAD_SUCCESS : FAUDES_THREAD_ERROR;
368faudes_thread_t faudes_thread_current(
void) {
369 return pthread_self();
371int faudes_thread_detach(faudes_thread_t thr) {
372 return pthread_detach(thr)==0 ? FAUDES_THREAD_SUCCESS : FAUDES_THREAD_ERROR;
374int faudes_thread_equal(faudes_thread_t thr0, faudes_thread_t thr1) {
375 return pthread_equal(thr0, thr1);
377void faudes_thread_exit(
void* res) {
380int faudes_thread_join(faudes_thread_t thr,
void **res) {
381 return pthread_join(thr, res) == 0 ? FAUDES_THREAD_ERROR : FAUDES_THREAD_SUCCESS;
391DWORD faudes_thread_tlsidx=TLS_OUT_OF_INDEXES;
394static unsigned WINAPI faudes_thread_wrapper(
void *argfth) {
396 faudes_thread_t fthread = (faudes_thread_t) argfth;
398 TlsSetValue(faudes_thread_tlsidx,fthread);
400 void *(*fnct)(
void*) = fthread->mFnct;
401 void *arg = fthread->mArg;
403 void* res = fnct(arg);
405 faudes_thread_exit(res);
411int faudes_thread_create(faudes_thread_t *thr,
void *(*fnct)(
void *),
void *arg){
413 if(faudes_thread_tlsidx==TLS_OUT_OF_INDEXES)
414 faudes_thread_tlsidx=TlsAlloc();
415 if(faudes_thread_tlsidx==TLS_OUT_OF_INDEXES)
416 return FAUDES_THREAD_ERROR;
418 *thr = (faudes_thread_t) malloc(
sizeof(faudes_thread_record_t));
419 if(!*thr)
return FAUDES_THREAD_ERROR;
421 (*thr)->mFnct = fnct;
425 (*thr)->mHandle = (HANDLE) _beginthreadex(NULL, 0, faudes_thread_wrapper, (
void*) (*thr), 0, NULL);
427 return (*thr)->mHandle ? FAUDES_THREAD_SUCCESS : FAUDES_THREAD_ERROR;
431faudes_thread_t faudes_thread_current(
void) {
433 faudes_thread_t fthread = (faudes_thread_t) TlsGetValue(faudes_thread_tlsidx);
439int faudes_thread_detach(faudes_thread_t thr) {
440 CloseHandle(thr->mHandle);
443 return FAUDES_THREAD_SUCCESS;
447int faudes_thread_equal(faudes_thread_t thr0, faudes_thread_t thr1) {
449 if( (thr0==NULL) && (thr1=NULL) )
return true;
450 if( (thr0==NULL) || (thr1=NULL) )
return false;
452 return thr0->mHandle == thr1->mHandle;
456void faudes_thread_exit(
void *res) {
458 faudes_thread_t fthread = (faudes_thread_t) TlsGetValue(faudes_thread_tlsidx);
459 if(fthread) fthread->mRes=res;
465int faudes_thread_join(faudes_thread_t thr,
void **res) {
469 DWORD rc = WaitForSingleObject(thr->mHandle, INFINITE);
471 if( (rc!=WAIT_FAILED) && (res)) *res = thr->mRes;
475 if(rc == WAIT_FAILED)
return FAUDES_THREAD_ERROR;
476 return FAUDES_THREAD_SUCCESS;
487int faudes_mutex_init(faudes_mutex_t* mtx){
488 return pthread_mutex_init(mtx, NULL)==0 ? FAUDES_THREAD_SUCCESS : FAUDES_THREAD_ERROR;
490void faudes_mutex_destroy(faudes_mutex_t* mtx){
491 pthread_mutex_destroy(mtx);
493int faudes_mutex_lock(faudes_mutex_t *mtx) {
494 return pthread_mutex_lock(mtx) == 0 ? FAUDES_THREAD_SUCCESS : FAUDES_THREAD_ERROR;
496int faudes_mutex_trylock(faudes_mutex_t *mtx){
497 return (pthread_mutex_trylock(mtx) == 0) ? FAUDES_THREAD_SUCCESS : FAUDES_THREAD_ERROR;
499int faudes_mutex_unlock(faudes_mutex_t *mtx){
500 return pthread_mutex_unlock(mtx) == 0 ? FAUDES_THREAD_SUCCESS : FAUDES_THREAD_ERROR;
508int faudes_mutex_init(faudes_mutex_t *mtx){
509 InitializeCriticalSection(mtx);
510 return FAUDES_THREAD_SUCCESS;
512void faudes_mutex_destroy(faudes_mutex_t *mtx){
513 DeleteCriticalSection(mtx);
515int faudes_mutex_lock(faudes_mutex_t *mtx) {
516 EnterCriticalSection(mtx);
517 return FAUDES_THREAD_SUCCESS;
519int faudes_mutex_trylock(faudes_mutex_t *mtx){
520 return TryEnterCriticalSection(mtx) ? FAUDES_THREAD_SUCCESS : FAUDES_THREAD_ERROR;
522int faudes_mutex_unlock(faudes_mutex_t *mtx){
523 LeaveCriticalSection(mtx);
524 return FAUDES_THREAD_SUCCESS;
533int faudes_cond_init(faudes_cond_t* cond) {
534 return pthread_cond_init(cond, NULL) == 0 ? FAUDES_THREAD_SUCCESS : FAUDES_THREAD_ERROR;
536void faudes_cond_destroy(faudes_cond_t* cond) {
537 pthread_cond_destroy(cond);
539int faudes_cond_signal(faudes_cond_t *cond){
540 return pthread_cond_signal(cond) == 0 ? FAUDES_THREAD_SUCCESS : FAUDES_THREAD_ERROR;
542int faudes_cond_broadcast(faudes_cond_t *cond) {
543 return pthread_cond_signal(cond) == 0 ? FAUDES_THREAD_SUCCESS : FAUDES_THREAD_ERROR;
545int faudes_cond_wait(faudes_cond_t *cond, faudes_mutex_t *mtx) {
546 return pthread_cond_wait(cond, mtx) == 0 ? FAUDES_THREAD_SUCCESS : FAUDES_THREAD_ERROR;
548int faudes_cond_timedwait(faudes_cond_t *cond, faudes_mutex_t *mtx,
const faudes_systime_t *abstime) {
549 int ret = pthread_cond_timedwait(cond, mtx, abstime);
550 if(ret == ETIMEDOUT)
return FAUDES_THREAD_TIMEOUT;
551 return ret == 0 ? FAUDES_THREAD_SUCCESS : FAUDES_THREAD_ERROR;
554int faudes_cond_reltimedwait(faudes_cond_t *cond, faudes_mutex_t *mtx, faudes_mstime_t duration) {
555 faudes_systime_t abstime;
557 return faudes_cond_timedwait(cond,mtx,&abstime);
572#define EVENT_SIGNAL 0
573#define EVENT_BROADCAST 1
576int faudes_cond_init(faudes_cond_t* cond) {
578 cond->mWaitersCount = 0;
579 InitializeCriticalSection(&cond->mWaitersCountMutex);
581 cond->mEvents[EVENT_SIGNAL]=CreateEvent(NULL, FALSE, FALSE, NULL);
583 cond->mEvents[EVENT_BROADCAST] = CreateEvent(NULL, TRUE, FALSE, NULL);
585 if(cond->mEvents[EVENT_SIGNAL] != NULL)
586 if(cond->mEvents[EVENT_BROADCAST] != NULL)
587 return FAUDES_THREAD_SUCCESS;
589 if(cond->mEvents[EVENT_SIGNAL] != NULL)
590 CloseHandle(cond->mEvents[EVENT_SIGNAL]);
591 if(cond->mEvents[EVENT_BROADCAST] != NULL)
592 CloseHandle(cond->mEvents[EVENT_BROADCAST]);
593 cond->mEvents[EVENT_BROADCAST] = NULL;
594 cond->mEvents[EVENT_SIGNAL]=NULL;
595 return FAUDES_THREAD_ERROR;
599void faudes_cond_destroy(faudes_cond_t* cond) {
600 if(cond->mEvents[EVENT_SIGNAL] != NULL)
601 CloseHandle(cond->mEvents[EVENT_SIGNAL]);
602 if(cond->mEvents[EVENT_BROADCAST] != NULL)
603 CloseHandle(cond->mEvents[EVENT_BROADCAST]);
604 DeleteCriticalSection(&cond->mWaitersCountMutex);
608int faudes_cond_signal(faudes_cond_t *cond){
611 EnterCriticalSection(&cond->mWaitersCountMutex);
612 waiters = (cond->mWaitersCount > 0);
613 LeaveCriticalSection(&cond->mWaitersCountMutex);
616 if(SetEvent(cond->mEvents[EVENT_SIGNAL]) == 0)
617 return FAUDES_THREAD_ERROR;
619 return FAUDES_THREAD_SUCCESS;
623int faudes_cond_broadcast(faudes_cond_t *cond) {
626 EnterCriticalSection(&cond->mWaitersCountMutex);
627 waiters = (cond->mWaitersCount > 0);
628 LeaveCriticalSection(&cond->mWaitersCountMutex);
631 if(SetEvent(cond->mEvents[EVENT_BROADCAST]) == 0)
632 return FAUDES_THREAD_ERROR;
634 return FAUDES_THREAD_SUCCESS;
638int faudes_cond_reltimedwait(faudes_cond_t *cond, faudes_mutex_t *mtx, faudes_mstime_t duration) {
640 EnterCriticalSection(&cond->mWaitersCountMutex);
641 ++ cond->mWaitersCount;
642 LeaveCriticalSection(&cond->mWaitersCountMutex);
644 LeaveCriticalSection(mtx);
646 int res = WaitForMultipleObjects(2, cond->mEvents, FALSE, (DWORD) duration);
648 EnterCriticalSection(&cond->mWaitersCountMutex);
650 -- cond->mWaitersCount;
653 (res == (WAIT_OBJECT_0 + EVENT_BROADCAST)) &&
654 (cond->mWaitersCount == 0);
655 LeaveCriticalSection(&cond->mWaitersCountMutex);
657 if(last) ResetEvent(cond->mEvents[EVENT_BROADCAST]);
659 EnterCriticalSection(mtx);
661 if(res == (
int) WAIT_TIMEOUT)
662 return FAUDES_THREAD_TIMEOUT;
663 if(res == (
int) WAIT_FAILED)
664 return FAUDES_THREAD_ERROR;
665 return FAUDES_THREAD_SUCCESS;
669int faudes_cond_wait(faudes_cond_t *cond, faudes_mutex_t *mtx) {
670 return faudes_cond_reltimedwait(cond, mtx, INFINITE);
674int faudes_cond_timedwait(faudes_cond_t *cond, faudes_mutex_t *mtx,
const faudes_systime_t *abstime) {
676 faudes_systime_t now;
677 faudes_gettimeofday(&now);
679 DWORD rels = abstime->tv_sec - now.tv_sec;
681 if(rels > (4294967295u/1000)-1) rels = 4294967295u/1000-1;
683 DWORD relms = rels*1000 + (abstime->tv_nsec - now.tv_nsec + 500000) / 1000000;
685 return faudes_cond_reltimedwait(cond, mtx, relms);