Browse Source

Description des layers

git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@3208 0c269be4-1314-0410-8aa9-9f06e86f4224
tags/1.9.1
sletz 17 years ago
parent
commit
41890af89a
15 changed files with 156 additions and 17 deletions
  1. +3
    -3
      macosx/JackMacEngineRPC.cpp
  2. +30
    -1
      macosx/JackMachClientChannel.cpp
  3. +2
    -0
      macosx/JackMachClientChannel.h
  4. +8
    -0
      macosx/JackMachNotifyChannel.cpp
  5. +2
    -0
      macosx/JackMachNotifyChannel.h
  6. +43
    -1
      macosx/JackMachPort.cpp
  7. +1
    -0
      macosx/JackMachPort.h
  8. +8
    -2
      macosx/JackMachServerChannel.cpp
  9. +3
    -1
      macosx/JackMachServerChannel.h
  10. +1
    -1
      macosx/RPC/JackRPCClientServer.c
  11. +1
    -1
      macosx/RPC/JackRPCClientUser.c
  12. +2
    -1
      macosx/RPC/JackRPCEngine.defs
  13. +5
    -0
      macosx/RPC/JackRPCEngine.h
  14. +20
    -4
      macosx/RPC/JackRPCEngineServer.c
  15. +27
    -2
      macosx/RPC/JackRPCEngineUser.c

+ 3
- 3
macosx/JackMacEngineRPC.cpp View File

@@ -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;
}



+ 30
- 1
macosx/JackMachClientChannel.cpp View File

@@ -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



+ 2
- 0
macosx/JackMachClientChannel.h View File

@@ -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:



+ 8
- 0
macosx/JackMachNotifyChannel.cpp View File

@@ -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()


+ 2
- 0
macosx/JackMachNotifyChannel.h View File

@@ -30,6 +30,8 @@ namespace Jack
\brief JackNotifyChannel using Mach IPC.
*/

extern mach_port_t gCallback_port;

class JackMachNotifyChannel
{



+ 43
- 1
macosx/JackMachPort.cpp View File

@@ -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;


+ 1
- 0
macosx/JackMachPort.h View File

@@ -54,6 +54,7 @@ class JackMachPort
virtual bool DisconnectPort();
virtual bool DestroyPort();
virtual mach_port_t GetPort();
virtual void SetPort(mach_port_t port);
};

/*!


+ 8
- 2
macosx/JackMachServerChannel.cpp View File

@@ -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) {


+ 3
- 1
macosx/JackMachServerChannel.h View File

@@ -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
- 1
macosx/RPC/JackRPCClientServer.c View File

@@ -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
- 1
macosx/RPC/JackRPCClientUser.c View File

@@ -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:
*/


+ 2
- 1
macosx/RPC/JackRPCEngine.defs View File

@@ -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;


+ 5
- 0
macosx/RPC/JackRPCEngine.h View File

@@ -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;


+ 20
- 4
macosx/RPC/JackRPCEngineServer.c View File

@@ -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,


+ 27
- 2
macosx/RPC/JackRPCEngineUser.c View File

@@ -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;


Loading…
Cancel
Save