[Linux-cluster] Re: Simple dlm demo program, and a bug...
Daniel Phillips
phillips at redhat.com
Wed Oct 13 15:59:21 UTC 2004
On Wednesday 13 October 2004 11:50, Patrick Caulfield wrote:
> On Wed, Oct 13, 2004 at 11:40:07AM -0400, Daniel Phillips wrote:
> > On Wednesday 13 October 2004 11:10, you wrote:
> > > > struct dlm_lksb *lksb;
> > >
> > > This should point to something.
> >
> > Thanks Patrick, just a little too bleary-eyed to see that right
> > away... OK, here is the little libdlm demo that grabs and releases
> > a lock, without the benefit of the dumbed-down pthreads interface,
> > including forking off a thread to run the dispatch function. This
> > should make things a little easier for the next innocent victim to
> > head into this part of the woods.
>
> I think I'll put it in the doc directory I think, it might stand more
> chance of being found. But then given how out-of-date the doc file
> was...maybe not!
Except my error macro was considerably less than exemplary (i.e.,
doesn't work). Fixed below, and a title added.
> > I'd like to encourage you to divide up libdlm as you suggested,
> > there's no way of getting rid of libpthread otherwise, not to
> > mention that real men only write reentrant code ;-)
>
> Yes. I'll add it to my TODO list, it shouldn't really take too long.
#include <stdlib.h>
#include <unistd.h>
#include <stdint.h>
#include <errno.h>
#include <string.h>
#include <stdio.h>
#include <signal.h>
#include <libdlm.h>
/*
* Simple libdlm locking demo
*
* Daniel Phillips, phillips at redhat.com
*
* (c) 2004, Redhat Software Inc.
*/
#define error(string, args...) do { printf(string, ##args); exit(1); } while (0)
void my_ast(void *arg)
{
printf("ast got arg %p\n", arg);
}
int main(void)
{
int fd, child;
struct dlm_lksb lksb;
if ((fd = dlm_get_fd()) < 0)
error("dlm error %i, %s\n", errno, strerror(errno));
switch (child = fork()) {
case -1:
error("fork error %i, %s\n", errno, strerror(errno));
case 0:
while (1)
dlm_dispatch(fd);
}
if (dlm_lock(LKM_PWMODE, &lksb, LKF_NOQUEUE, "foo", 3,
0, my_ast, (void *)&fd, NULL, NULL) < 0)
error("dlm error %i, %s\n", errno, strerror(errno));
sleep(1);
if (dlm_unlock(lksb.sb_lkid, 0, &lksb, NULL) < 0)
error("dlm error %i, %s\n", errno, strerror(errno));
sleep(1);
kill(child, SIGTERM);
return 0;
}
More information about the Linux-cluster
mailing list