aboutsummaryrefslogtreecommitdiffstats
path: root/erts/emulator/beam
diff options
context:
space:
mode:
authorPatrik Nyblom <[email protected]>2013-08-23 17:19:03 +0200
committerPatrik Nyblom <[email protected]>2013-08-23 17:19:03 +0200
commit076dff38d5aa6fd303b5c2a3aa809115c0545164 (patch)
treec51d17da4e41d64eddb42a4918a3f9d2b5967ded /erts/emulator/beam
parentfa5cc308af8c073832cc7b58dd52fa2f523582cc (diff)
parent6d1f1d43aa0a9e0a2cb275ef760339c49518fc69 (diff)
downloadotp-076dff38d5aa6fd303b5c2a3aa809115c0545164.tar.gz
otp-076dff38d5aa6fd303b5c2a3aa809115c0545164.tar.bz2
otp-076dff38d5aa6fd303b5c2a3aa809115c0545164.zip
Merge branch 'pan/bad_async_thread_distribution/OTP-11243' into maint
* pan/bad_async_thread_distribution/OTP-11243: Create better distribution of files over async threads Initialize errno properly in win32 efile_may_openfile Add debug functionality to retrieve async key OTP-11243 OTP-11265
Diffstat (limited to 'erts/emulator/beam')
-rw-r--r--erts/emulator/beam/erl_async.c14
-rw-r--r--erts/emulator/beam/erl_driver.h4
2 files changed, 17 insertions, 1 deletions
diff --git a/erts/emulator/beam/erl_async.c b/erts/emulator/beam/erl_async.c
index 054d1a48f6..e6d72f569b 100644
--- a/erts/emulator/beam/erl_async.c
+++ b/erts/emulator/beam/erl_async.c
@@ -583,6 +583,20 @@ int erts_async_ready_clean(void *varq, void *val)
#endif
/*
+** Generate a fair async key prom an ErlDrvPort
+** The port data gives a fair distribution grom port pointer
+** to unsigned integer - to be used in key for driver_async below.
+*/
+unsigned int driver_async_port_key(ErlDrvPort port)
+{
+ ErlDrvTermData td = driver_mk_port(port);
+ if (td == (ErlDrvTermData) NIL) {
+ return 0;
+ }
+ return (unsigned int) (UWord) internal_port_data(td);
+}
+
+/*
** Schedule async_invoke on a worker thread
** NOTE will be syncrounous when threads are unsupported
** return values:
diff --git a/erts/emulator/beam/erl_driver.h b/erts/emulator/beam/erl_driver.h
index e280563de1..1ab6e17f56 100644
--- a/erts/emulator/beam/erl_driver.h
+++ b/erts/emulator/beam/erl_driver.h
@@ -133,7 +133,7 @@ typedef struct {
#define ERL_DRV_EXTENDED_MARKER (0xfeeeeeed)
#define ERL_DRV_EXTENDED_MAJOR_VERSION 2
-#define ERL_DRV_EXTENDED_MINOR_VERSION 1
+#define ERL_DRV_EXTENDED_MINOR_VERSION 2
/*
* The emulator will refuse to load a driver with different major
@@ -638,6 +638,8 @@ EXTERN int erl_drv_send_term(ErlDrvTermData port,
int len);
/* Async IO functions */
+EXTERN unsigned int driver_async_port_key(ErlDrvPort port);
+
EXTERN long driver_async(ErlDrvPort ix,
unsigned int* key,
void (*async_invoke)(void*),