Giter Club home page Giter Club logo

c11threads's Issues

gcc timespec_get build error

Description: gcc build error "c11threads.h:LINE: error: static declaration of 'timespec_get' follows non-static declaration
static inline int timespec_get(struct timespec *ts, int base)"
Possible cause: #7 PTHREAD_MUTEX_TIMED_NP is not available outside of Linux
Specs: gcc version 5.4.0, on Ubuntu 16.04.2 LTS
STDC_VERSION = 201112L

More info:
At the beginning of c11threads.h PTHREAD_MUTEX_TIMED_NP is checked, and if not found timespec_get will be defined at the bottom of the header. pthread.h declares the timespec_get function, and defines PTHREAD_MUTEX_TIMED_NP as an enum value, and not a macro.

Test failure on FreeBSD

Hello.

This is actually about C11 threads on FreeBSD 13.2, using native C11 threads. What I mean is building the test but including real "threads.h" instead of "c11threads.h" and linking with "-lstdthreads", instead of "-lthr" (which is "-lpthread" on FreeBSD systems).

I'd expect the test to function identically. It does on (at least) AIX and Linux/glibc and Linux/musl.

The problem is on FreeBSD, using the real system C11 threads library, results in the following failure:

test.c:249: thrd_sleep(&dur, ((void *)0)): error 0, expected thrd_success

It all works as expected using the test with c11threads.h.

CI

Would be nice to see some CI here, one good option might be https://travis-ci.org - really easy to integrate, especially for project like this.

Windows threads support

Would be really nice to see win threads support here! I might do it because I'm quite desperate looking for C-only cross-platform threading lib.

error: weak declaration of 'thrd_exit' must be public

When building grep 3.8 I see this issue. (I've saved c11threads.h to /usr/local/include/threads.h on a i686 glibc 2.23 system.)

In file included from ./glthread/lock.h:87,
                 from glthread/lock.c:22:
/usr/local/include/threads.h:69:20: error: weak declaration of 'thrd_exit' must be public
   69 | static inline void thrd_exit(int res)
      |                    ^~~~~~~~~
make[3]: *** [Makefile:3661: glthread/libgreputils_a-lock.o] Error 1

warning: cast to pointer from integer

When compiling on MinGW I get these warnings:

c11threads.h: In function 'thrd_exit':
c11threads.h:70:15: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
   70 |  pthread_exit((void*)(long)res);
      |               ^
c11threads.h: In function 'thrd_join':
c11threads.h:81:15: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
   81 |   *res = (int)(long)retval;
      |               ^

That's because long is 32 bit on this platform. The ideal solution would be to replace it with intptr_t but it is only (optionally) available since c99.
Maybe using long long when __MINGW64__ is defined will do.

Duplicated declaration of timespec_get() on MacOSX

Got this error:

c11threads.h:262:19: error: static declaration of 'timespec_get' follows non-static declaration
static inline int timespec_get(struct timespec *ts, int base)
                  ^
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX11.0.sdk/usr/include/time.h:199:5: note: previous declaration is here
int timespec_get(struct timespec *ts, int base);

Temporarily worked around it by changing:

#if __STDC_VERSION__ < 201112L || defined(C11THREADS_NO_TIMED_MUTEX)
/* TODO take base into account */
static inline int timespec_get(struct timespec *ts, int base)

to

#if __STDC_VERSION__ < 201112L
/* TODO take base into account */
static inline int timespec_get(struct timespec *ts, int base)

Didn't really dig to see what the "proper" fix is, but I suspect timespec_get() was added in a new version of the MacOSX SDK?

Trap deadlocks

In mtx_lock(), I think you should trap the dead-lock with an assert:

if(res == EDEADLK) {
    assert(false);  // Dead-locks are undefined behaviour
    return thrd_busy;
}

According to the C11 standard, a dead-lock is undefined behaviour. However, with POSIX threads, the behaviour is well defined. What we want to avoid is client code silently discarding dead-locks, by calling mtx_lock(), without paying attention to the return value, which turns into a no-op. Instead code should crash, at least in debug compiles, so programmers can see that they are relying on a deadlock (which is undefined).

What do you think ?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.