Hi!

On 21:41 Tue 27 Sep     , Venkatram Tummala wrote:
> On Tue, Sep 27, 2011 at 9:19 PM, rohan puri <[email protected]> wrote:
...
> > in device_open() ->
> >
> > if(var)
> >       return -EBUSY
> > var++
> >
> > &
> >
> > in device_release() ->
> >
> > var--
> >
> >
> > I think this should do the job.
> >
> This will prevent other processes to open the file until a process releases
> it. This is not what i need. Only the threads in a process shouldn't be able
> to open the file if it is already opened in the process. Other processes
> should be able to open it.

You could create something like this:

DEFINE_MUTEX(pidlist_lock);
LIST_HEAD(pidlist);

struct pidlist_node{
        struct list_head lh;
        pid_t pid;
}

static struct pidlist_node *get_pin(void)
{
        struct list_head *curr = pidlist.next;
        while (curr != pidlist) {
                struct struct pidlist_node *pin = container_of(curr, struct 
pidlist_node, lh);
                if (pin->pid == current->pid) {
                        return pin;
                }
        }
        return 0;
}

int open(void)
{
        struct pidlist_node *pin;

        mutex_lock(&pidlist_lock);

        pin = get_pin();
        if (pin != 0) {
                mutex_unlock(&pidlist_lock);
                return -EBUSY;
        }

        pin = kmalloc(sizeof(struct pidlist_node), GFP_KERNEL);
        if (pin == 0) {
                mutex_unlock(&pidlist_lock);
                return -ENOMEM;
        }

        pin->pid = current->pid;
        list_add(&(pin->lh), &pidlist);

        mutex_unlock(&pidlist_lock);
}

int close(void)
{
        struct pidlist_node *pin;

        mutex_lock(&pidlist_lock);

        pin = get_pin();
        if (pin != 0) {
                list_del(&(pin->lh));
                kfree(pin);
        }

        mutex_unlock(&pidlist_lock);
}

        -Michi
-- 
programing a layer 3+4 network protocol for mesh networks
see http://michaelblizek.twilightparadox.com


_______________________________________________
Kernelnewbies mailing list
[email protected]
http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies

Reply via email to