mirror of
https://github.com/ziglang/zig.git
synced 2025-02-09 06:00:40 +00:00
linux uses pthreads when linking against libc
This commit is contained in:
parent
abf90eaa67
commit
bf8e419d2b
@ -1486,7 +1486,6 @@ struct CodeGen {
|
||||
|
||||
ZigList<LinkLib *> link_libs_list;
|
||||
LinkLib *libc_link_lib;
|
||||
LinkLib *pthread_link_lib;
|
||||
|
||||
// add -framework [name] args to linker
|
||||
ZigList<Buf *> darwin_frameworks;
|
||||
|
@ -6049,15 +6049,10 @@ LinkLib *create_link_lib(Buf *name) {
|
||||
|
||||
LinkLib *add_link_lib(CodeGen *g, Buf *name) {
|
||||
bool is_libc = buf_eql_str(name, "c");
|
||||
bool is_pthread = buf_eql_str(name, "pthread");
|
||||
|
||||
if (is_libc && g->libc_link_lib != nullptr)
|
||||
return g->libc_link_lib;
|
||||
|
||||
if (is_pthread && g->pthread_link_lib != nullptr) {
|
||||
return g->pthread_link_lib;
|
||||
}
|
||||
|
||||
for (size_t i = 0; i < g->link_libs_list.length; i += 1) {
|
||||
LinkLib *existing_lib = g->link_libs_list.at(i);
|
||||
if (buf_eql_buf(existing_lib->name, name)) {
|
||||
@ -6071,9 +6066,6 @@ LinkLib *add_link_lib(CodeGen *g, Buf *name) {
|
||||
if (is_libc)
|
||||
g->libc_link_lib = link_lib;
|
||||
|
||||
if (is_pthread)
|
||||
g->pthread_link_lib = link_lib;
|
||||
|
||||
return link_lib;
|
||||
}
|
||||
|
||||
|
@ -145,7 +145,6 @@ CodeGen *codegen_create(Buf *root_src_path, const ZigTarget *target, OutType out
|
||||
{
|
||||
g->libc_link_lib = create_link_lib(buf_create_from_str("c"));
|
||||
g->link_libs_list.append(g->libc_link_lib);
|
||||
g->pthread_link_lib = create_link_lib(buf_create_from_str("pthread"));
|
||||
}
|
||||
|
||||
return g;
|
||||
@ -6374,7 +6373,6 @@ static void define_builtin_compile_vars(CodeGen *g) {
|
||||
buf_appendf(contents, "pub const object_format = ObjectFormat.%s;\n", cur_obj_fmt);
|
||||
buf_appendf(contents, "pub const mode = %s;\n", build_mode_to_str(g->build_mode));
|
||||
buf_appendf(contents, "pub const link_libc = %s;\n", bool_to_str(g->libc_link_lib != nullptr));
|
||||
buf_appendf(contents, "pub const link_pthread = %s;\n", bool_to_str(g->pthread_link_lib != nullptr));
|
||||
buf_appendf(contents, "pub const have_error_return_tracing = %s;\n", bool_to_str(g->have_err_ret_tracing));
|
||||
|
||||
buf_appendf(contents, "pub const __zig_test_fn_slice = {}; // overwritten later\n");
|
||||
|
@ -54,12 +54,12 @@ pub extern "c" fn realloc(&c_void, usize) ?&c_void;
|
||||
pub extern "c" fn free(&c_void) void;
|
||||
pub extern "c" fn posix_memalign(memptr: &&c_void, alignment: usize, size: usize) c_int;
|
||||
|
||||
pub extern "c" fn pthread_create(noalias newthread: &pthread_t,
|
||||
pub extern "pthread" fn pthread_create(noalias newthread: &pthread_t,
|
||||
noalias attr: ?&const pthread_attr_t, start_routine: extern fn(?&c_void) ?&c_void,
|
||||
noalias arg: ?&c_void) c_int;
|
||||
pub extern "c" fn pthread_attr_init(attr: &pthread_attr_t) c_int;
|
||||
pub extern "c" fn pthread_attr_setstack(attr: &pthread_attr_t, stackaddr: &c_void, stacksize: usize) c_int;
|
||||
pub extern "c" fn pthread_attr_destroy(attr: &pthread_attr_t) c_int;
|
||||
pub extern "c" fn pthread_join(thread: pthread_t, arg_return: ?&?&c_void) c_int;
|
||||
pub extern "pthread" fn pthread_attr_init(attr: &pthread_attr_t) c_int;
|
||||
pub extern "pthread" fn pthread_attr_setstack(attr: &pthread_attr_t, stackaddr: &c_void, stacksize: usize) c_int;
|
||||
pub extern "pthread" fn pthread_attr_destroy(attr: &pthread_attr_t) c_int;
|
||||
pub extern "pthread" fn pthread_join(thread: pthread_t, arg_return: ?&?&c_void) c_int;
|
||||
|
||||
pub const pthread_t = &@OpaqueType();
|
||||
|
@ -2352,11 +2352,12 @@ pub const Thread = struct {
|
||||
stack: []u8,
|
||||
pthread_handle: pthread_t,
|
||||
|
||||
const pthread_t = if (builtin.link_pthread) c.pthread_t else void;
|
||||
const pid_t = if (!builtin.link_pthread) i32 else void;
|
||||
pub const use_pthreads = is_posix and builtin.link_libc;
|
||||
const pthread_t = if (use_pthreads) c.pthread_t else void;
|
||||
const pid_t = if (!use_pthreads) i32 else void;
|
||||
|
||||
pub fn wait(self: &const Thread) void {
|
||||
if (builtin.link_pthread) {
|
||||
if (use_pthreads) {
|
||||
const err = c.pthread_join(self.pthread_handle, null);
|
||||
switch (err) {
|
||||
0 => {},
|
||||
@ -2475,7 +2476,7 @@ pub fn spawnThread(stack: []align(os.page_size) u8, context: var, comptime start
|
||||
if (builtin.os == builtin.Os.windows) {
|
||||
// use windows API directly
|
||||
@compileError("TODO support spawnThread for Windows");
|
||||
} else if (builtin.link_pthread) {
|
||||
} else if (Thread.use_pthreads) {
|
||||
// use pthreads
|
||||
var attr: c.pthread_attr_t = undefined;
|
||||
if (c.pthread_attr_init(&attr) != 0) return SpawnThreadError.SystemResources;
|
||||
|
Loading…
Reference in New Issue
Block a user