> Date: Fri, 31 May 2013 16:58:21 +0200 > Cc: [email protected], [email protected], [email protected] > From: Frank Heckenbach <[email protected]> > > > > void write (int fd, void *data, size_t size) > > > { > > > if (getflags (fd) & O_APPEND) > > > { > > > lock_mutex (get_mutex (fd)); > > > off_t pos = get_size (fd); > > > do_write (fd, pos, data, size); > > > set_pos (fd, pos + size); > > > unlock_mutex (get_mutex (fd)); > > > } > > > else > > > { > > > // no mutex here! > > > off_t pos = get_pos (fd); > > > do_write (fd, pos, data, size); > > > set_pos (fd, pos + size); > > > } > > > } > > > > If the 'else' clause uses a single file pointer system-wise, there's > > no overwriting because the pointer is not moved between writes. > > I still can't follow you. Just imagine this function is run by two > different processes simultaneously with the same FD without > O_APPEND. Both fetch the current position (get_pos) and get the same > value. Then both write (do_write) at this same position, overwriting > each other. Finally, both update the file pointer (set_pos), but > again, only the 2nd one becomes effective.
There's no reason for them to call get_pos. do_write moves the pointer as a side effect. _______________________________________________ Bug-make mailing list [email protected] https://lists.gnu.org/mailman/listinfo/bug-make
