From 41890af89afa20bec9521db4cf551d95a030a217 Mon Sep 17 00:00:00 2001 From: sletz Date: Tue, 16 Dec 2008 10:56:58 +0000 Subject: [PATCH] Description des layers git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@3208 0c269be4-1314-0410-8aa9-9f06e86f4224 --- macosx/JackMacEngineRPC.cpp | 6 ++--- macosx/JackMachClientChannel.cpp | 31 +++++++++++++++++++++- macosx/JackMachClientChannel.h | 2 ++ macosx/JackMachNotifyChannel.cpp | 8 ++++++ macosx/JackMachNotifyChannel.h | 2 ++ macosx/JackMachPort.cpp | 44 +++++++++++++++++++++++++++++++- macosx/JackMachPort.h | 1 + macosx/JackMachServerChannel.cpp | 10 ++++++-- macosx/JackMachServerChannel.h | 4 ++- macosx/RPC/JackRPCClientServer.c | 2 +- macosx/RPC/JackRPCClientUser.c | 2 +- macosx/RPC/JackRPCEngine.defs | 3 ++- macosx/RPC/JackRPCEngine.h | 5 ++++ macosx/RPC/JackRPCEngineServer.c | 24 ++++++++++++++--- macosx/RPC/JackRPCEngineUser.c | 29 +++++++++++++++++++-- 15 files changed, 156 insertions(+), 17 deletions(-) diff --git a/macosx/JackMacEngineRPC.cpp b/macosx/JackMacEngineRPC.cpp index 0303eb77..790ad99a 100644 --- a/macosx/JackMacEngineRPC.cpp +++ b/macosx/JackMacEngineRPC.cpp @@ -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; } diff --git a/macosx/JackMachClientChannel.cpp b/macosx/JackMachClientChannel.cpp index 360c8231..57902725 100644 --- a/macosx/JackMachClientChannel.cpp +++ b/macosx/JackMachClientChannel.cpp @@ -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 diff --git a/macosx/JackMachClientChannel.h b/macosx/JackMachClientChannel.h index 9e323cf5..ae29c058 100644 --- a/macosx/JackMachClientChannel.h +++ b/macosx/JackMachClientChannel.h @@ -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: diff --git a/macosx/JackMachNotifyChannel.cpp b/macosx/JackMachNotifyChannel.cpp index 86236304..faa1dd8d 100644 --- a/macosx/JackMachNotifyChannel.cpp +++ b/macosx/JackMachNotifyChannel.cpp @@ -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() diff --git a/macosx/JackMachNotifyChannel.h b/macosx/JackMachNotifyChannel.h index 0cae49dd..3fb00334 100644 --- a/macosx/JackMachNotifyChannel.h +++ b/macosx/JackMachNotifyChannel.h @@ -30,6 +30,8 @@ namespace Jack \brief JackNotifyChannel using Mach IPC. */ +extern mach_port_t gCallback_port; + class JackMachNotifyChannel { diff --git a/macosx/JackMachPort.cpp b/macosx/JackMachPort.cpp index d0d236b7..e54c1421 100644 --- a/macosx/JackMachPort.cpp +++ b/macosx/JackMachPort.cpp @@ -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; diff --git a/macosx/JackMachPort.h b/macosx/JackMachPort.h index 85176b3f..db8e5cb5 100644 --- a/macosx/JackMachPort.h +++ b/macosx/JackMachPort.h @@ -54,6 +54,7 @@ class JackMachPort virtual bool DisconnectPort(); virtual bool DestroyPort(); virtual mach_port_t GetPort(); + virtual void SetPort(mach_port_t port); }; /*! diff --git a/macosx/JackMachServerChannel.cpp b/macosx/JackMachServerChannel.cpp index 84d87b93..6c0f115e 100644 --- a/macosx/JackMachServerChannel.cpp +++ b/macosx/JackMachServerChannel.cpp @@ -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) { diff --git a/macosx/JackMachServerChannel.h b/macosx/JackMachServerChannel.h index a6b351c7..d3fb8c5f 100644 --- a/macosx/JackMachServerChannel.h +++ b/macosx/JackMachServerChannel.h @@ -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); diff --git a/macosx/RPC/JackRPCClientServer.c b/macosx/RPC/JackRPCClientServer.c index efb4e9e9..a8ad23b1 100644 --- a/macosx/RPC/JackRPCClientServer.c +++ b/macosx/RPC/JackRPCClientServer.c @@ -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: */ diff --git a/macosx/RPC/JackRPCClientUser.c b/macosx/RPC/JackRPCClientUser.c index 4dc66a10..3738cba9 100644 --- a/macosx/RPC/JackRPCClientUser.c +++ b/macosx/RPC/JackRPCClientUser.c @@ -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: */ diff --git a/macosx/RPC/JackRPCEngine.defs b/macosx/RPC/JackRPCEngine.defs index 63500f41..02d15776 100644 --- a/macosx/RPC/JackRPCEngine.defs +++ b/macosx/RPC/JackRPCEngine.defs @@ -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; diff --git a/macosx/RPC/JackRPCEngine.h b/macosx/RPC/JackRPCEngine.h index 8b4fddf4..81bd1323 100644 --- a/macosx/RPC/JackRPCEngine.h +++ b/macosx/RPC/JackRPCEngine.h @@ -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; diff --git a/macosx/RPC/JackRPCEngineServer.c b/macosx/RPC/JackRPCEngineServer.c index 16508dcf..a8a4b80f 100644 --- a/macosx/RPC/JackRPCEngineServer.c +++ b/macosx/RPC/JackRPCEngineServer.c @@ -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, diff --git a/macosx/RPC/JackRPCEngineUser.c b/macosx/RPC/JackRPCEngineUser.c index f6e5b3f0..b0fa8b64 100644 --- a/macosx/RPC/JackRPCEngineUser.c +++ b/macosx/RPC/JackRPCEngineUser.c @@ -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;