diff options
author | Rickard Green <rickard@erlang.org> | 2020-04-27 11:39:08 +0200 |
---|---|---|
committer | Rickard Green <rickard@erlang.org> | 2020-05-02 05:24:35 +0200 |
commit | 2b843cf280d7f9d3154ec63766fc5181a190a988 (patch) | |
tree | 7a2d3bcf1bc90fa7435b5869b13875e1e0c9640c /lib/erl_interface | |
parent | bb79f53b78321d6d0917e218e903e4c14128d937 (diff) | |
download | erlang-2b843cf280d7f9d3154ec63766fc5181a190a988.tar.gz |
Do not modify 'self' in 'ei_cnode' structure after initialization
Diffstat (limited to 'lib/erl_interface')
-rw-r--r-- | lib/erl_interface/doc/src/ei_connect.xml | 13 | ||||
-rw-r--r-- | lib/erl_interface/src/connect/ei_connect.c | 6 | ||||
-rw-r--r-- | lib/erl_interface/src/global/global_names.c | 1 | ||||
-rw-r--r-- | lib/erl_interface/src/global/global_unregister.c | 2 | ||||
-rw-r--r-- | lib/erl_interface/src/global/global_whereis.c | 2 | ||||
-rw-r--r-- | lib/erl_interface/src/registry/reg_dump.c | 18 | ||||
-rw-r--r-- | lib/erl_interface/src/registry/reg_restore.c | 20 |
7 files changed, 20 insertions, 42 deletions
diff --git a/lib/erl_interface/doc/src/ei_connect.xml b/lib/erl_interface/doc/src/ei_connect.xml index f991165df7..b5c6629929 100644 --- a/lib/erl_interface/doc/src/ei_connect.xml +++ b/lib/erl_interface/doc/src/ei_connect.xml @@ -1076,17 +1076,8 @@ if (ei_decode_version(result.buff, &index) < 0 <c>erlang_pid</c>, which is to be the process identifier of the sending process (in the Erlang distribution protocol).</p> - <p>A suitable <c>erlang_pid</c> can be constructed from the - <c>ei_cnode</c> structure by the following example - code:</p> - <code type="none"><![CDATA[ -ei_cnode ec; -erlang_pid *self; -int fd; /* the connection fd */ -... -self = ei_self(&ec); -self->num = fd; - ]]></code> + <p>A suitable <c>erlang_pid</c> can be retrieved from the + <c>ei_cnode</c> structure by calling <c>ei_self(cnode_pointer)</c>.</p> </desc> </func> diff --git a/lib/erl_interface/src/connect/ei_connect.c b/lib/erl_interface/src/connect/ei_connect.c index c95891f166..e536f14fcd 100644 --- a/lib/erl_interface/src/connect/ei_connect.c +++ b/lib/erl_interface/src/connect/ei_connect.c @@ -1475,11 +1475,8 @@ int ei_receive(int fd, unsigned char *bufp, int bufsize) int ei_reg_send_tmo(ei_cnode* ec, int fd, char *server_name, char* buf, int len, unsigned ms) { - erlang_pid *self = ei_self(ec); - self->num = fd; - /* erl_errno and return code is set by ei_reg_send_encoded_tmo() */ - return ei_send_reg_encoded_tmo(fd, self, server_name, buf, len, ms); + return ei_send_reg_encoded_tmo(fd, ei_self(ec), server_name, buf, len, ms); } @@ -1589,7 +1586,6 @@ int ei_rpc_to(ei_cnode *ec, int fd, char *mod, char *fun, ei_x_buff x; erlang_pid *self = ei_self(ec); int err = ERL_ERROR; - self->num = fd; /* encode header */ if (ei_x_new_with_version(&x) < 0) diff --git a/lib/erl_interface/src/global/global_names.c b/lib/erl_interface/src/global/global_names.c index 028e872916..4524439467 100644 --- a/lib/erl_interface/src/global/global_names.c +++ b/lib/erl_interface/src/global/global_names.c @@ -53,7 +53,6 @@ char **ei_global_names(ei_cnode *ec, int fd, int *count) char **names; char *s; - self->num = fd; if (ei_encode_version(buf,&index) || ei_encode_tuple_header(buf,&index,2) || ei_encode_pid(buf,&index,self) /* PidFrom */ diff --git a/lib/erl_interface/src/global/global_unregister.c b/lib/erl_interface/src/global/global_unregister.c index 35e242b13f..4743fe65d7 100644 --- a/lib/erl_interface/src/global/global_unregister.c +++ b/lib/erl_interface/src/global/global_unregister.c @@ -41,8 +41,6 @@ int ei_global_unregister(ei_cnode *ec, int fd, const char *name) int version,arity,msglen; int needunlink, needatom, needdemonitor; - /* make a self pid */ - self->num = fd; if (ei_encode_version(buf,&index) || ei_encode_tuple_header(buf,&index,2) || ei_encode_pid(buf,&index,self) /* PidFrom */ diff --git a/lib/erl_interface/src/global/global_whereis.c b/lib/erl_interface/src/global/global_whereis.c index 1af5626f4f..5a6134c2ab 100644 --- a/lib/erl_interface/src/global/global_whereis.c +++ b/lib/erl_interface/src/global/global_whereis.c @@ -45,8 +45,6 @@ int ei_global_whereis(ei_cnode *ec, int fd, const char *name, erlang_pid* pid, c int i; int version,arity,msglen; - self->num = fd; /* FIXME looks strange to change something?! */ - if (ei_encode_version(buf,&index) || ei_encode_tuple_header(buf,&index,2) || ei_encode_pid(buf,&index,self) /* PidFrom */ diff --git a/lib/erl_interface/src/registry/reg_dump.c b/lib/erl_interface/src/registry/reg_dump.c index a027c4cdf5..3c7f2a9e9e 100644 --- a/lib/erl_interface/src/registry/reg_dump.c +++ b/lib/erl_interface/src/registry/reg_dump.c @@ -255,7 +255,7 @@ static int mn_get_unlink(int fd) int ei_reg_dump(int fd, ei_reg *reg, const char *mntab, int flags) { ei_hash *tab; - erlang_pid self; + erlang_pid *self; erlang_pid mnesia; ei_bucket *b; ei_reg_obj *obj; @@ -271,12 +271,10 @@ int ei_reg_dump(int fd, ei_reg *reg, const char *mntab, int flags) if ((ec = ei_fd_to_cnode(fd)) == NULL) { return -1; } - strcpy(self.node,ei_thisnodename(ec)); - self.num = fd; - self.serial = 0; - self.creation = ei_thiscreation(ec); - if (mn_start_dump(fd,&self,&mnesia,mntab)) return -1; + self = ei_self(ec); + + if (mn_start_dump(fd,self,&mnesia,mntab)) return -1; /* traverse the table, passing objects to mnesia */ for (i=0; i<tab->size; i++) { @@ -288,13 +286,13 @@ int ei_reg_dump(int fd, ei_reg *reg, const char *mntab, int flags) if ((flags & EI_FORCE) || (obj->attr & EI_DIRTY)) { if (obj->attr & EI_DELET) { if (mn_send_delete(fd,&mnesia,key)) { - ei_send_exit(fd,&self,&mnesia,"delete failed"); + ei_send_exit(fd,self,&mnesia,"delete failed"); return -1; } } else { if (mn_send_write(fd,&mnesia,key,obj)) { - ei_send_exit(fd,&self,&mnesia,"update failed"); + ei_send_exit(fd,self,&mnesia,"update failed"); return -1; } } @@ -304,8 +302,8 @@ int ei_reg_dump(int fd, ei_reg *reg, const char *mntab, int flags) } /* end the transaction */ - if (mn_send_commit(fd,&mnesia,&self)) { - ei_send_exit(fd,&self,&mnesia,"commit failed"); + if (mn_send_commit(fd,&mnesia,self)) { + ei_send_exit(fd,self,&mnesia,"commit failed"); return -1; } diff --git a/lib/erl_interface/src/registry/reg_restore.c b/lib/erl_interface/src/registry/reg_restore.c index 75d073303f..030bab19b9 100644 --- a/lib/erl_interface/src/registry/reg_restore.c +++ b/lib/erl_interface/src/registry/reg_restore.c @@ -227,7 +227,7 @@ int ei_reg_restore(int fd, ei_reg *reg, const char *mntab) char *dbuf = NULL; char *msgbuf = NULL; char *keybuf = NULL; - erlang_pid self; + erlang_pid *self; erlang_pid mnesia = {"",0,0,0}; erlang_msg msg; int index = 0; @@ -247,20 +247,18 @@ int ei_reg_restore(int fd, ei_reg *reg, const char *mntab) if ((ec = ei_fd_to_cnode(fd)) == NULL) { return -1; } - strcpy(self.node,ei_thisnodename(ec)); - self.num = fd; - self.serial = 0; - self.creation = ei_thiscreation(ec); + + self = ei_self(ec); - if (mn_start_restore(fd,&self,&mnesia,mntab,&count,&maxkey,&maxobj)) { + if (mn_start_restore(fd,self,&mnesia,mntab,&count,&maxkey,&maxobj)) { /* send exit *only* if we have pid */ - if (mnesia.node[0]) ei_send_exit(fd,&self,&mnesia,"bad response from rpc start"); + if (mnesia.node[0]) ei_send_exit(fd,self,&mnesia,"bad response from rpc start"); return -1; } if (count <= 0) { - ei_send_exit(fd,&self,&mnesia,"nothing to do"); + ei_send_exit(fd,self,&mnesia,"nothing to do"); return 0; } @@ -268,7 +266,7 @@ int ei_reg_restore(int fd, ei_reg *reg, const char *mntab) len = maxkey + maxobj + 512; if (len > EISMALLBUF) if (!(dbuf = malloc(len))) { - ei_send_exit(fd,&self,&mnesia,"cannot allocate space for incoming data"); + ei_send_exit(fd,self,&mnesia,"cannot allocate space for incoming data"); return -1; } msgbuf = (dbuf ? dbuf : sbuf); @@ -281,7 +279,7 @@ int ei_reg_restore(int fd, ei_reg *reg, const char *mntab) ei_encode_version(msgbuf,&index); ei_encode_tuple_header(msgbuf,&index,2); ei_encode_atom(msgbuf,&index,"send_records"); - ei_encode_pid(msgbuf,&index,&self); + ei_encode_pid(msgbuf,&index,self); if (ei_send_encoded(fd,&mnesia,msgbuf,index)) goto restore_failure; /* read as much as possible, until count or EXIT */ @@ -317,7 +315,7 @@ int ei_reg_restore(int fd, ei_reg *reg, const char *mntab) return 0; restore_failure: - ei_send_exit(fd,&self,&mnesia,"restore failure"); + ei_send_exit(fd,self,&mnesia,"restore failure"); if (keybuf) free(keybuf); if (dbuf) free(dbuf); return -1; |