git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@3208 0c269be4-1314-0410-8aa9-9f06e86f4224tags/1.9.1
| @@ -40,12 +40,12 @@ rpc_type server_rpc_jack_client_check(mach_port_t private_port, client_name_t na | |||
| return KERN_SUCCESS; | |||
| } | |||
| rpc_type server_rpc_jack_client_open(mach_port_t server_port, client_name_t name, int pid, mach_port_t* private_port, int* shared_engine, int* shared_client, int* shared_graph, int* result) | |||
| rpc_type server_rpc_jack_client_open(mach_port_t server_port, client_name_t name, int pid, mach_port_t callback_port, mach_port_t* private_port, int* shared_engine, int* shared_client, int* shared_graph, int* result) | |||
| { | |||
| jack_log("rpc_jack_client_opne name = %s", name); | |||
| jack_log("rpc_jack_client_open name = %s %d", name, callback_port); | |||
| JackMachServerChannel* channel = JackMachServerChannel::fPortTable[server_port]; | |||
| assert(channel); | |||
| channel->ClientOpen((char*)name, pid, private_port, shared_engine, shared_client, shared_graph, result); | |||
| channel->ClientOpen((char*)name, pid, callback_port, private_port, shared_engine, shared_client, shared_graph, result); | |||
| return KERN_SUCCESS; | |||
| } | |||
| @@ -138,7 +138,7 @@ void JackMachClientChannel::ClientCheck(const char* name, char* name_res, int pr | |||
| void JackMachClientChannel::ClientOpen(const char* name, int pid, int* shared_engine, int* shared_client, int* shared_graph, int* result) | |||
| { | |||
| kern_return_t res = rpc_jack_client_open(fServerPort.GetPort(), (char*)name, pid, &fPrivatePort, shared_engine, shared_client, shared_graph, result); | |||
| kern_return_t res = rpc_jack_client_open(fServerPort.GetPort(), (char*)name, pid, fClientPort.GetPort(), &fPrivatePort, shared_engine, shared_client, shared_graph, result); | |||
| if (res != KERN_SUCCESS) { | |||
| *result = -1; | |||
| jack_error("JackMachClientChannel::ClientOpen err = %s", mach_error_string(res)); | |||
| @@ -317,6 +317,21 @@ bool JackMachClientChannel::Init() | |||
| return client->Init(); | |||
| } | |||
| boolean_t JackMachClientChannel::MessageHandler(mach_msg_header_t* Request, mach_msg_header_t* Reply) | |||
| { | |||
| printf("JackMachClientChannel::MessageHandler %d\n", Request->msgh_id); | |||
| if (Request->msgh_id == MACH_NOTIFY_NO_SENDERS) { | |||
| jack_error("JackMachClientChannel::MessageHandler fails..."); | |||
| //JackClient* client = gClientTable[fClientPort.GetPort()]; | |||
| //client->ShutDown(); | |||
| return false; | |||
| } else { | |||
| JackRPCClient_server(Request, Reply); | |||
| } | |||
| return true; | |||
| } | |||
| /* | |||
| bool JackMachClientChannel::Execute() | |||
| { | |||
| kern_return_t res; | |||
| @@ -329,6 +344,20 @@ bool JackMachClientChannel::Execute() | |||
| return true; | |||
| } | |||
| } | |||
| */ | |||
| bool JackMachClientChannel::Execute() | |||
| { | |||
| kern_return_t res; | |||
| if ((res = mach_msg_server(MessageHandler, 1024, fClientPort.GetPort(), 0)) != KERN_SUCCESS) { | |||
| jack_error("JackMachClientChannel::Execute err = %s", mach_error_string(res)); | |||
| //JackClient* client = gClientTable[fClientPort.GetPort()]; | |||
| //client->ShutDown(); | |||
| return false; | |||
| } else { | |||
| return true; | |||
| } | |||
| } | |||
| } // end of namespace | |||
| @@ -41,6 +41,8 @@ class JackMachClientChannel : public detail::JackClientChannelInterface, public | |||
| JackMachPort fServerPort; /*! Mach port to communicate with the server : from client to server */ | |||
| mach_port_t fPrivatePort; | |||
| JackThread fThread; /*! Thread to execute the event loop */ | |||
| static boolean_t MessageHandler(mach_msg_header_t* Request, mach_msg_header_t* Reply); | |||
| public: | |||
| @@ -26,6 +26,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||
| namespace Jack | |||
| { | |||
| mach_port_t gCallback_port; | |||
| // Server side : server to client | |||
| int JackMachNotifyChannel::Open(const char* name) | |||
| @@ -34,14 +36,20 @@ int JackMachNotifyChannel::Open(const char* name) | |||
| char buf[256]; | |||
| snprintf(buf, sizeof(buf) - 1, "%s:%s", jack_client_entry, name); | |||
| printf("gCallback_port %d\n", gCallback_port); | |||
| fClientPort.SetPort(gCallback_port); | |||
| // Connect to client notification port using client name | |||
| /* | |||
| if (!fClientPort.ConnectPort(buf)) { | |||
| jack_error("Cannot connect client port"); | |||
| return -1; | |||
| } else { | |||
| return 0; | |||
| } | |||
| */ | |||
| } | |||
| void JackMachNotifyChannel::Close() | |||
| @@ -30,6 +30,8 @@ namespace Jack | |||
| \brief JackNotifyChannel using Mach IPC. | |||
| */ | |||
| extern mach_port_t gCallback_port; | |||
| class JackMachNotifyChannel | |||
| { | |||
| @@ -29,6 +29,7 @@ bool JackMachPort::AllocatePort(const char* name, int queue) | |||
| { | |||
| mach_port_t task = mach_task_self(); | |||
| kern_return_t res; | |||
| mach_port_t old_port; | |||
| if ((res = task_get_bootstrap_port(task, &fBootPort)) != KERN_SUCCESS) { | |||
| jack_error("AllocatePort: Can't find bootstrap mach port err = %s", mach_error_string(res)); | |||
| @@ -39,16 +40,44 @@ bool JackMachPort::AllocatePort(const char* name, int queue) | |||
| jack_error("AllocatePort: can't allocate mach port err = %s", mach_error_string(res)); | |||
| return false; | |||
| } | |||
| if ((res = mach_port_insert_right(task, fServerPort, fServerPort, MACH_MSG_TYPE_MAKE_SEND)) != KERN_SUCCESS) { | |||
| jack_error("AllocatePort: error inserting mach rights err = %s", mach_error_string(res)); | |||
| return false; | |||
| } | |||
| if ((res = mach_port_request_notification(task, fServerPort, MACH_NOTIFY_NO_SENDERS, | |||
| 1, fServerPort, MACH_MSG_TYPE_MAKE_SEND_ONCE, &old_port)) != KERN_SUCCESS) { | |||
| jack_error("AddPort: error in mach_port_request_notification err = %s", mach_error_string(res)); | |||
| return false; | |||
| } | |||
| /* | |||
| if ((res = mach_port_request_notification(task, fServerPort, MACH_NOTIFY_PORT_DESTROYED, | |||
| 0, fServerPort, MACH_MSG_TYPE_MAKE_SEND_ONCE, &old_port)) != KERN_SUCCESS) { | |||
| jack_error("AddPort: error in mach_port_request_notification MACH_NOTIFY_PORT_DESTROYED err = %s", mach_error_string(res)); | |||
| return false; | |||
| } | |||
| */ | |||
| /* | |||
| if ((res = mach_port_request_notification(task, fServerPort, MACH_NOTIFY_DEAD_NAME, | |||
| 1, fServerPort, MACH_MSG_TYPE_MAKE_SEND_ONCE, &old_port)) != KERN_SUCCESS) { | |||
| jack_error("AddPort: error in mach_port_request_notification MACH_NOTIFY_DEAD_NAME err = %s", mach_error_string(res)); | |||
| return false; | |||
| } | |||
| */ | |||
| /* | |||
| if ((res = bootstrap_register(fBootPort, (char*)name, fServerPort)) != KERN_SUCCESS) { | |||
| jack_error("Allocate: can't check in mach port name = %s err = %s", name, mach_error_string(res)); | |||
| return false; | |||
| } | |||
| */ | |||
| mach_port_limits_t qlimits; | |||
| mach_msg_type_number_t info_cnt = MACH_PORT_LIMITS_INFO_COUNT; | |||
| @@ -80,6 +109,7 @@ bool JackMachPort::AllocatePort(const char* name) | |||
| bool JackMachPort::ConnectPort(const char* name) | |||
| { | |||
| kern_return_t res; | |||
| mach_port_t old_port; | |||
| jack_log("JackMachPort::ConnectPort %s", name); | |||
| @@ -92,6 +122,13 @@ bool JackMachPort::ConnectPort(const char* name) | |||
| jack_error("ConnectPort: can't find mach server port name = %s err = %s", name, mach_error_string(res)); | |||
| return false; | |||
| } | |||
| /* | |||
| if ((res = mach_port_request_notification(mach_task_self(), fServerPort, MACH_NOTIFY_DEAD_NAME, | |||
| 0, fServerPort, MACH_MSG_TYPE_MAKE_SEND_ONCE, &old_port)) != KERN_SUCCESS) { | |||
| jack_error("AddPort: error in mach_port_request_notification MACH_NOTIFY_DEAD_NAME err = %s", mach_error_string(res)); | |||
| return false; | |||
| } | |||
| */ | |||
| return true; | |||
| } | |||
| @@ -143,6 +180,11 @@ mach_port_t JackMachPort::GetPort() | |||
| return fServerPort; | |||
| } | |||
| void JackMachPort::SetPort(mach_port_t port) | |||
| { | |||
| fServerPort = port; | |||
| } | |||
| bool JackMachPortSet::AllocatePort(const char* name, int queue) | |||
| { | |||
| kern_return_t res; | |||
| @@ -54,6 +54,7 @@ class JackMachPort | |||
| virtual bool DisconnectPort(); | |||
| virtual bool DestroyPort(); | |||
| virtual mach_port_t GetPort(); | |||
| virtual void SetPort(mach_port_t port); | |||
| }; | |||
| /*! | |||
| @@ -81,11 +81,17 @@ void JackMachServerChannel::ClientCheck(char* name, char* name_res, int protocol | |||
| *result = GetEngine()->ClientCheck(name, name_res, protocol, options, status); | |||
| } | |||
| void JackMachServerChannel::ClientOpen(char* name, int pid, mach_port_t* private_port, int* shared_engine, int* shared_client, int* shared_graph, int* result) | |||
| void JackMachServerChannel::ClientOpen(char* name, int pid, mach_port_t callback_port, mach_port_t* private_port, int* shared_engine, int* shared_client, int* shared_graph, int* result) | |||
| { | |||
| int refnum = -1; | |||
| *result = GetEngine()->ClientExternalOpen(name, pid, &refnum, shared_engine, shared_client, shared_graph); | |||
| gCallback_port = callback_port; | |||
| printf(" JackMachServerChannel::ClientOpen gCallback_port %d\n", gCallback_port); | |||
| *result = GetEngine()->ClientExternalOpen(name, pid, &refnum, shared_engine, shared_client, shared_graph); | |||
| if (*result == 0) { | |||
| mach_port_t port = fServerPort.AddPort(); | |||
| if (port != 0) { | |||
| @@ -59,7 +59,9 @@ class JackMachServerChannel : public JackRunnableInterface | |||
| JackServer* GetServer(); | |||
| void ClientCheck(char* name, char* name_res, int protocol, int options, int* status, int* result); | |||
| void ClientOpen(char* name, int pid, mach_port_t* private_port, int* shared_engine, int* shared_client, int* shared_graph, int* result); | |||
| //void ClientOpen(char* name, int pid, mach_port_t* private_port, int* shared_engine, int* shared_client, int* shared_graph, int* result); | |||
| void ClientOpen(char* name, int pid, mach_port_t callback_port, mach_port_t* private_port, int* shared_engine, int* shared_client, int* shared_graph, int* result); | |||
| void ClientClose(mach_port_t private_port, int refnum); | |||
| void ClientKill(mach_port_t private_port); | |||
| @@ -1,6 +1,6 @@ | |||
| /* | |||
| * IDENTIFICATION: | |||
| * stub generated Mon Sep 1 17:42:27 2008 | |||
| * stub generated Fri Dec 12 14:50:06 2008 | |||
| * with a MiG generated Tue Feb 19 02:01:43 PST 2008 by root@b75.local | |||
| * OPTIONS: | |||
| */ | |||
| @@ -1,6 +1,6 @@ | |||
| /* | |||
| * IDENTIFICATION: | |||
| * stub generated Mon Sep 1 17:42:27 2008 | |||
| * stub generated Fri Dec 12 14:50:06 2008 | |||
| * with a MiG generated Tue Feb 19 02:01:43 PST 2008 by root@b75.local | |||
| * OPTIONS: | |||
| */ | |||
| @@ -34,7 +34,8 @@ type objet_data_t = c_string[1024]; | |||
| routine rpc_jack_client_open( | |||
| server_port : mach_port_t; | |||
| client_name : client_name_t; | |||
| pid : int; | |||
| pid : int; | |||
| callback_port : mach_port_make_send_t; | |||
| out private_port : mach_port_make_send_t; | |||
| out shared_engine : int; | |||
| out shared_client : int; | |||
| @@ -54,6 +54,7 @@ kern_return_t rpc_jack_client_open | |||
| mach_port_t server_port, | |||
| client_name_t client_name, | |||
| int pid, | |||
| mach_port_t callback_port, | |||
| mach_port_t *private_port, | |||
| int *shared_engine, | |||
| int *shared_client, | |||
| @@ -381,6 +382,10 @@ __END_DECLS | |||
| #endif | |||
| typedef struct { | |||
| mach_msg_header_t Head; | |||
| /* start of the kernel processed data */ | |||
| mach_msg_body_t msgh_body; | |||
| mach_msg_port_descriptor_t callback_port; | |||
| /* end of the kernel processed data */ | |||
| NDR_record_t NDR; | |||
| client_name_t client_name; | |||
| int pid; | |||
| @@ -1,6 +1,6 @@ | |||
| /* | |||
| * IDENTIFICATION: | |||
| * stub generated Mon Sep 1 17:42:28 2008 | |||
| * stub generated Fri Dec 12 14:50:06 2008 | |||
| * with a MiG generated Tue Feb 19 02:01:43 PST 2008 by root@b75.local | |||
| * OPTIONS: | |||
| */ | |||
| @@ -109,6 +109,10 @@ | |||
| #endif | |||
| typedef struct { | |||
| mach_msg_header_t Head; | |||
| /* start of the kernel processed data */ | |||
| mach_msg_body_t msgh_body; | |||
| mach_msg_port_descriptor_t callback_port; | |||
| /* end of the kernel processed data */ | |||
| NDR_record_t NDR; | |||
| client_name_t client_name; | |||
| int pid; | |||
| @@ -905,11 +909,18 @@ mig_internal kern_return_t __MIG_check__Request__rpc_jack_client_open_t(__attrib | |||
| typedef __Request__rpc_jack_client_open_t __Request; | |||
| #if __MigTypeCheck | |||
| if ((In0P->Head.msgh_bits & MACH_MSGH_BITS_COMPLEX) || | |||
| if (!(In0P->Head.msgh_bits & MACH_MSGH_BITS_COMPLEX) || | |||
| (In0P->msgh_body.msgh_descriptor_count != 1) || | |||
| (In0P->Head.msgh_size != (mach_msg_size_t)sizeof(__Request))) | |||
| return MIG_BAD_ARGUMENTS; | |||
| #endif /* __MigTypeCheck */ | |||
| #if __MigTypeCheck | |||
| if (In0P->callback_port.type != MACH_MSG_PORT_DESCRIPTOR || | |||
| In0P->callback_port.disposition != 17) | |||
| return MIG_TYPE_ERROR; | |||
| #endif /* __MigTypeCheck */ | |||
| #if defined(__NDR_convert__int_rep__Request__rpc_jack_client_open_t__client_name__defined) || \ | |||
| defined(__NDR_convert__int_rep__Request__rpc_jack_client_open_t__pid__defined) | |||
| if (In0P->NDR.int_rep != NDR_record.int_rep) { | |||
| @@ -964,6 +975,7 @@ kern_return_t server_rpc_jack_client_open | |||
| mach_port_t server_port, | |||
| client_name_t client_name, | |||
| int pid, | |||
| mach_port_t callback_port, | |||
| mach_port_t *private_port, | |||
| int *shared_engine, | |||
| int *shared_client, | |||
| @@ -981,6 +993,10 @@ mig_internal novalue _Xrpc_jack_client_open | |||
| #endif | |||
| typedef struct { | |||
| mach_msg_header_t Head; | |||
| /* start of the kernel processed data */ | |||
| mach_msg_body_t msgh_body; | |||
| mach_msg_port_descriptor_t callback_port; | |||
| /* end of the kernel processed data */ | |||
| NDR_record_t NDR; | |||
| client_name_t client_name; | |||
| int pid; | |||
| @@ -1034,7 +1050,7 @@ mig_internal novalue _Xrpc_jack_client_open | |||
| #endif /* UseStaticTemplates */ | |||
| RetCode = server_rpc_jack_client_open(In0P->Head.msgh_request_port, In0P->client_name, In0P->pid, &OutP->private_port.name, &OutP->shared_engine, &OutP->shared_client, &OutP->shared_graph, &OutP->result); | |||
| RetCode = server_rpc_jack_client_open(In0P->Head.msgh_request_port, In0P->client_name, In0P->pid, In0P->callback_port.name, &OutP->private_port.name, &OutP->shared_engine, &OutP->shared_client, &OutP->shared_graph, &OutP->result); | |||
| if (RetCode != KERN_SUCCESS) { | |||
| MIG_RETURN_ERROR(OutP, RetCode); | |||
| } | |||
| @@ -6626,7 +6642,7 @@ const struct server_JackRPCEngine_subsystem { | |||
| (vm_address_t)0, | |||
| { | |||
| { (mig_impl_routine_t) 0, | |||
| (mig_stub_routine_t) _Xrpc_jack_client_open, 8, 0, (routine_arg_descriptor_t)0, (mach_msg_size_t)sizeof(__Reply__rpc_jack_client_open_t)}, | |||
| (mig_stub_routine_t) _Xrpc_jack_client_open, 9, 0, (routine_arg_descriptor_t)0, (mach_msg_size_t)sizeof(__Reply__rpc_jack_client_open_t)}, | |||
| { (mig_impl_routine_t) 0, | |||
| (mig_stub_routine_t) _Xrpc_jack_client_check, 7, 0, (routine_arg_descriptor_t)0, (mach_msg_size_t)sizeof(__Reply__rpc_jack_client_check_t)}, | |||
| { (mig_impl_routine_t) 0, | |||
| @@ -1,6 +1,6 @@ | |||
| /* | |||
| * IDENTIFICATION: | |||
| * stub generated Mon Sep 1 17:42:28 2008 | |||
| * stub generated Fri Dec 12 14:50:06 2008 | |||
| * with a MiG generated Tue Feb 19 02:01:43 PST 2008 by root@b75.local | |||
| * OPTIONS: | |||
| */ | |||
| @@ -476,6 +476,7 @@ mig_external kern_return_t rpc_jack_client_open | |||
| mach_port_t server_port, | |||
| client_name_t client_name, | |||
| int pid, | |||
| mach_port_t callback_port, | |||
| mach_port_t *private_port, | |||
| int *shared_engine, | |||
| int *shared_client, | |||
| @@ -489,6 +490,10 @@ mig_external kern_return_t rpc_jack_client_open | |||
| #endif | |||
| typedef struct { | |||
| mach_msg_header_t Head; | |||
| /* start of the kernel processed data */ | |||
| mach_msg_body_t msgh_body; | |||
| mach_msg_port_descriptor_t callback_port; | |||
| /* end of the kernel processed data */ | |||
| NDR_record_t NDR; | |||
| client_name_t client_name; | |||
| int pid; | |||
| @@ -559,13 +564,33 @@ mig_external kern_return_t rpc_jack_client_open | |||
| __DeclareSendRpc(1000, "rpc_jack_client_open") | |||
| #if UseStaticTemplates | |||
| const static mach_msg_port_descriptor_t callback_portTemplate = { | |||
| /* name = */ MACH_PORT_NULL, | |||
| /* pad1 = */ 0, | |||
| /* pad2 = */ 0, | |||
| /* disp = */ 20, | |||
| /* type = */ MACH_MSG_PORT_DESCRIPTOR, | |||
| }; | |||
| #endif /* UseStaticTemplates */ | |||
| InP->msgh_body.msgh_descriptor_count = 1; | |||
| #if UseStaticTemplates | |||
| InP->callback_port = callback_portTemplate; | |||
| InP->callback_port.name = callback_port; | |||
| #else /* UseStaticTemplates */ | |||
| InP->callback_port.name = callback_port; | |||
| InP->callback_port.disposition = 20; | |||
| InP->callback_port.type = MACH_MSG_PORT_DESCRIPTOR; | |||
| #endif /* UseStaticTemplates */ | |||
| InP->NDR = NDR_record; | |||
| (void) mig_strncpy(InP->client_name, client_name, 128); | |||
| InP->pid = pid; | |||
| InP->Head.msgh_bits = | |||
| InP->Head.msgh_bits = MACH_MSGH_BITS_COMPLEX| | |||
| MACH_MSGH_BITS(19, MACH_MSG_TYPE_MAKE_SEND_ONCE); | |||
| /* msgh_size passed as argument */ | |||
| InP->Head.msgh_request_port = server_port; | |||