linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* fcntl file locking and pthreads
@ 2003-05-04  6:13 Mikhail Kruk
  2003-05-04 12:58 ` Jamie Lokier
  2003-05-04 21:29 ` Mark Mielke
  0 siblings, 2 replies; 12+ messages in thread
From: Mikhail Kruk @ 2003-05-04  6:13 UTC (permalink / raw)
  To: linux-kernel

Hi,
on 2.4 kernels fcntl-based file locking does not work with 
clone-based threads as expected (by me): two threads of the same process 
can acquire exclusive lock on a file at the same time.
flock()-based locks work as expected, i.e. only one thread can have an 
exclusive lock at a time.
What would it take to make fcntl work as flock?

Please cc me, I'm not subscribed.
Thanks


^ permalink raw reply	[flat|nested] 12+ messages in thread
* Re: fcntl file locking and pthreads
@ 2003-05-04 21:56 Ville Voutilainen
  2003-05-04 22:04 ` Mikhail Kruk
  0 siblings, 1 reply; 12+ messages in thread
From: Ville Voutilainen @ 2003-05-04 21:56 UTC (permalink / raw)
  To: linux-kernel; +Cc: meshko

>flock()-based locks work as expected, i.e. only one thread can have an
>exclusive lock at a time.
>What would it take to make fcntl work as flock?

This is because flock locks the inode, not the file descriptor.
fcntl locks the file descriptor. This is why flock does not
work over nfs, I suppose. If you share descriptors, you also
share locks and positions (at least according to the man pages
of fcntl, dup et al). I don't know what exactly is supposed
to happen if you open the file twice in two separate threads
and then lock with fcntl in the first thread. But simply doing

open()
pthread_create()
fcntl()
			(other thread)
			fcntl()
will probably result in both threads acquiring the lock
successfully. It would be reasonable IMHO to assume that
a sequence like

open()
pthread_create()
fcntl()

			(other thread)
			open()
			fnctl() /* lock the newly opened fd */

would give you what you're after. The only problem being that
even user space manuals suggest that fcntl can only detect
that other *processes* hold a file lock. Given the muddy
nature of what is a thread/process in Linux, this requires
someone more familiar with the clone stuff to clarify.

Another issue altogether is why you are trying to sync two
threads with file locks, but I digress.

-VJV-

^ permalink raw reply	[flat|nested] 12+ messages in thread
* Re: fcntl file locking and pthreads
@ 2003-05-04 22:29 Ville Voutilainen
  0 siblings, 0 replies; 12+ messages in thread
From: Ville Voutilainen @ 2003-05-04 22:29 UTC (permalink / raw)
  To: meshko; +Cc: linux-kernel

> actually what I have is:
> thread 0:
> pthread_create() (1)
> pthread_create() (2)
> thread 1:
> open()
> fcntl()
> thread 2:
> open()
> fcntl()
> and they all succeed. Even though the file descriptors are different. 

Which shows us that fcntl cannot detect a file lock held by
the current process, no matter how many times we open the same
file in order to get different file descriptors. Bloody POSIX,
might I say. :) I wonder if POSIX even says anything non-vague
wrt. to this. As in, if Linux would enable detecting
two locks on two different fds (pointing to the same file)
within one process, would Linux violate POSIX? Moreover, is
this simply so that kernel detects the situation just fine,
but the info is not carried to user space because good ole
fcntl behaviour doesn't really take threads into account?
In the marvellous scheme of things (user app -> glibc -> kernel
and back), at what point (if any) is it possible to detect
multiple locks within one process? And can it be done so that
fcntl can still be claimed to be even remotely compatible
with anything on the planet?

> You digress, but I feel like I have to justify myself now :)
> Those threads used to be processes and now want be threads with minimal 
> modifications. The files that are locked are still used by other processes 
> too.

Then, logically (I suppose you already know this, but..) you
need both the file locks and mutexes to sync with both other
threads and other processes. There, one more example of how
going multi-threaded sometimes adds (mostly locking) code.

I'll shut up now, we are only at the borderline of kernel-land
and if we aim for portability, we are probably solely and
firmly on the user-land side of the big picture.

-VJV-

^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2003-05-04 22:17 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2003-05-04  6:13 fcntl file locking and pthreads Mikhail Kruk
2003-05-04 12:58 ` Jamie Lokier
2003-05-04 13:25   ` Mikhail Kruk
2003-05-04 15:24     ` Miquel van Smoorenburg
2003-05-04 18:40     ` David Schwartz
2003-05-04 19:29       ` Mikhail Kruk
2003-05-04 20:55         ` David Schwartz
2003-05-04 21:50           ` Mikhail Kruk
2003-05-04 21:29 ` Mark Mielke
2003-05-04 21:56 Ville Voutilainen
2003-05-04 22:04 ` Mikhail Kruk
2003-05-04 22:29 Ville Voutilainen

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).