Skip to content
This repository has been archived by the owner on Aug 20, 2018. It is now read-only.

Commit

Permalink
Bug 956315 - Improve logging of NSS calls. r=ctalbert
Browse files Browse the repository at this point in the history
(cherry picked from commit 4913f6c)
  • Loading branch information
whimboo committed Jan 13, 2014
1 parent 4d9d3ce commit f7074b8
Show file tree
Hide file tree
Showing 3 changed files with 65 additions and 37 deletions.
50 changes: 28 additions & 22 deletions jsbridge/jsbridge/extension/resource/modules/NSS.jsm
Expand Up @@ -38,6 +38,10 @@ NSS.init();


NSS.Types = {
// Return codes
PR_FAILURE: -1,
PR_SUCCESS: 0,

// Error codes
// See http://mxr.mozilla.org/mozilla-central/source/nsprpub/pr/include/prerr.h
PR_WOULD_BLOCK_ERROR: -5998,
Expand All @@ -56,7 +60,9 @@ NSS.Types = {
PRSocketOptionData: ctypes.StructType("PRSocketOptionData", [
{'option' : ctypes.int32_t},
{'non_blocking': ctypes.int32_t}
])
]),

PRStatus: ctypes.int32_t
}


Expand All @@ -75,46 +81,46 @@ NSS.Sockets = {

PR_Accept: NSS._library.declare("PR_Accept",
ctypes.default_abi,
NSS.Types.PRFileDesc.ptr, // new socket fd
NSS.Types.PRFileDesc.ptr, // rendezvous socket fd
NSS.Types.PRNetAddr.ptr, //addr
NSS.Types.PRFileDesc.ptr, // new socket
NSS.Types.PRFileDesc.ptr, // rendezvous socket
NSS.Types.PRNetAddr.ptr, // address
ctypes.uint32_t // timeout interval
),

PR_Bind: NSS._library.declare("PR_Bind",
ctypes.default_abi,
ctypes.int32_t,
NSS.Types.PRFileDesc.ptr,
NSS.Types.PRNetAddr.ptr
NSS.Types.PRStatus, // return (status)
NSS.Types.PRFileDesc.ptr, // socket
NSS.Types.PRNetAddr.ptr // address
),

PR_Close: NSS._library.declare("PR_Close",
ctypes.default_abi,
ctypes.int32_t,
NSS.Types.PRFileDesc.ptr
NSS.Types.PRStatus, // return (status)
NSS.Types.PRFileDesc.ptr // socket
),

PR_GetError: NSS._library.declare("PR_GetError",
ctypes.default_abi,
NSS.Types.PRErrorCode
NSS.Types.PRErrorCode // return
),

PR_Listen: NSS._library.declare("PR_Listen",
ctypes.default_abi,
ctypes.int32_t,
NSS.Types.PRFileDesc.ptr, // fd
NSS.Types.PRStatus, // return (status)
NSS.Types.PRFileDesc.ptr, // socket
ctypes.int32_t // backlog
),

PR_OpenTCPSocket: NSS._library.declare("PR_OpenTCPSocket",
ctypes.default_abi, // cdecl calling convention
NSS.Types.PRFileDesc.ptr, // return (PRFileDesc*)
ctypes.int32_t // first arg
NSS.Types.PRFileDesc.ptr, // return (socket)
ctypes.int32_t // address family
),

PR_Recv: NSS._library.declare("PR_Recv",
ctypes.default_abi,
ctypes.int32_t, // return
NSS.Types.PRStatus, // return (status)
NSS.Types.PRFileDesc.ptr, // socket
ctypes.voidptr_t, // buffer
ctypes.int32_t, // buffer length
Expand All @@ -124,7 +130,7 @@ NSS.Sockets = {

PR_Send: NSS._library.declare("PR_Send",
ctypes.default_abi,
ctypes.int32_t, // return
NSS.Types.PRStatus, // return (status)
NSS.Types.PRFileDesc.ptr, // socket
ctypes.voidptr_t, // buffer
ctypes.int32_t, // buffer length
Expand All @@ -134,17 +140,17 @@ NSS.Sockets = {

PR_SetNetAddr: NSS._library.declare("PR_SetNetAddr",
ctypes.default_abi,
ctypes.int32_t, // really doesn't return anything
ctypes.int32_t, // val
ctypes.uint16_t, // af
NSS.Types.PRStatus, // return (status)
ctypes.int32_t, // host
ctypes.uint16_t, // address family
ctypes.uint16_t, // port
NSS.Types.PRNetAddr.ptr
),

PR_SetSocketOption: NSS._library.declare("PR_SetSocketOption",
ctypes.default_abi,
ctypes.int32_t,
NSS.Types.PRFileDesc.ptr,
NSS.Types.PRSocketOptionData.ptr
NSS.Types.PRStatus, // return (status)
NSS.Types.PRFileDesc.ptr, // socket
NSS.Types.PRSocketOptionData.ptr // option data
)
}
4 changes: 2 additions & 2 deletions jsbridge/jsbridge/extension/resource/modules/Server.jsm
Expand Up @@ -86,12 +86,12 @@ Server.Server.prototype = {
},

stop: function () {
Log.dump("Stop JSBridge server on port", this._port);

sessions.quit();

this._socket.close();
this._socket = null;

Log.dump("Stopped JSBridge server on port", this._port);
}
};

Expand Down
48 changes: 35 additions & 13 deletions jsbridge/jsbridge/extension/resource/modules/Sockets.jsm
Expand Up @@ -87,44 +87,63 @@ Sockets.Client.prototype = {
this.timer.cancel();
this.timer = null;

return NSS.Sockets.PR_Close(this.fd);
var status = NSS.Sockets.PR_Close(this.fd);
Log.dump("Closing client socket", this.fd);
if (status === NSS.Types.PR_FAILURE)
Log.dump("PR_Close() failed", NSS.Sockets.PR_GetError());
}
};


Sockets.ServerSocket = function (aPort) {
let status;
let addr = NSS.Types.PRNetAddr();
NSS.Sockets.PR_SetNetAddr(NSS.Sockets.PR_IpAddrLoopback,
NSS.Sockets.PR_AF_INET,
aPort, addr.address());

status = NSS.Sockets.PR_SetNetAddr(NSS.Sockets.PR_IpAddrLoopback,
NSS.Sockets.PR_AF_INET,
aPort, addr.address());
if (status === NSS.Types.PR_FAILURE)
throw Error("PR_SetNetAddr() failed (" + NSS.Sockets.PR_GetError() + ")");

let fd = NSS.Sockets.PR_OpenTCPSocket(NSS.Sockets.PR_AF_INET);
if (fd.isNull())
throw Error("PR_OpenTCPSocket() failed (" + NSS.Sockets.PR_GetError() + ")");

// don't block for accept/send/recv
let opt = NSS.Types.PRSocketOptionData();
opt.non_blocking = NSS.Sockets.PR_TRUE;
opt.option = NSS.Sockets.PR_SockOpt_Nonblocking;
NSS.Sockets.PR_SetSocketOption(fd, opt.address());
status = NSS.Sockets.PR_SetSocketOption(fd, opt.address());
if (status === NSS.Types.PR_FAILURE)
Log.dump("PR_SetSocketOption() failed for setting non-blocking",
NSS.Sockets.PR_GetError());

// don't buffer when sending
opt = NSS.Types.PRSocketOptionData();
opt.non_blocking = NSS.Sockets.PR_TRUE; // same space
opt.option = NSS.Sockets.PR_SockOpt_NoDelay;
NSS.Sockets.PR_SetSocketOption(fd, opt.address());
status = NSS.Sockets.PR_SetSocketOption(fd, opt.address());
if (status === NSS.Types.PR_FAILURE)
Log.dump("PR_SetSocketOption() failed for disabling the send buffer",
NSS.Sockets.PR_GetError());

// allow local address re-use
opt = NSS.Types.PRSocketOptionData();
opt.non_blocking = NSS.Sockets.PR_TRUE; // same space
opt.option = NSS.Sockets.PR_SockOpt_Reuseaddr;
NSS.Sockets.PR_SetSocketOption(fd, opt.address());
status = NSS.Sockets.PR_SetSocketOption(fd, opt.address());
if (status === NSS.Types.PR_FAILURE)
Log.dump("PR_SetSocketOption() failed for local address re-use",
NSS.Sockets.PR_GetError());

Log.dump("Binding server socket", fd);
let status = NSS.Sockets.PR_Bind(fd, addr.address());
if (status !== 0)
throw Error("Socket failed to bind, kill all firefox processes");
if (status === NSS.Types.PR_FAILURE)
throw Error("PR_Bind() failed (" + NSS.Sockets.PR_GetError() + ")");

status = NSS.Sockets.PR_Listen(fd, -1);
if (status !== 0)
throw Error("Socket failed to listen");
if (status === NSS.Types.PR_FAILURE)
throw Error("PR_Listen() failed (" + NSS.Sockets.PR_GetError() + ")");

this.addr = addr;
this.fd = fd;
Expand All @@ -140,7 +159,7 @@ Sockets.ServerSocket.prototype = {
var event = {
notify: function (timer) {
let newfd = NSS.Sockets.PR_Accept(self.fd, self.addr.address(),
NSS.Sockets.PR_INTERVAL_NO_WAIT);
NSS.Sockets.PR_INTERVAL_NO_WAIT);
if (!newfd.isNull()) {
callback(new Sockets.Client(newfd));
}
Expand All @@ -154,6 +173,9 @@ Sockets.ServerSocket.prototype = {
this.timer.cancel();
this.timer = null;

return NSS.Sockets.PR_Close(this.fd);
var status = NSS.Sockets.PR_Close(this.fd);
Log.dump("Closing server socket", this.fd);
if (status === NSS.Types.PR_FAILURE)
Log.dump("PR_Close() failed", NSS.Sockets.PR_GetError());
}
};

0 comments on commit f7074b8

Please sign in to comment.