The ACMS Runtime, Rebuilt for Modern Systems


ACMS shouldn't be the reason you stay on OpenVMS.
For thirty years, ACMS has been the transaction-processing backbone of business-critical OpenVMS applications. Migrating off OpenVMS has always meant rewriting the ACMS layer from scratch — re-implementing task orchestration, workspace passing, server lifecycle, and the forms-driven user interface in something entirely different. Months of work, indefinite risk.
The old answer
Hand-port every TDF into a custom service. Rewrite COBOL step procedures as web handlers. Re-think workspace semantics. Bind to a new persistence layer. Re-test under load. Retrain operators.
Typical timeline: 12–36 months per application. Typical failure mode: the new code never matches the old behaviour.
The VX/ACMS answer
A native Linux runtime that is ACMS as far as your source code can tell.
The same TDFs compile. The same server procedures load. The same workspace passes by
reference. The same ACMS$ services resolve.
Effort shifts from port to recompile.
Three boundaries. Unchanged for your code.
Your migrated VMS applications meet VX/ACMS at three contracts. Each one is specified in the VSI ACMS manuals; each one is honoured by VX/ACMS on Linux exactly as your source expects.
TDL — Task Definition Language
Your .TDF, .GDF, and .ADF files compile through
the ADU unchanged. Task structure, workspace declarations, EXCHANGE / PROCESSING / ATOMIC
steps, exception handlers — all of it.
ACMS$ Services — System Interface
ACMS$CALL, ACMS$SIGN_IN, ACMS$START_CALL,
ACMS$RAISE_STEP_EXCEPTION — the services your code links against. Same
signatures, same status codes, same semantics.
FORMS$ — DECforms Callable API
VX/ACMS binds to VSI's DECforms runtime (also available on Linux). EXCHANGE steps
marshal workspace records into FORMS$ records and pump events through
FORMS$TRANSCEIVE exactly as on VMS.
| What you have | VX/ACMS support |
|---|---|
Task Definition Files (.TDF) | Compiles unchanged — including DCL prelude,
SET DEFAULT, workspace WITH ACCESS, TASK ARGUMENTS,
IF / WHILE / REPEAT / GOTO / ATOMIC. |
Group Definition Files (.GDF) | Compiles unchanged — SERVER blocks, PROCEDURE SERVER IMAGE, INITIALIZATION / TERMINATION / CANCEL PROCEDURE, dictionary-qualified workspace refs. |
Application Definition Files (.ADF) | Compiles unchanged. |
Menu Definition Files (.MDF) | Coming v1 — menu rendering arrives with the CP integration. |
| CDD record definitions | Authoritative source via the CDD$ callable
API; layouts feed both ADU and the COBOL compiler. |
| COBOL step procedures | VMS-shape signature preserved — PROCEDURE DIVISION USING,
workspaces by reference, status via RETURN-CODE. |
| C / C++ step procedures | Native — same signature
unsigned int NAME(WKSP *a, WKSP *b); status via return value. |
System workspaces (ACMS$SELECTION_STRING, etc.) | Implemented. |
| DECforms (FORMS$ API) | CP integration in flight — links VSI's Linux libvxdf*. |
| Queued tasks (QTI) | v1 — surface + drain. |
| Distributed transactions (DDTM) | v1 — SQLite-backed single-resource bracket; DDTM shape preserved for v2. |
| ACMSDI / TPware (Windows desktop) | v2 — deferred per scope. |
| Distributed multi-node clustering | v2 — single-server is the v1 scope. |
| TDMS forms | Out of scope — migrate to DECforms. |
Faithful to ACMS. Native on Linux.
Every ACMS component you know is here. Where VMS used P0 mappings and global sections, we use POSIX shared memory. Where VMS used DECnet, we use UNIX-domain sockets. The shapes match the VMS manuals; the substrate is modern Linux.
TASK ARGUMENTS
copy boundaries cross the submitter-EXC split.
Your TDFs become native C++.
The Application Definition Utility parses your TDF, GDF, ADF, and MDF sources, resolves
workspace records through the published CDD$ callable API, and emits clean C++ —
one construct per TDL construct. The C++ is compiled and linked into a deployable
.so per task and per server. No bytecode interpreter sits between your source
and the CPU.
TDF source in
! funds_transfer.tdf REPLACE TASK FUNDS_TRANSFER WORKSPACES ARE ACCOUNT_WKSP, TRANSFER_WKSP, AUDIT_WKSP; TASK ARGUMENTS ARE ACCOUNT_WKSP WITH ACCESS MODIFY, AUDIT_WKSP WITH ACCESS WRITE; BLOCK EXCEPTION HANDLER MOVE "FAILED" TO AUDIT_WKSP.MSG; PROCESSING CALL LOG_AUDIT USING AUDIT_WKSP; EXIT TASK; PROCESSING CALL READ_ACCOUNT USING ACCOUNT_WKSP; IF ACCOUNT_WKSP.BALANCE < TRANSFER_WKSP.AMOUNT THEN MOVE "NSF" TO AUDIT_WKSP.MSG; EXIT TASK; END IF; PROCESSING CALL DEBIT_ACCOUNT USING ACCOUNT_WKSP, TRANSFER_WKSP; END BLOCK; END DEFINITION;
Native C++ .so out
/* Generated by adu_compile */ extern "C" acms_status_t task_FUNDS_TRANSFER_run(exc_ctx_t *e, acms_runtime *rt, exc_workspace_t *ws, uint32_t n_ws) { try { try { { const char *args[] = {"ACCOUNT_WKSP"}; auto rc = acms_rt_dispatch(e, rt, "READ_ACCOUNT", ws, n_ws, args, 1); if (rc != ACMS_NORMAL) throw acms_rt_exception{rc}; } if (acms_rt_field_i32(ws, n_ws, "ACCOUNT_WKSP", "BALANCE") < acms_rt_field_i32(ws, n_ws, "TRANSFER_WKSP", "AMOUNT")) { acms_rt_move_str(ws, n_ws, "AUDIT_WKSP", "MSG", "NSF"); return ACMS_NORMAL; /* EXIT TASK */ } /* DEBIT_ACCOUNT … */ } catch (acms_rt_exception &) { /* EXCEPTION HANDLER */ acms_rt_move_str(ws, n_ws, "AUDIT_WKSP", "MSG", "FAILED"); return ACMS_NORMAL; } } catch (acms_rt_exception &x) { return x.status; } return ACMS_NORMAL; }
git diff tells you exactly what an ADU
version bump changed. Debuggers and profilers see function names that match your TDF identifiers.
What's live. What's coming.
VX/ACMS v1 targets the full single-server deployment model used by the overwhelming majority of production ACMS estates. Verified against large customer applications including multi-million-line COBOL codebases.
ADU Compiler live
Full TDF / GDF / ADF parser and C++ emitter. MDF support arriving with CP. CDD integration
via vxcdd and the published CDD$ callable API.
- TDF: all task constructs (BLOCK, IF, WHILE, REPEAT, GOTO, ATOMIC, MOVE, GET MESSAGE)
- GDF: SERVER blocks, procedure server image, init/term/cancel procs
- ADF: application definitions
Runtime Core live
EXC task interpreter, SP procedure server, workspace shared memory, IPC (CBOR over UNIX-domain sockets), ATOMIC SQLite bracket, EXCHANGE step machinery.
- acmsd / EXC / SP / ATL / SWL
- POSIX shm workspaces (zero-copy)
- 12 ACMS$ services implemented
FORMS$ / CP v1 soon
Per-submitter CP process with DECforms integration via VSI's Linux libvxdf*.
Completes the EXCHANGE step pathway for terminal-I/O-driven applications.
- Menu rendering (MDF)
FORMS$TRANSCEIVE/FORMS$RECEIVE- DECforms record marshalling
QTI / Queued Tasks v1 soon
SQLite-backed task queue with QTI drain process. Queued task surface API live; drain-to-EXC dispatch arriving in the next release.
Clustering / DDTM v2
Multi-node ACMS and true distributed transaction management (DDTM/XA) are scoped for v2. The v1 ATOMIC bracket preserves the DDTM interface shape so application code needs no changes at upgrade.
ACMSDI Gateway v2
The Windows desktop TPware interface (ACMSDI) and the HTTP/JSON management API are v2 scope items. Contact us if these are blockers for your migration timeline.
Frequently Asked Questions
Curious about how Sector7 can facilitate your application migration? Explore our FAQs for expert insights.
Transform Your Legacy Software Today!
