Merge "MidiDevice: fix connectPorts for same Process" into nyc-dev

This commit is contained in:
Phil Burk
2016-04-06 03:51:45 +00:00
committed by Android (Google) Code Review
3 changed files with 15 additions and 5 deletions

View File

@@ -28,7 +28,8 @@ interface IMidiDeviceServer
void closeDevice(); void closeDevice();
// connects the input port pfd to the specified output port // connects the input port pfd to the specified output port
void connectPorts(IBinder token, in ParcelFileDescriptor pfd, int outputPortNumber); // Returns the PID of the called process.
int connectPorts(IBinder token, in ParcelFileDescriptor pfd, int outputPortNumber);
MidiDeviceInfo getDeviceInfo(); MidiDeviceInfo getDeviceInfo();
void setDeviceInfo(in MidiDeviceInfo deviceInfo); void setDeviceInfo(in MidiDeviceInfo deviceInfo);

View File

@@ -19,6 +19,7 @@ package android.media.midi;
import android.os.Binder; import android.os.Binder;
import android.os.IBinder; import android.os.IBinder;
import android.os.ParcelFileDescriptor; import android.os.ParcelFileDescriptor;
import android.os.Process;
import android.os.RemoteException; import android.os.RemoteException;
import android.util.Log; import android.util.Log;
@@ -181,9 +182,16 @@ public final class MidiDevice implements Closeable {
} }
try { try {
IBinder token = new Binder(); IBinder token = new Binder();
mDeviceServer.connectPorts(token, pfd, outputPortNumber); int calleePid = mDeviceServer.connectPorts(token, pfd, outputPortNumber);
// close our copy of the file descriptor // If the service is a different Process then it will duplicate the pfd
IoUtils.closeQuietly(pfd); // and we can safely close this one.
// But if the service is in the same Process then closing the pfd will
// kill the connection. So don't do that.
if (calleePid != Process.myPid()) {
// close our copy of the file descriptor
IoUtils.closeQuietly(pfd);
}
return new MidiConnection(token, inputPort); return new MidiConnection(token, inputPort);
} catch (RemoteException e) { } catch (RemoteException e) {
Log.e(TAG, "RemoteException in connectPorts"); Log.e(TAG, "RemoteException in connectPorts");

View File

@@ -254,7 +254,7 @@ public final class MidiDeviceServer implements Closeable {
} }
@Override @Override
public void connectPorts(IBinder token, ParcelFileDescriptor pfd, public int connectPorts(IBinder token, ParcelFileDescriptor pfd,
int outputPortNumber) { int outputPortNumber) {
MidiInputPort inputPort = new MidiInputPort(pfd, outputPortNumber); MidiInputPort inputPort = new MidiInputPort(pfd, outputPortNumber);
MidiDispatcher dispatcher = mOutputPortDispatchers[outputPortNumber]; MidiDispatcher dispatcher = mOutputPortDispatchers[outputPortNumber];
@@ -270,6 +270,7 @@ public final class MidiDeviceServer implements Closeable {
synchronized (mPortClients) { synchronized (mPortClients) {
mPortClients.put(token, client); mPortClients.put(token, client);
} }
return Process.myPid(); // for caller to detect same process ID
} }
@Override @Override