sound: rawmidi: record a substream's owner process
authorClemens Ladisch <clemens@ladisch.de>
Tue, 10 Nov 2009 09:14:04 +0000 (10:14 +0100)
committerTakashi Iwai <tiwai@suse.de>
Tue, 10 Nov 2009 15:32:38 +0000 (16:32 +0100)
Record the pid of the task that opened a RawMIDI substream.

Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
include/sound/rawmidi.h
sound/core/rawmidi.c

index c23c265..2480e7d 100644 (file)
@@ -46,6 +46,7 @@
 struct snd_rawmidi;
 struct snd_rawmidi_substream;
 struct snd_seq_port_info;
+struct pid;
 
 struct snd_rawmidi_ops {
        int (*open) (struct snd_rawmidi_substream * substream);
@@ -97,6 +98,7 @@ struct snd_rawmidi_substream {
        struct snd_rawmidi_str *pstr;
        char name[32];
        struct snd_rawmidi_runtime *runtime;
+       struct pid *pid;
        /* hardware layer */
        struct snd_rawmidi_ops *ops;
 };
index 818b129..2f76612 100644 (file)
@@ -278,6 +278,7 @@ static int open_substream(struct snd_rawmidi *rmidi,
                substream->active_sensing = 0;
                if (mode & SNDRV_RAWMIDI_LFLG_APPEND)
                        substream->append = 1;
+               substream->pid = get_pid(task_pid(current));
                rmidi->streams[substream->stream].substream_opened++;
        }
        substream->use_count++;
@@ -488,6 +489,8 @@ static void close_substream(struct snd_rawmidi *rmidi,
        snd_rawmidi_runtime_free(substream);
        substream->opened = 0;
        substream->append = 0;
+       put_pid(substream->pid);
+       substream->pid = NULL;
        rmidi->streams[substream->stream].substream_opened--;
 }
 
@@ -1336,6 +1339,9 @@ static void snd_rawmidi_proc_info_read(struct snd_info_entry *entry,
                                    substream->number,
                                    (unsigned long) substream->bytes);
                        if (substream->opened) {
+                               snd_iprintf(buffer,
+                                   "  Owner PID    : %d\n",
+                                   pid_vnr(substream->pid));
                                runtime = substream->runtime;
                                snd_iprintf(buffer,
                                    "  Mode         : %s\n"
@@ -1357,6 +1363,9 @@ static void snd_rawmidi_proc_info_read(struct snd_info_entry *entry,
                                    substream->number,
                                    (unsigned long) substream->bytes);
                        if (substream->opened) {
+                               snd_iprintf(buffer,
+                                           "  Owner PID    : %d\n",
+                                           pid_vnr(substream->pid));
                                runtime = substream->runtime;
                                snd_iprintf(buffer,
                                            "  Buffer size  : %lu\n"