summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2014-01-29 18:56:46 +0000
committerDamien George <damien.p.george@gmail.com>2014-01-29 18:56:46 +0000
commit4d5b28cd0886a565b69f035bb8b3713050636cac (patch)
treef50734b889ff2b341abffeadd59edc6a91ffbafd
parent217814cc63f2054833a87d2dd903a9cbe476e55a (diff)
downloadmicropython-4d5b28cd0886a565b69f035bb8b3713050636cac.tar.gz
micropython-4d5b28cd0886a565b69f035bb8b3713050636cac.zip
Add qstr_info() function and bindings for unix port.
-rw-r--r--py/qstr.c16
-rw-r--r--py/qstr.h2
-rw-r--r--unix/main.c14
3 files changed, 32 insertions, 0 deletions
diff --git a/py/qstr.c b/py/qstr.c
index f12cbceff6..f9f927f583 100644
--- a/py/qstr.c
+++ b/py/qstr.c
@@ -185,3 +185,19 @@ const byte *qstr_data(qstr q, uint *len) {
*len = Q_GET_LENGTH(qd);
return Q_GET_DATA(qd);
}
+
+void qstr_pool_info(uint *n_pool, uint *n_qstr, uint *n_str_data_bytes, uint *n_total_bytes) {
+ *n_pool = 0;
+ *n_qstr = 0;
+ *n_str_data_bytes = 0;
+ *n_total_bytes = 0;
+ for (qstr_pool_t *pool = last_pool; pool != NULL && pool != &const_pool; pool = pool->prev) {
+ *n_pool += 1;
+ *n_qstr += pool->len;
+ for (const byte **q = pool->qstrs, **q_top = pool->qstrs + pool->len; q < q_top; q++) {
+ *n_str_data_bytes += Q_GET_ALLOC(*q);
+ }
+ *n_total_bytes += sizeof(qstr_pool_t) + sizeof(qstr) * pool->alloc;
+ }
+ *n_total_bytes += *n_str_data_bytes;
+}
diff --git a/py/qstr.h b/py/qstr.h
index 9224d48a19..779ebcb4a9 100644
--- a/py/qstr.h
+++ b/py/qstr.h
@@ -36,3 +36,5 @@ machine_uint_t qstr_hash(qstr q);
const char* qstr_str(qstr q);
uint qstr_len(qstr q);
const byte* qstr_data(qstr q, uint *len);
+
+void qstr_pool_info(uint *n_pool, uint *n_qstr, uint *n_str_data_bytes, uint *n_total_bytes);
diff --git a/unix/main.c b/unix/main.c
index 69bac044f7..cd45e3be86 100644
--- a/unix/main.c
+++ b/unix/main.c
@@ -216,6 +216,18 @@ int usage(void) {
return 1;
}
+mp_obj_t mem_info(void) {
+ printf("mem: total=%d, current=%d, peak=%d\n", m_get_total_bytes_allocated(), m_get_current_bytes_allocated(), m_get_peak_bytes_allocated());
+ return mp_const_none;
+}
+
+mp_obj_t qstr_info(void) {
+ uint n_pool, n_qstr, n_str_data_bytes, n_total_bytes;
+ qstr_pool_info(&n_pool, &n_qstr, &n_str_data_bytes, &n_total_bytes);
+ printf("qstr pool: n_pool=%u, n_qstr=%u, n_str_data_bytes=%u, n_total_bytes=%u\n", n_pool, n_qstr, n_str_data_bytes, n_total_bytes);
+ return mp_const_none;
+}
+
int main(int argc, char **argv) {
qstr_init();
rt_init();
@@ -225,6 +237,8 @@ int main(int argc, char **argv) {
rt_store_attr(m_sys, MP_QSTR_argv, py_argv);
rt_store_name(qstr_from_str("test"), test_obj_new(42));
+ rt_store_name(qstr_from_str("mem_info"), rt_make_function_n(0, mem_info));
+ rt_store_name(qstr_from_str("qstr_info"), rt_make_function_n(0, qstr_info));
file_init();
rawsocket_init();