X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=src%2Fstdio%2Ffclose.c;h=d687a8779b64f2d46b8790165c695b9612d3cc0a;hb=11ddc314b57196519316103b02acffe10299dad3;hp=8fdc3f7d2b667d125e4aa7bc115d53f68e852331;hpb=617182734ca0beffa347747019d78b972e2038f9;p=musl diff --git a/src/stdio/fclose.c b/src/stdio/fclose.c index 8fdc3f7d..d687a877 100644 --- a/src/stdio/fclose.c +++ b/src/stdio/fclose.c @@ -1,16 +1,24 @@ #include "stdio_impl.h" +#include "libc.h" + +static void dummy(FILE *f) { } +weak_alias(dummy, __unlist_locked_file); int fclose(FILE *f) { int r; - int perm = f->flags & F_PERM; + int perm; + + FLOCK(f); + + __unlist_locked_file(f); - if (!perm) { - OFLLOCK(); + if (!(perm = f->flags & F_PERM)) { + FILE **head = __ofl_lock(); if (f->prev) f->prev->next = f->next; if (f->next) f->next->prev = f->prev; - if (libc.ofl_head == f) libc.ofl_head = f->next; - OFLUNLOCK(); + if (*head == f) *head = f->next; + __ofl_unlock(); } r = fflush(f); @@ -18,6 +26,7 @@ int fclose(FILE *f) if (f->getln_buf) free(f->getln_buf); if (!perm) free(f); - + else FUNLOCK(f); + return r; }