File 0324-ic-Optimize-oe_ei_encode_atom.patch of Package erlang

From 1d3acb70debd134c8346b7e98347171d5cf6fc62 Mon Sep 17 00:00:00 2001
From: Sverker Eriksson <sverker@erlang.org>
Date: Mon, 19 Mar 2018 16:03:03 +0100
Subject: [PATCH 1/2] ic: Optimize oe_ei_encode_atom

1. Use ei_encode_atom_len to not repeat strlen(p) twice.

2. Do a dirty over estimation of atom encoding space needed
   to avoid calling ei_encode_atom_len twice.
---
 lib/ic/c_src/oe_ei_encode_atom.c | 43 ++++++++++++++++++++++++----------------
 1 file changed, 26 insertions(+), 17 deletions(-)

diff --git a/lib/ic/c_src/oe_ei_encode_atom.c b/lib/ic/c_src/oe_ei_encode_atom.c
index 758586d1d4..99a9fe26f0 100644
--- a/lib/ic/c_src/oe_ei_encode_atom.c
+++ b/lib/ic/c_src/oe_ei_encode_atom.c
@@ -20,28 +20,37 @@
  */
 #include <ic.h>
 
+#include <string.h>
+
+
+#define DIRTY_ATOM_ENC_MAX(LATIN1_CHARS) ((LATIN1_CHARS)*2 + 3)
+
 
 int oe_ei_encode_atom(CORBA_Environment *ev, const char *p) { 
   int size = ev->_iout;
+  size_t len = strlen(p);
+
+  if (DIRTY_ATOM_ENC_MAX(len) >= ev->_outbufsz) {
+
+      ei_encode_atom_len(0,&size,p,len);
+
+      if (size >= ev->_outbufsz) {
+        char *buf = ev->_outbuf;
+        int bufsz = ev->_outbufsz + ev->_memchunk;
+
+        while (size >= bufsz)
+          bufsz += ev->_memchunk;
+
+        if ((buf = realloc(buf, bufsz)) == NULL) {
+          CORBA_exc_set(ev, CORBA_SYSTEM_EXCEPTION, NO_MEMORY, "End of heap memory while encoding");
+          return -1;  /* OUT OF MEMORY */
+        }
 
-  ei_encode_atom(0,&size,p);
-
-  if (size >= ev->_outbufsz) {
-    char *buf = ev->_outbuf;
-    int bufsz = ev->_outbufsz + ev->_memchunk;
-    
-    while (size >= bufsz)
-      bufsz += ev->_memchunk;
-    
-    if ((buf = realloc(buf, bufsz)) == NULL) {
-      CORBA_exc_set(ev, CORBA_SYSTEM_EXCEPTION, NO_MEMORY, "End of heap memory while encoding");
-      return -1;  /* OUT OF MEMORY */ 
-    }
-
-    ev->_outbuf = buf;
-    ev->_outbufsz = bufsz;
+        ev->_outbuf = buf;
+        ev->_outbufsz = bufsz;
+      }
   }
 
-  return ei_encode_atom(ev->_outbuf,&ev->_iout,p);
+  return ei_encode_atom_len(ev->_outbuf,&ev->_iout,p,len);
 }
 
-- 
2.16.3

openSUSE Build Service is sponsored by