int main (int argc, char ** argv) { pami_client_t client; pami_context_t context; pami_task_t task; size_t size; pami_dispatch_callback_function fn; pami_dispatch_hint_t options; pami_result_t result = PAMI_ERROR; /* ====== INITIALIZE ====== */ result = PAMI_Client_create ("TEST", &client, NULL, 0); if (result != PAMI_SUCCESS) { fprintf (stderr, "Error. Unable to initialize pami client. result = %d\n", result); return 1; } task = client_task (client); size = client_size (client); result = PAMI_Context_createv (client, NULL, 0, &context, 1); if (result != PAMI_SUCCESS) { fprintf (stderr, "Error. Unable to create pami context. result = %d\n", result); return 1; } fn.p2p = dispatch_fn; options.recv_immediate = PAMI_HINT_DEFAULT; result = PAMI_Dispatch_set (context, DISPATCH_ID_DEFAULT_EXPECT_IMMEDIATE, fn, (void *) EXPECT_IMMEDIATE, options); if (result != PAMI_SUCCESS) { fprintf (stderr, "Error. Unable to register DISPATCH_ID_DEFAULT_EXPECT_IMMEDIATE. result = %d\n", result); return 1; } options.recv_immediate = PAMI_HINT_DEFAULT; result = PAMI_Dispatch_set (context, DISPATCH_ID_DEFAULT_EXPECT_ASYNC, fn, (void *) EXPECT_ASYNC, options); if (result != PAMI_SUCCESS) { fprintf (stderr, "Error. Unable to register DISPATCH_ID_DEFAULT_EXPECT_ASYNC. result = %d\n", result); return 1; } options.recv_immediate = PAMI_HINT_ENABLE; result = PAMI_Dispatch_set (context, DISPATCH_ID_ENABLE, fn, (void *) EXPECT_IMMEDIATE, options); if (result != PAMI_SUCCESS) { fprintf (stderr, "Error. Unable to register DISPATCH_ID_ENABLE. result = %d\n", result); return 1; } options.recv_immediate = PAMI_HINT_DISABLE; result = PAMI_Dispatch_set (context, DISPATCH_ID_DISABLE, fn, (void *) EXPECT_ASYNC, options); if (result != PAMI_SUCCESS) { fprintf (stderr, "Error. Unable to register DISPATCH_ID_DISABLE. result = %d\n", result); return 1; } /* ====== START TEST ====== */ __test_errors = 0; __test_recvs = 0; size_t test_count = 0; volatile size_t send_active = 0; pami_send_t parameters; parameters.send.header.iov_base = __junk; parameters.send.header.iov_len = 0; parameters.send.data.iov_base = __junk; parameters.send.data.iov_len = 0; parameters.send.dispatch = 0; parameters.events.cookie = (void *) & send_active; parameters.events.local_fn = decrement; parameters.events.remote_fn = NULL; result = PAMI_Endpoint_create (client, 0, 0, ¶meters.send.dest); if (result != PAMI_SUCCESS) { fprintf (stderr, "Error: PAMI_Endpoint_create() failed for task 0, context 0 with %d.\n", result); return 1; } /* =================================================================== * 'recv_immediate' default * * (header+data) > recv_immediate_max MUST be an asynchronous receive * * A zero-byte send will \b always result in an immediate receive. * \see pami_dispatch_p2p_function * * Data sizes to test: * - recv_immediate_max + 1 * - 0 */ parameters.send.data.iov_len = recv_immediate_max (context, DISPATCH_ID_DEFAULT_EXPECT_ASYNC) + 1; parameters.send.dispatch = DISPATCH_ID_DEFAULT_EXPECT_ASYNC; test_count++; if (task == 1) { send_active++; result = PAMI_Send (context, ¶meters); if (result != PAMI_SUCCESS) { fprintf (stderr, "Error: Unable to send to 0x%08x using dispatch %zu with %d.\n", parameters.send.dest, parameters.send.dispatch, result); return 1; } } parameters.send.data.iov_len = 0; parameters.send.dispatch = DISPATCH_ID_DEFAULT_EXPECT_IMMEDIATE; test_count++; if (task == 1) { send_active++; result = PAMI_Send (context, ¶meters); if (result != PAMI_SUCCESS) { fprintf (stderr, "Error: Unable to send to 0x%08x using dispatch %zu with %d.\n", parameters.send.dest, parameters.send.dispatch, result); return 1; } } /* =================================================================== * 'recv_immediate' enabled * * All receives are 'immediate'. (header+data) > recv_immediate_max is * invalid, but may not neccesarily return an error. * * Data sizes to test: * - 0 * - recv_immediate_max * - recv_immediate_max + 1 ...... ? */ parameters.send.data.iov_len = 0; parameters.send.dispatch = DISPATCH_ID_ENABLE; test_count++; if (task == 1) { send_active++; result = PAMI_Send (context, ¶meters); if (result != PAMI_SUCCESS) { fprintf (stderr, "Error: Unable to send to 0x%08x using dispatch %zu with %d.\n", parameters.send.dest, parameters.send.dispatch, result); return 1; } } parameters.send.data.iov_len = recv_immediate_max (context, DISPATCH_ID_DEFAULT_EXPECT_ASYNC); parameters.send.dispatch = DISPATCH_ID_ENABLE; test_count++; if (task == 1) { send_active++; result = PAMI_Send (context, ¶meters); if (result != PAMI_SUCCESS) { fprintf (stderr, "Error: Unable to send to 0x%08x using dispatch %zu with %d.\n", parameters.send.dest, parameters.send.dispatch, result); return 1; } } #if 0 parameters.send.data.iov_len = recv_immediate_max (context, DISPATCH_ID_DEFAULT_EXPECT_ASYNC) + 1; parameters.send.dispatch = DISPATCH_ID_ENABLE; test_count++; if (task == 1) { send_active++; result = PAMI_Send (context, ¶meters); if (result != PAMI_SUCCESS) { fprintf (stderr, "Error: Unable to send to 0x%08x using dispatch %d with %d.\n", parameters.send.dest, parameters.send.dispatch, result); return 1; } } #endif /* =================================================================== * 'recv_immediate' disabled * * All receives are NOT 'immediate' - even "zero byte data" * * Data sizes to test: * - 0 * - recv_immediate_max * - recv_immediate_max + 1 */ parameters.send.data.iov_len = 0; parameters.send.dispatch = DISPATCH_ID_DISABLE; test_count++; if (task == 1) { send_active++; result = PAMI_Send (context, ¶meters); if (result != PAMI_SUCCESS) { fprintf (stderr, "Error: Unable to send to 0x%08x using dispatch %zu with %d.\n", parameters.send.dest, parameters.send.dispatch, result); return 1; } } parameters.send.data.iov_len = recv_immediate_max (context, DISPATCH_ID_DEFAULT_EXPECT_ASYNC); parameters.send.dispatch = DISPATCH_ID_DISABLE; test_count++; if (task == 1) { send_active++; result = PAMI_Send (context, ¶meters); if (result != PAMI_SUCCESS) { fprintf (stderr, "Error: Unable to send to 0x%08x using dispatch %zu with %d.\n", parameters.send.dest, parameters.send.dispatch, result); return 1; } } parameters.send.data.iov_len = recv_immediate_max (context, DISPATCH_ID_DEFAULT_EXPECT_ASYNC) + 1; parameters.send.dispatch = DISPATCH_ID_DISABLE; test_count++; if (task == 1) { send_active++; result = PAMI_Send (context, ¶meters); if (result != PAMI_SUCCESS) { fprintf (stderr, "Error: Unable to send to 0x%08x using dispatch %zu with %d.\n", parameters.send.dest, parameters.send.dispatch, result); return 1; } } /* ====== WAIT FOR COMMUNICATION COMPLETION ====== */ if (task == 0) { while (__test_recvs < test_count) PAMI_Context_advance (context, 1000); } else if (task == 1) { while (send_active) PAMI_Context_advance (context, 1000); } /* ====== CLEANUP ====== */ result = PAMI_Context_destroyv (&context, 1); if (result != PAMI_SUCCESS) { fprintf (stderr, "Error. Unable to destroy context, result = %d\n", result); return 1; } result = PAMI_Client_destroy (&client); if (result != PAMI_SUCCESS) { fprintf (stderr, "Error. Unable to destroy pami client. result = %d\n", result); return 1; } /* ====== REPORT ERRORS ====== */ if (__test_errors > 0) { fprintf (stderr, "Error. Non-compliant PAMI receive immediate implementation! error count = %zu\n", __test_errors); return 1; } return 0; }
void sim_area_widget::paint_world(wxPaintEvent&) { const model& app_model = (dynamic_cast<biosim_gui_impl&>(*GetParent())).app_model(); const world_map& map = app_model.map(); wxBufferedPaintDC dc(this); dc.SetBackground(wxBrush(wxColor(0,0,0))); dc.Clear(); wxSize client_size(GetClientSize()); int scroll_pixel_x = scroll_x_ % tile_size_x; int scroll_pixel_y = scroll_y_ % tile_size_y; int tile_x_start = (scroll_x_ - scroll_pixel_x) / tile_size_x; int tile_y_start = (scroll_y_ - scroll_pixel_y) / tile_size_y; int tile_x_end = (scroll_x_ + client_size.GetX() - scroll_pixel_x) / tile_size_x + 1; int tile_y_end = (scroll_y_ + client_size.GetY() - scroll_pixel_y) / tile_size_y + 1; for (int y = tile_y_start; y <= tile_y_end; ++y) for (int x = tile_x_start; x <= tile_x_end; ++x) { if (x < 0 || y < 0 || x >= map.size_x() || y >= map.size_y()) continue; int tilepos_x = (x - tile_x_start) * tile_size_x - scroll_pixel_x; int tilepos_y = (y - tile_y_start) * tile_size_y - scroll_pixel_y; dc.DrawBitmap(env_bitmaps_[map.at(x, y).climate()], tilepos_x, tilepos_y); if (x == app_model.cursor_x() && y == app_model.cursor_y()) { dc.DrawBitmap(cursor_bitmap_, tilepos_x, tilepos_y); } const world_tile& tile = map.at(x, y); for (world_tile::creature_iterator it(tile.begin()); it != tile.end(); ++it) { if((*it)->is_alive()) { const creature_prototype *prototype = &((*it)->prototype); std::map<const creature_prototype*, wxBitmap>::iterator find_graphics (creature_bitmaps_.find(prototype)); if (find_graphics == creature_bitmaps_.end()) { find_graphics = creature_bitmaps_.insert (std::pair<const creature_prototype*, wxBitmap> (prototype, convert_to_bitmap(prototype->graphics()))).first; } dc.DrawBitmap(find_graphics->second, tilepos_x, tilepos_y); } else dc.DrawBitmap(dead_bitmap_, tilepos_x, tilepos_y); } } }