/* ////////////////////////////////////////////////////////////////////////////////////// * main */ tb_int_t tb_demo_coroutine_file_client_main(tb_int_t argc, tb_char_t** argv) { // check tb_assert_and_check_return_val(argc == 2 && argv[1], -1); // the coroutines count tb_size_t count = tb_atoi(argv[1]); // init scheduler tb_co_scheduler_ref_t scheduler = tb_co_scheduler_init(); if (scheduler) { // start file tb_size_t i = 0; for (i = 0; i < count; i++) { // start it tb_coroutine_start(scheduler, tb_demo_coroutine_pull, tb_null, 0); } // run scheduler tb_co_scheduler_loop(scheduler, tb_true); // exit scheduler tb_co_scheduler_exit(scheduler); } // end return 0; }
/* ////////////////////////////////////////////////////////////////////////////////////// * implementation */ static tb_object_ref_t tb_object_xplist_reader_func_date(tb_object_xplist_reader_t* reader, tb_size_t event) { // check tb_assert_and_check_return_val(reader && reader->reader && event, tb_null); // empty? if (event == TB_XML_READER_EVENT_ELEMENT_EMPTY) return tb_object_date_init_from_time(0); // done tb_bool_t leave = tb_false; tb_object_ref_t date = tb_null; while (!leave && (event = tb_xml_reader_next(reader->reader))) { switch (event) { case TB_XML_READER_EVENT_ELEMENT_END: { // name tb_char_t const* name = tb_xml_reader_element(reader->reader); tb_assert_and_check_break_state(name, leave, tb_true); // is end? if (!tb_stricmp(name, "date")) { // empty? if (!date) date = tb_object_date_init_from_time(0); // leave it leave = tb_true; } } break; case TB_XML_READER_EVENT_TEXT: { // text tb_char_t const* text = tb_xml_reader_text(reader->reader); tb_assert_and_check_break_state(text, leave, tb_true); tb_trace_d("date: %s", text); // done date: %04ld-%02ld-%02ld %02ld:%02ld:%02ld tb_tm_t tm = {0}; tb_char_t const* p = text; tb_char_t const* e = text + tb_strlen(text); // init year while (p < e && *p && !tb_isdigit(*p)) p++; tb_assert_and_check_break_state(p < e, leave, tb_true); tm.year = tb_atoi(p); // init month while (p < e && *p && tb_isdigit(*p)) p++; while (p < e && *p && !tb_isdigit(*p)) p++; tb_assert_and_check_break_state(p < e, leave, tb_true); tm.month = tb_atoi(p); // init day while (p < e && *p && tb_isdigit(*p)) p++; while (p < e && *p && !tb_isdigit(*p)) p++; tb_assert_and_check_break_state(p < e, leave, tb_true); tm.mday = tb_atoi(p); // init hour while (p < e && *p && tb_isdigit(*p)) p++; while (p < e && *p && !tb_isdigit(*p)) p++; tb_assert_and_check_break_state(p < e, leave, tb_true); tm.hour = tb_atoi(p); // init minute while (p < e && *p && tb_isdigit(*p)) p++; while (p < e && *p && !tb_isdigit(*p)) p++; tb_assert_and_check_break_state(p < e, leave, tb_true); tm.minute = tb_atoi(p); // init second while (p < e && *p && tb_isdigit(*p)) p++; while (p < e && *p && !tb_isdigit(*p)) p++; tb_assert_and_check_break_state(p < e, leave, tb_true); tm.second = tb_atoi(p); // time tb_time_t time = tb_mktime(&tm); tb_assert_and_check_break_state(time >= 0, leave, tb_true); // date date = tb_object_date_init_from_time(time); } break; default: break; } } // ok? return date; }
tb_object_ref_t tb_object_seek(tb_object_ref_t object, tb_char_t const* path, tb_size_t type) { // check tb_assert_and_check_return_val(object, tb_null); // null? tb_check_return_val(path, object); // walk tb_char_t const* p = path; tb_char_t const* e = path + tb_strlen(path); while (p < e && object) { // done seek switch (*p) { case '.': { // check tb_assert_and_check_return_val(tb_object_type(object) == TB_OBJECT_TYPE_DICTIONARY, tb_null); // skip p++; // read the key name tb_char_t key[4096] = {0}; tb_char_t* kb = key; tb_char_t* ke = key + 4095; for (; p < e && kb < ke && *p && (*p != '.' && *p != '[' && *p != ']'); p++, kb++) { if (*p == '\\') p++; *kb = *p; } // trace tb_trace_d("key: %s", key); // the value object = tb_object_dictionary_val(object, key); } break; case '[': { // check tb_assert_and_check_return_val(tb_object_type(object) == TB_OBJECT_TYPE_ARRAY, tb_null); // skip p++; // read the item index tb_char_t index[32] = {0}; tb_char_t* ib = index; tb_char_t* ie = index + 31; for (; p < e && ib < ie && *p && tb_isdigit10(*p); p++, ib++) *ib = *p; // trace tb_trace_d("index: %s", index); // check tb_size_t i = tb_atoi(index); tb_assert_and_check_return_val(i < tb_object_array_size(object), tb_null); // the value object = tb_object_array_item(object, i); } break; case ']': default: p++; break; } } // check it, if not none if (object && type != TB_OBJECT_TYPE_NONE) { // is this type? if (tb_object_type(object) != type) return tb_null; } // ok? return object; }
tb_object_ref_t tb_object_seek(tb_object_ref_t object, tb_char_t const* path, tb_bool_t bmacro) { // check tb_assert_and_check_return_val(object, tb_null); // null? tb_check_return_val(path, object); // done tb_object_ref_t root = object; tb_char_t const* p = path; tb_char_t const* e = path + tb_strlen(path); while (p < e && object) { // done seek switch (*p) { case '.': { // check tb_assert_and_check_return_val(tb_object_type(object) == TB_OBJECT_TYPE_DICTIONARY, tb_null); // skip p++; // read the key name tb_char_t key[4096] = {0}; tb_char_t* kb = key; tb_char_t* ke = key + 4095; for (; p < e && kb < ke && *p && (*p != '.' && *p != '[' && *p != ']'); p++, kb++) { if (*p == '\\') p++; *kb = *p; } // trace tb_trace_d("key: %s", key); // the value object = tb_object_dictionary_value(object, key); } break; case '[': { // check tb_assert_and_check_return_val(tb_object_type(object) == TB_OBJECT_TYPE_ARRAY, tb_null); // skip p++; // read the item index tb_char_t index[32] = {0}; tb_char_t* ib = index; tb_char_t* ie = index + 31; for (; p < e && ib < ie && *p && tb_isdigit10(*p); p++, ib++) *ib = *p; // trace tb_trace_d("index: %s", index); // check tb_size_t i = tb_atoi(index); tb_assert_and_check_return_val(i < tb_object_array_size(object), tb_null); // the value object = tb_object_array_item(object, i); } break; case ']': default: p++; break; } // is macro? done it if be enabled if ( object && bmacro && tb_object_type(object) == TB_OBJECT_TYPE_STRING && tb_object_string_size(object) && tb_object_string_cstr(object)[0] == '$') { // the next path path = tb_object_string_cstr(object) + 1; // continue to seek it object = tb_object_seek(root, path, bmacro); } } // ok? return object; }
static pid_t it_pid(tb_char_t const* name) { // check tb_assert_and_check_return_val(name, 0); // is pid? tb_size_t pid = tb_atoi(name); if (pid) return pid; // init struct kinfo_proc* p = tb_null; struct kinfo_proc* q = tb_null; tb_int_t mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_ALL, 0}; tb_size_t miblen = 4; tb_size_t size = 0; tb_long_t ok = sysctl(mib, miblen, tb_null, &size, tb_null, 0); // walk do { // grow size += size / 10; q = tb_ralloc(p, size); // no memory? if (!q) { if (p) tb_free(p); return 0; } // list p = q; ok = sysctl(mib, miblen, p, &size, tb_null, 0); } while (ok == -1 && errno == ENOMEM); // ok? if (ok == 0) { if (!(size % sizeof(struct kinfo_proc))) { tb_size_t i = 0; tb_size_t n = size / sizeof(struct kinfo_proc); // try accurate name for (i = 0; i < n; i++) { if (!tb_stricmp(p[i].kp_proc.p_comm, name)) { tb_trace_i("name: %s, pid: %u", p[i].kp_proc.p_comm, p[i].kp_proc.p_pid); pid = p[i].kp_proc.p_pid; break; } } // try other name if (!pid) { for (i = 0; i < n; i++) { if (!tb_strnicmp(p[i].kp_proc.p_comm, name, tb_strlen(name))) { tb_trace_i("name: %s, pid: %u", p[i].kp_proc.p_comm, p[i].kp_proc.p_pid); pid = p[i].kp_proc.p_pid; break; } } } } } // free if (p) tb_free(p); // ok return pid; }
/* ////////////////////////////////////////////////////////////////////////////////////// * main */ tb_int_t tb_demo_stream_async_transfer_main(tb_int_t argc, tb_char_t** argv) { // done tb_async_transfer_ref_t transfer = tb_null; do { // init transfer transfer = tb_async_transfer_init(tb_null, tb_true); tb_assert_and_check_break(transfer); // init transfer stream if (!tb_async_transfer_init_istream_from_url(transfer, argv[1])) break; if (!tb_async_transfer_init_ostream_from_url(transfer, argv[2])) break; // limit rate tb_async_transfer_limitrate(transfer, argv[3]? tb_atoi(argv[3]) : 0); // trace tb_trace_i("done: .."); // open and done transfer if (!tb_async_transfer_open_done(transfer, 0, tb_demo_transfer_done_func, tb_null)) break; // wait getchar(); // trace tb_trace_i("pause: .."); // pause transfer tb_async_transfer_pause(transfer); // wait getchar(); // trace tb_trace_i("resume: .."); // resume transfer if (!tb_async_transfer_resume(transfer)) break; // wait getchar(); // trace tb_trace_i("done: .."); // open and done transfer if (!tb_async_transfer_open_done(transfer, 0, tb_demo_transfer_done_func, tb_null)) break; // wait getchar(); } while (0); // trace tb_trace_i("exit: .."); // exit transfer if (transfer) tb_async_transfer_exit(transfer); transfer = tb_null; return 0; }