this repo has no description
at fixPythonPipStalling 95 lines 3.0 kB view raw
1/* 2 * Copyright (c) 2011 Joakim Johansson <jocke@tbricks.com>. 3 * 4 * @APPLE_APACHE_LICENSE_HEADER_START@ 5 * 6 * Licensed under the Apache License, Version 2.0 (the "License"); 7 * you may not use this file except in compliance with the License. 8 * You may obtain a copy of the License at 9 * 10 * http://www.apache.org/licenses/LICENSE-2.0 11 * 12 * Unless required by applicable law or agreed to in writing, software 13 * distributed under the License is distributed on an "AS IS" BASIS, 14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 * See the License for the specific language governing permissions and 16 * limitations under the License. 17 * 18 * @APPLE_APACHE_LICENSE_HEADER_END@ 19 */ 20 21#include "pthread_workqueue.h" 22 23#ifdef _WIN32 24# include "../../src/windows/platform.h" 25#endif 26 27// Run settings 28#define SECONDS_TO_RUN 10 29#define WORKQUEUE_COUNT 3 30#define GENERATOR_WORKQUEUE_COUNT 1 31#define SLEEP_BEFORE_START 0 32#define FORCE_BUSY_LOOP 0 33#define LATENCY_RUN_GENERATOR_IN_MAIN_THREAD 0 34 35// Data rates 36#define EVENTS_GENERATED_PER_TICK 100 // simulate some small bursting 37#define EVENT_GENERATION_FREQUENCY 100 // events/s base rate, need to use busy loop = 1 if > 100Hz due to nanosleep resolution 38 39#define AGGREGATE_DATA_RATE_PER_SECOND (EVENT_GENERATION_FREQUENCY * EVENTS_GENERATED_PER_TICK) 40#define EVENTS_TO_GENERATE (SECONDS_TO_RUN * AGGREGATE_DATA_RATE_PER_SECOND) 41#define TOTAL_DATA_PER_SECOND (AGGREGATE_DATA_RATE_PER_SECOND*GENERATOR_WORKQUEUE_COUNT) 42#define TOTAL_TICKS_TO_RUN (SECONDS_TO_RUN * EVENT_GENERATION_FREQUENCY) 43 44#define NANOSECONDS_PER_SECOND 1000000000 45#define DISTRIBUTION_BUCKETS 20 // 1us per bucket 46#define EVENT_TIME_SLICE (NANOSECONDS_PER_SECOND / EVENT_GENERATION_FREQUENCY) 47#define SYSTEM_CLOCK_RESOLUTION 100 48 49#ifdef _WIN32 50typedef unsigned long long mytime_t; 51#else 52typedef unsigned long mytime_t; 53#endif 54 55struct wq_event 56{ 57 unsigned int queue_index; 58 mytime_t start_time; 59}; 60 61struct wq_statistics 62{ 63 mytime_t min; 64 mytime_t max; 65 double avg; 66 mytime_t total; 67 unsigned int count; 68 unsigned int count_over_threshold; 69 unsigned int distribution[DISTRIBUTION_BUCKETS]; 70}; 71 72// We create our own separate workqueues for event generation 73struct wq_event_generator 74{ 75 pthread_workqueue_t wq; 76 struct wq_event *wq_events; 77}; 78 79#ifdef __sun 80# include <atomic.h> 81# define atomic_inc atomic_inc_32 82# define atomic_dec atomic_dec_32 83# define atomic_inc_nv atomic_inc_32_nv 84# define atomic_dec_nv atomic_dec_32_nv 85#elif defined(_WIN32) 86# define atomic_inc(p) (void) InterlockedIncrement((p)) 87# define atomic_dec(p) (void) InterlockedDecrement((p)) 88# define atomic_inc_nv(p) InterlockedIncrement((p)) 89# define atomic_dec_nv(p) InterlockedDecrement((p)) 90#else 91# define atomic_inc(p) (void) __sync_add_and_fetch((p), 1) 92# define atomic_dec(p) (void) __sync_sub_and_fetch((p), 1) 93# define atomic_inc_nv(p) __sync_add_and_fetch((p), 1) 94# define atomic_dec_nv(p) __sync_sub_and_fetch((p), 1) 95#endif