diff options
author | Patrik Nyblom <[email protected]> | 2012-04-17 16:15:11 +0200 |
---|---|---|
committer | Patrik Nyblom <[email protected]> | 2012-04-17 16:19:49 +0200 |
commit | b0534e7f668f12b0d48e139c5ddbfcd85eaff4ce (patch) | |
tree | e4e6afa0a9a395aec7651c0d56c0f782163c1d5f /erts/emulator/beam | |
parent | f1a49c45e4b2ec746407fd777ba31fec6cab118e (diff) | |
parent | d6d38a42650880bcd6c1f93c5797958857e82d60 (diff) | |
download | otp-b0534e7f668f12b0d48e139c5ddbfcd85eaff4ce.tar.gz otp-b0534e7f668f12b0d48e139c5ddbfcd85eaff4ce.tar.bz2 otp-b0534e7f668f12b0d48e139c5ddbfcd85eaff4ce.zip |
Merge branch 'pg/r15/add-os-pid-to-port-info' into maint
* pg/r15/add-os-pid-to-port-info:
tests: Remove line macro from port_bif_SUITE
Correct documentation, erl_bif_types and dialyzer tests
Make port_info(Port,os_pid) work on Windows
Extend erlang:port_info/1,2 to show the OS pid of a spawned process
OTP-10057
Diffstat (limited to 'erts/emulator/beam')
-rw-r--r-- | erts/emulator/beam/atom.names | 1 | ||||
-rwxr-xr-x[-rw-r--r--] | erts/emulator/beam/erl_bif_info.c | 16 | ||||
-rwxr-xr-x[-rw-r--r--] | erts/emulator/beam/global.h | 1 | ||||
-rw-r--r-- | erts/emulator/beam/io.c | 1 |
4 files changed, 18 insertions, 1 deletions
diff --git a/erts/emulator/beam/atom.names b/erts/emulator/beam/atom.names index 02735d4b68..78c566ed38 100644 --- a/erts/emulator/beam/atom.names +++ b/erts/emulator/beam/atom.names @@ -391,6 +391,7 @@ atom opt atom or atom ordered_set atom orelse +atom os_pid atom os_type atom os_version atom ose_bg_proc diff --git a/erts/emulator/beam/erl_bif_info.c b/erts/emulator/beam/erl_bif_info.c index 060a52d220..2373dc7af4 100644..100755 --- a/erts/emulator/beam/erl_bif_info.c +++ b/erts/emulator/beam/erl_bif_info.c @@ -2765,7 +2765,8 @@ port_info_1(BIF_ALIST_1) am_id, am_connected, am_input, - am_output + am_output, + am_os_pid }; Eterm items[ASIZE(keys)]; Eterm result = NIL; @@ -2822,6 +2823,7 @@ port_info_1(BIF_ALIST_1) ** name String ** input Number of bytes input from port program ** output Number of bytes output to the port program +** os_pid The child's process ID */ BIF_RETTYPE port_info_2(BIF_ALIST_2) @@ -2922,6 +2924,18 @@ static BIF_RETTYPE port_info(Process* p, Eterm portid, Eterm item) hp = HAlloc(p, hsz); res = erts_bld_uint(&hp, NULL, n); } + else if (item == am_os_pid) { + if (prt->os_pid >= 0) { + Uint hsz = 3; + UWord n = prt->os_pid; + (void) erts_bld_uword(NULL, &hsz, n); + hp = HAlloc(p, hsz); + res = erts_bld_uword(&hp, NULL, n); + } else { + hp = HAlloc(p, 3); + res = am_undefined; + } + } else if (item == am_registered_name) { RegProc *reg; reg = prt->reg; diff --git a/erts/emulator/beam/global.h b/erts/emulator/beam/global.h index fc4c0ba121..894872dbc0 100644..100755 --- a/erts/emulator/beam/global.h +++ b/erts/emulator/beam/global.h @@ -173,6 +173,7 @@ struct port { char *name; /* String used in the open */ erts_driver_t* drv_ptr; UWord drv_data; + SWord os_pid; /* Child process ID */ ErtsProcList *suspended; /* List of suspended processes. */ LineBuf *linebuf; /* Buffer to hold data not ready for process to get (line oriented I/O)*/ diff --git a/erts/emulator/beam/io.c b/erts/emulator/beam/io.c index 53a25f5136..a685f41c4d 100644 --- a/erts/emulator/beam/io.c +++ b/erts/emulator/beam/io.c @@ -440,6 +440,7 @@ setup_port(Port* prt, Eterm pid, erts_driver_t *driver, sys_strcpy(new_name, name); erts_smp_runq_lock(runq); erts_smp_port_state_lock(prt); + prt->os_pid = -1; prt->status = ERTS_PORT_SFLG_CONNECTED | xstatus; prt->snapshot = erts_smp_atomic32_read_nob(&erts_ports_snapshot); old_name = prt->name; |